Redis - 全局ID生成器 RedisIdWorker

文章目录

  • Redis - 全局ID生成器 RedisIdWorker
    • 一、引言
    • 二、实现原理
    • 三、代码实现
      • 代码说明
    • 四、使用示例
      • 示例说明
    • 五、总结

Redis - 全局ID生成器 RedisIdWorker

在这里插入图片描述

一、引言

在分布式系统中,生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出现冲突,而UUID虽然可以保证唯一性,但长度较长且不够紧凑。RedisIdWorker是一种基于Redis实现的全局ID生成器,它结合了时间戳和自增序列号,能够在分布式环境中高效地生成唯一且有序的ID。

二、实现原理

RedisIdWorker的核心思想是利用Redis的自增特性和时间戳来生成唯一且有序的ID。其生成的ID由两部分组成:

  1. 时间戳部分:使用当前时间戳减去一个起始时间戳(例如某个特定日期的时间戳),得到一个相对时间戳。时间戳部分通常占用31位,以秒为单位,这样可以保证在69年内生成的ID是唯一的。
  2. 自增序列号部分:使用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;}
}

代码说明

  1. 时间戳部分:通过LocalDateTime获取当前时间戳,并减去起始时间戳BEGIN_TIMESTAMP
  2. 自增序列号部分:使用StringRedisTemplateincrement方法,为每个日期生成一个自增序列号。
  3. 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 - 掘金]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13675.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…

用Python获取股票数据并实现未来收盘价的预测

获取数据 先用下面这段代码获取上证指数的历史数据&#xff0c;得到的csv文件数据&#xff0c;为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…

RK3576——USB3.2 OTG无法识别到USB设备

问题&#xff1a;使用硬盘接入到OTG接口无热插拔信息&#xff0c;接入DP显示屏无法正常识别到显示设备&#xff0c;但是能通过RKDdevTool工具烧录系统。 问题分析&#xff1a;由于热插拔功能实现是靠HUSB311芯片完成的&#xff0c;因此需要先确保HUSB311芯片驱动正常工作。 1. …

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署&#xff1a; 经过以下步骤&#xff0c; 最终会形成maven依赖的多个jar&#xff08;包括lib下添加的&#xff09;、 我们编写的程序代码打成一个jar&#xff0c;将程序jar与 依赖jar分开&#xff0c;便于管理&#xff1a; success&#xff1a; 最终…

网络工程师 (21)网络的性能

一、速率&#xff08;数据率或比特率&#xff09; 定义&#xff1a;数据在数字信道上传送的速率&#xff0c;通常以比特每秒&#xff08;bps&#xff09;为单位。常见的速率单位还有千比特每秒&#xff08;kbit/s&#xff09;、兆比特每秒&#xff08;Mbit/s&#xff09;和吉比…

UE5 蓝图学习计划 - Day 14:搭建基础游戏场景

在上一节中&#xff0c;我们 确定了游戏类型&#xff0c;并完成了 项目搭建、角色蓝图的基础设置&#xff08;移动&#xff09;。今天&#xff0c;我们将进一步完善 游戏场景&#xff0c;搭建 地形、墙壁、机关、触发器 等基础元素&#xff0c;并添加角色跳跃功能&#xff0c;为…

计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价预测 机器学习 深度学习 Python爬虫 HDFS集群

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

金蝶云星空k3cloud webapi报“java.lang.Class cannot be cast to java.lang.String”的错误

最近在对接金蝶云星空k3cloud webapi时&#xff0c;报一个莫名其妙的转换异常&#xff0c;具体如下&#xff1a; 同步部门异常! ERP接口登录异常&#xff1a;java.lang.Class cannot be cast to java.lang.String at com.jkwms.k3cloudSyn.service.basics.DeptK3CloudService.…

html的字符实体和颜色表示

在HTML中&#xff0c;颜色可以通过以下几种方式表示&#xff0c;以下是具体的示例&#xff1a; 1. 十六进制颜色代码 十六进制颜色代码以#开头&#xff0c;后面跟随6个字符&#xff0c;每两个字符分别表示红色、绿色和蓝色的强度。例如&#xff1a; • #FF0000&#xff1a;纯红…

老游戏回顾:G2

一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去&#xff0c;古拉纳斯将希望之光给予人们&#xff0c;人类令希望之光不断扩大&#xff0c;将繁荣握在手中。 但是&#xff0c;暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战&#xff0c…

E4982A,keysight是德科技台式LCR表

是德科技keysightE4982A台式LCR表 是德KEYSIGHT的精密型LCR表E4982A&#xff0c;针对SMD电感器、EMI滤波器等无源元器件的制造测试展现出卓越性能&#xff0c;特别适用于1 MHz至3 GHz高频率范围内的阻抗测试。此外&#xff0c;E4982A还广泛应用于研发领域&#xff0c;凭借其强…

C++, STL容器 array:固定大小数组深度解析

文章目录 引言一、设计哲学与底层实现1.1 零抽象成本的封装1.2 性能特征二、内存优化实践2.1 缓存友好性对比2.2 内存碎片防护三、高级内存管理技巧3.1 精准内存对齐3.2 内存复用模式四、工程实践指南4.1 适用场景4.2 陷阱规避五、未来演进结语引言 在C++标准库中,std::array…

013-51单片机红外遥控器模拟控制空调,自动制冷制热定时开关

主要功能是通过红外遥控器模拟控制空调&#xff0c;可以实现根据环境温度制冷和制热&#xff0c;能够通过遥控器设定温度&#xff0c;可以定时开关空调。 1.硬件介绍 硬件是我自己设计的一个通用的51单片机开发平台&#xff0c;可以根据需要自行焊接模块&#xff0c;这是用立创…

(苍穹外卖)项目结构

苍穹外卖项目结构 后端工程基于 maven 进行项目构建&#xff0c;并且进行分模块开发。 1). 用 IDEA 打开初始工程&#xff0c;了解项目的整体结构&#xff1a; 对工程的每个模块作用说明&#xff1a; 序号名称说明1sky-take-outmaven父工程&#xff0c;统一管理依赖版本&…

车载以太网__传输层

车载以太网中&#xff0c;传输层和实际用的互联网相差无几。本篇文章对传输层中的IP进行介绍 目录 什么是IP&#xff1f; IP和MAC的关系 IP地址分类 私有IP NAT DHCP 为什么要防火墙穿透&#xff1f; 广播 本地广播 直接广播 本地广播VS直接广播 组播 …

UE5 蓝图学习计划 - Day 12:存储与加载

在游戏开发中&#xff0c;存储&#xff08;Save&#xff09;与加载&#xff08;Load&#xff09; 系统至关重要&#xff0c;玩家需要能够保存游戏进度、角色状态、道具数据等信息&#xff0c;并在下次启动游戏时恢复它们。UE5 提供了 SaveGame 蓝图类&#xff0c;帮助开发者快速…

web-文件上传-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用&#xff0c;构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖&#xff1a; 打开终端或命令行&#xff0c;执行以下命令安装 Flask 和 OpenAI SDK&#xff1a; pip i…

【Elasticsearch】nested聚合

在 Elasticsearch 中&#xff0c;嵌套聚合&#xff08;nestedaggregation&#xff09;的语法形式用于对嵌套字段&#xff08;nestedfields&#xff09;进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型&#xff0c;用于存储数组中的对象&#xff0c;这些对象需要独…