Redis - 全局ID生成器 RedisIdWorker
文章目录
- Redis - 全局ID生成器 RedisIdWorker
- 一、引言
- 二、实现原理
- 三、代码实现
- 代码说明
- 四、使用示例
- 示例说明
- 五、总结
Redis - 全局ID生成器 RedisIdWorker
一、引言
在分布式系统中,生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出现冲突,而UUID虽然可以保证唯一性,但长度较长且不够紧凑。RedisIdWorker是一种基于Redis实现的全局ID生成器,它结合了时间戳和自增序列号,能够在分布式环境中高效地生成唯一且有序的ID。
二、实现原理
RedisIdWorker的核心思想是利用Redis的自增特性和时间戳来生成唯一且有序的ID。其生成的ID由两部分组成:
- 时间戳部分:使用当前时间戳减去一个起始时间戳(例如某个特定日期的时间戳),得到一个相对时间戳。时间戳部分通常占用31位,以秒为单位,这样可以保证在69年内生成的ID是唯一的。
- 自增序列号部分:使用Redis的
INCR
命令生成一个自增序列号,确保在相同的时间戳下,ID是唯一的。序列号部分通常占用32位,这意味着每秒可以生成2^32个不同的ID。
在具体实现中,时间戳部分和自增序列号部分通过位运算组合在一起。时间戳部分左移32位,然后与序列号部分进行按位或操作,最终生成一个64位的全局唯一ID。这种设计不仅保证了ID的唯一性,还确保了ID的递增性,有利于数据库索引的创建。
这种实现方式充分利用了Redis的原子操作特性,确保在高并发环境下生成的ID仍然是唯一的。同时,由于时间戳和序列号的结合,生成的ID具有一定的规律性,但又不会直接暴露业务逻辑。
三、代码实现
以下是RedisIdWorker的Java代码实现:
java复制
@Component
public class RedisIdWorker {// 开始时间戳(例如2022年1月1日)private static final long BEGIN_TIMESTAMP = 1640995200L;// 序列号的位数private static final int COUNT_BITS = 32;private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}// 获取下一个自动生成的IDpublic long nextId(String keyPrefix) {// 1. 生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;// 2. 获取当前日期,用于生成keyString date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));// 3. 获取自增序列号long count = stringRedisTemplate.opsForValue().increment("incr:" + keyPrefix + ":" + date);// 4. 拼接并返回IDreturn timestamp << COUNT_BITS | count;}
}
代码说明
- 时间戳部分:通过
LocalDateTime
获取当前时间戳,并减去起始时间戳BEGIN_TIMESTAMP
。 - 自增序列号部分:使用
StringRedisTemplate
的increment
方法,为每个日期生成一个自增序列号。 - ID拼接:将时间戳左移32位,然后与序列号进行按位或操作,生成最终的ID。
四、使用示例
以下是一个简单的使用示例:
java复制
@SpringBootTest
public class RedisIdWorkerTest {@Resourceprivate RedisIdWorker redisIdWorker;@Testpublic void testIdWorker() {// 生成订单IDlong orderId = redisIdWorker.nextId("order");System.out.println("Generated Order ID: " + orderId);// 生成用户IDlong userId = redisIdWorker.nextId("user");System.out.println("Generated User ID: " + userId);}
}
示例说明
nextId
方法接收一个keyPrefix
参数,用于区分不同类型的ID(例如订单ID、用户ID等)。- 每次调用
nextId
方法都会生成一个唯一的ID,并且由于时间戳和自增序列号的结合,生成的ID是严格递增的。
五、总结
RedisIdWorker是一种简单高效的全局ID生成器,特别适用于分布式系统。它通过结合时间戳和自增序列号,利用Redis的原子操作保证了ID的唯一性和有序性。在实际项目中,可以根据业务需求调整时间戳的起始值和序列号的位数,以满足不同的场景。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章:
- [Redis - 全局ID生成器 RedisIdWorker - CSDN博客]
- [Redis - 全局ID生成器 RedisIdWorker本文介绍了分布式系统中的全局ID生成器RedisIdWorke - 掘金]
相关文章:
Redis - 全局ID生成器 RedisIdWorker
文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中,生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...
Linux ftrace 内核跟踪入门
文章目录 ftrace介绍开启ftraceftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on i…...
Visual Studio(VS)没有显示垂直滚轮or垂直滚轮异常显示
前言: 前段时间,我换上了新电脑。满心欢喜地安装好 VS,准备大干一场时,却发现了一个小麻烦 —— 垂直滚轮显示异常(如图 1)。这种显示方式实在让我难以适应,每一次操作都觉得别扭。 于是&#…...
大数据数仓实战项目(离线数仓+实时数仓)3
1.课程内容和课程目标 2.订单时间维度指标需求分析 根据时间数据,生成一个时间维度表,我们后面还可以去复用这个时间维度表 3.使用kettle生成日期维度数据 Hive创建日期维度表 使用Kettle构建以下组件结构图 使用kettle生成日期维度数据插入到我们的hi…...
通过acme生成与续签ssl证书,并部署到nginx
通过acme生成与续签ssl证书,并部署到nginx 介绍 官方介绍: acme.sh 实现了 acme 协议,可以从 ZeroSSL,Lets Encrypt 等 CA 生成免费的证书。 安装 acme.sh 1. curl方式 curl https://get.acme.sh | sh -s emailmyexample.com…...
c语言对应汇编写法(以中微单片机举例)
芯片手册资料 1. 赋值语句 C语言: a 5; b a; 汇编: ; 立即数赋值 LDIA 05H ; ACC 5 LD R01,A ; R01 ACC(a5); 寄存器间赋值 LD A,R01 ; ACC R01(读取a的值) LD R02,A ; R02 ACC&…...
React基础内容(面试一)
React大厂常见的面试题目涉及多个方面,包括React的基本概念、组件、状态管理、生命周期、性能优化等。以下是对这些面试题目的详细解析: 一、React基本概念 解释React是什么以及它的主要特点 React是一个用于构建用户界面的JavaScript库,由F…...
2025年软件测试五大趋势:AI、API安全、云测试等前沿实践
随着软件开发的不断进步,测试方法也在演变。企业需要紧跟新兴趋势,以提升软件质量、提高测试效率,并确保安全性,在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...
常用工具类——Collections集合框架
常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类,提供了一系列静态方法,分类来复习! 1.排序操作 reverse(List list) :反转顺序shuffle(List list) : 洗牌,将顺序打乱sort(List list) &…...
【大数据技术】搭建完全分布式高可用大数据集群(ZooKeeper)
搭建完全分布式高可用大数据集群(ZooKeeper) apache-zookeeper-3.8.4-bin.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 ZooKeeper 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件…...
Docker Desktop安装kubernetes时一直在Starting:Kubernetes failed to start
原因:由于墙的问题,导致拉取国外的K8s镜像失败 解决: 下载 k8s-for-docker-desktop 选中自己的kubernetes 版本 下载zip包 PowerShell运行load_images.ps1文件 重启docker kubernetes运行成功...
物流中的物联网:其含义、应用和优势
随着世界联系日益紧密,物流格局正经历重大变革。科技已成为供应链管理的支柱,推动物流公司迈入效率与连通性兼具的新时代。 物联网(IoT)是一股变革性力量,重塑着物流与运输行业的架构。物联网在物流领域并非昙花一现的…...
Axure设计教程:动态排名图(中继器实现)
一、开篇 在Axure原型设计中,动态图表是展示数据和交互效果的重要元素。今天,我们将学习如何使用中继器来创建一个动态的排名图,该图表不仅支持自动轮播,还可以手动切换,极大地增强了用户交互体验。此教程旨在提供一个…...
【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…...
# C指针地址CUP寄存器访问IO内存映射
C指针地址&CUP寄存器访问&IO内存映射 在裸机编程中,C语言可以像汇编语言一样直接操作芯片寄存器地址进行读取和写入,主要是由于以下几个原因: 1. 裸机环境下没有操作系统的干预 裸机编程是指直接在硬件上运行程序,没有…...
UE5 蓝图学习计划 - Day 14:搭建基础游戏场景
在上一节中,我们 确定了游戏类型,并完成了 项目搭建、角色蓝图的基础设置(移动)。今天,我们将进一步完善 游戏场景,搭建 地形、墙壁、机关、触发器 等基础元素,并添加角色跳跃功能,为…...
浅尝yolo11全程记录1-准备环境+官网模型推理(个人备份)
准备工作(虚拟环境、导入项目) 安装Anaconda 主要是为了创建和管理虚拟环境,在pycharm里按照项目里的requirments.txt安装依赖的时候,使用虚拟环境会好很多(我记得不用Anaconda也可以直接在pycharm的terminal里头创建…...
用 Python 给 Excel 表格截图(20250207)
我搜索了网络上的方案,感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径,因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文,因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案,主要弥补…...
Office/WPS接入DS等多个AI工具,开启办公新模式!
在现代职场中,Office办公套件已成为工作和学习的必备工具,其功能强大但复杂,熟练掌握需要系统的学习。为了简化操作,使每个人都能轻松使用各种功能,市场上涌现出各类办公插件。这些插件不仅提升了用户体验,…...
智能化转型2.0:从“工具应用”到“价值重构”
过去几年,“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年,随着生成式AI、大模型、智能体等技术的爆发式落地,中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...
深度整理总结MySQL——索引工作原理
B树索引数据结构 前言什么样的索引数据结构是好的搜索速度要求支持范围查找寻求适合查找的算法寻求合适的数据结构二叉查找树自平衡二叉树B树B树数据结构B与B树比较 总结 前言 相信你在面试时,通常会被问到“什么是索引?”而你一定要能脱口而出…...
基于asr的所见即可说方案
年前写的文章对所见即可说方案进一步调研-CSDN博客,针对rk3568定制版,进行了Accessibility实现所见即可说功能的验证与调研,结论是不可行。 最终解决方案是:结合科大讯飞的AI大模型智能助手,使用rk3588板(…...
【截图】selenium自动通过浏览器截取指定元素div的图片
【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…...
CSS入门学习笔记(一)
学习视频:https://www.bilibili.com/video/BV1zN2UYoEEo/ 目录 基本介绍语法引入方式内联样式(行内样式)内部样式外部样式 选择器四种选择器全局选择器元素选择器类选择器id选择器 合并选择器选择器的优先级 字体属性colorfont-sizefont-weig…...
docker安装es及分词器ik
系统是macos,docker是docker-desktop 拉取镜像 docker pull bitnami/elasticsearch 启动docker镜像 docker create -e "discovery.typesingle-node" \ --name elasticsearch1 -p 9200:9200 -p 9300:9300 \ bitnami/elasticsearch:8.17.1 测试是否好…...
11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南
构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南 关键词: 聊天对话记忆系统、多用户会话管理、LangChain生产部署、Redis记忆存储、高并发对话系统 一、服务级聊天记忆系统核心需求 多用户隔离:支持同时处理数千个独立对话持久化存储:对话历史不因服务重启丢…...
SpringBoot启动源码剖析:从入口到容器的诞生
文章目录 SpringBoot启动的核心入口SpringApplication的初始化SpringBoot的启动流程1. 准备环境(Environment)2. 创建应用上下文(ApplicationContext)3. 刷新应用上下文(Refresh Context)4. 调用Runner接口…...
Day38【AI思考】-彻底打通线性数据结构间的血脉联系
文章目录 **彻底打通线性数据结构间的血脉联系****数据结构家族谱系图****一、线性表(老祖宗的规矩)****核心特征** **二、嫡系血脉解析**1. **数组(规矩森严的长子)**2. **链表(灵活变通的次子)** **三、庶…...
虚拟鼠标MATVT:遥控器操控的安卓电视增强工具
虚拟鼠标MATVT:遥控器操控的安卓电视增强工具 matvt Virtual Mouse for Android TV that can be controlled via remote itself. 项目地址: https://gitcode.com/gh_mirrors/ma/matvt 项目基础介绍与编程语言 虚拟鼠标MATVT(matvt)是…...
优惠券平台(一):基于责任链模式创建优惠券模板
前景概要 系统的主要实现是优惠券的相关业务,所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能,这里先通过模拟的形式代替。后续如果需要后管展示,会重构该代码 UserInfoDTO userInfoDTO new…...
从零开始:OpenCV 图像处理快速入门教程
文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能 1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv::Point类 2.3 cv::Rng类 2.4 cv::Size类 2.5 cv:&…...
计算机网络-SSH基本原理
最近年底都在忙,然后这两天好点抽空更新一下。前面基本把常见的VPN都学习了一遍,后面的内容应该又继续深入一点。 一、SSH简介 SSH(Secure Shell,安全外壳协议)是一种用于在不安全网络上进行安全远程登录和实现其他安…...
数据库性能优化(sql优化)_统计信息_yxy
数据库性能优化_统计信息理解 1 什么是数据库统计信息?2 统计信息不准确3 统计信息分类3.1 表统计信息3.2 列统计信息3.3 索引统计信息4 统计方式4.1 频率直方图4.2 等高直方图5 总结1 什么是数据库统计信息? 数据库中同一个sql有非常多种执行方式,每种执行方式的代价肯定不…...
QT通过setProperty设置不同QSS样式
如上切换效果就是通过setProperty来实现切换不同颜色的。 实现以上效果第一步,需要在QSS中做属性处理。 QLabel{color:red;} QLabel[status"1"]{color:black;} QLabel[status"2"]{color:white;} QLabel[status"3"]{color:blue;} QLa…...
基础入门-算法解密散列对称非对称字典碰撞前后端逆向MD5AESDESRSA
知识点: 0、算法类型-单向散列&对称性&非对称性 1、算法识别加解密-MD5&AES&DES&RSA 2、解密条件寻找-逻辑特征&源码中&JS分析 应用场景: 1、发送数据的时候自动将数据加密发送(只需加密即可) 安全…...
VsCode创建VUE项目
1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …...
【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析
一、引言与背景 在人工智能领域,大型语言模型(LLM)如DeepSeek以其卓越的自然语言理解和生成能力,推动了众多应用场景的发展。然而,大型模型的高昂计算和存储成本,以及潜在的数据隐私风险,限制了…...
ARM嵌入式学习--第十三天(I2C)
I2C --介绍 I2C(Inter-intergrated Circuit 集成电路)总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有俩根双向的信号线,一根数据线SDA用于收发数据&…...
js滚动到页面最底部
setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...
关于 SQL 内连接、外连接(左连接、右连接)的面试题
一、概念理解类 1. 请详细解释内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)在 SQL 中的概念和区别,并分别举例说明它们在实际查询场景中的应用。 在SQL中,内连接&a…...
【论文阅读】Comment on the Security of “VOSA“
Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…...
Zookeeper是如何解决脑裂问题的?
大家好,我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的?】面试题。希望对大家有帮助; Zookeeper是如何解决脑裂问题的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过多种机制来解决脑裂&…...
宾馆民宿酒店住宿管理系统+小程序项目需求分析文档
该系统是一款专为现代酒店设计的高效、智能、易用的管理工具,旨在帮助酒店提升运营效率、优化客户体验,提升客户满意度与忠诚度,并促进业务增长。系统采用先进的云计算技术,支持小程序等多平台访问,第三方接口,确保数据安全与稳定。本系统主要针对中小型精品酒店、连锁酒…...
【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)
1. 安装必要的依赖 以 CentOS 7 系统为例,安装必要的依赖包: sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…...
基于keepalived+GTID半同步主从复制的高可用MySQL集群
文章目录 项目架构图项目名称项目环境项目描述ip地址规划项目步骤一.安装好8台全新的centos7.9的系统,关闭firewalld和selinux,配置每台主机的静态ip地址,设置每台主机对应的主机名。1、关闭firewalld2.关闭seLinux3.配置每台主机静态ip地址4…...
DeepSeek与llama本地部署(含WebUI)
DeepSeek从2025年1月起开始火爆,成为全球最炙手可热的大模型,各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用,那如果有读者希望将大模型部署在本地应该怎么做呢?本篇文章将会教你如何在本地傻瓜式的部署我们的…...
leetcode_双指针 557. 反转字符串中的单词 III
557. 反转字符串中的单词 III 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。思路: 1.首先用split()切割字符串中用空格分隔的单词2.用切片法反转每个单词3.用join()把反转后的单词用空格连接 class Solu…...
Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...
全文链接:https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型(LLMs)进行股票分析。通过使用提供的股票市场和金融新闻获取数据,结合Python中的相关库,如Pandas、langchain等,实现对股票新闻的情…...
通过多层混合MTL结构提升股票市场预测的准确性,R²最高为0.98
“Boosting the Accuracy of Stock Market Prediction via Multi-Layer Hybrid MTL Structure” 论文地址:https://arxiv.org/pdf/2501.09760 摘要 本研究引入了一种创新的多层次混合多任务学习架构,致力于提升股市预测的效能。此架构融…...
#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞复现步骤 三、技术…...