Redis的分布式序列号生成器原理

Redis 分布式序列号生成器的核心原理是利用 Redis 的原子操作高性能特性,在分布式系统中生成全局唯一、有序的序列号。其设计通常结合业务需求(如有序性、长度限制、高并发),通过 Redis 的原子命令(如 INCRINCRBY)或 Lua 脚本实现。以下是具体原理和常见实现方式:

一、核心依赖:Redis 的原子性

Redis 是单线程处理命令的(6.0 后引入多线程 I/O,但命令执行仍单线程),因此单个命令的执行是原子的,不会被其他客户端命令打断。这一特性是分布式序列号生成的基础:

  • 例如,INCR key 命令会原子性地将 key 对应的数值加 1,并返回新值。即使多个客户端同时调用 INCR,也不会出现重复值。

二、基础实现:基于 INCR 的自增序列

最基础的分布式序列号生成器直接使用 INCR 命令,适用于对序列号有序性要求高、但长度限制较宽松的场景。

1. 实现方式
  • 在 Redis 中创建一个全局键(如 serial:order),初始值为 0。
  • 每次需要生成序列号时,客户端调用 INCR serial:order,返回的数值即为唯一序列号。

示例​:

# 初始化(可选,若键不存在 INCR 会自动初始化为 0 后加 1)
SET serial:order 0# 客户端调用(每次生成一个递增的序列号)
INCR serial:order  # 返回 1
INCR serial:order  # 返回 2
2. 特点
  • 全局唯一​:Redis 单线程保证 INCR 原子性,多客户端并发调用不会重复。
  • 有序性​:序列号严格递增,适合需要按顺序标识的场景(如订单号、日志 ID)。
  • 简单高效​:INCR 时间复杂度 O(1),QPS 可达 10 万+,适合高并发场景。
3. 局限性
  • 单点依赖​:若 Redis 主节点故障,主从切换期间可能出现短暂序列号重复(需结合持久化或 Redlock 解决)。
  • 数值溢出​:若长期运行,序列号可能超出 Redis 数值范围(64 位有符号整数最大值 9223372036854775807)。
  • 无业务含义​:纯数字序列号缺乏业务信息(如时间、机器标识),不利于问题排查。

三、进阶实现:结合时间戳的复合序列号

为解决基础实现的局限性(如数值溢出、无业务信息),可将时间戳与 Redis 自增序列结合,生成更长的复合序列号。典型方案类似 Twitter 的 Snowflake 算法,但依赖 Redis 保证部分字段的原子性。

1. 设计思路

Snowflake 算法的 64 位结构(简化版):

0 | 时间戳(41位) | 机器/实例ID(10位) | 序列号(12位)

其中:

  • 时间戳​:保证序列号随时间递增,避免溢出。
  • 机器/实例ID​:标识分布式节点,避免不同节点序列号冲突。
  • 序列号​:同一节点、同一毫秒内的自增计数(防止同一毫秒内重复)。
2. Redis 在其中的角色

Snowflake 的机器 ID 通常需手动配置(或通过 Zookeeper 分配),但在分布式环境中,可通过 Redis 动态管理机器 ID 或序列号部分:

场景 1:动态分配机器 ID

  • 利用 Redis 的 SETNX(仅当键不存在时设置)命令为每个新节点分配唯一机器 ID(如 10 位范围 0~1023)。
  • 节点启动时执行 SETNX machine:id <node_id>,失败则重试获取其他 ID。

场景 2:同一节点毫秒内序列号

  • 每个节点维护一个 Redis 键(如 serial:node:<node_id>),记录当前毫秒内的自增序列号。
  • 每次生成序列号时:
    1. 获取当前时间戳(毫秒级)。
    2. 调用 INCR 命令递增该节点的序列号。
    3. 若序列号超过最大值(如 12 位的 4095),等待至下一毫秒再重试。
​3. 特点
  • 全局唯一​:时间戳(全局递增)+ 机器 ID(节点唯一)+ 序列号(同一节点毫秒内唯一)三重保证。
  • 有序性​:时间戳递增,整体序列号随时间有序。
  • 可扩展​:通过调整各部分位数(如增加时间戳位数)支持更长时间范围(Snowflake 原设计支持约 69 年)。

四、其他优化方案

根据业务需求,还可结合 Redis 的其他特性优化序列号生成:

1. 批量预生成序列号

高并发场景下,频繁调用 INCR 可能成为瓶颈。可预生成一批序列号(如每次 INCRBY 1000),缓存在本地,用完再批量获取。减少 Redis 交互次数,提升性能。

2. 带业务标识的序列号

将业务类型(如 orderlog)作为键的一部分(如 serial:orderserial:log),生成不同业务的独立序列号。

3. 分布式锁辅助

若需严格保证某些复杂操作(如跨节点的序列号连续),可结合 Redis 分布式锁(如 SETNX 或 Redlock),但会增加延迟,需权衡性能。

五、注意事项

  1. Redis 持久化​:确保 Redis 开启 AOF 或 RDB 持久化,避免主从切换或重启导致序列号丢失(可能重复)。
  2. 时钟回拨​:若服务器时钟回拨,可能导致序列号重复(如 Snowflake 场景),需在代码中检测并处理(如等待或抛异常)。
  3. 集群模式​:Redis Cluster 或 Redlock 可提升可用性,但需注意集群环境下 INCR 命令的原子性仍由单个节点保证(需确保键哈希到同一 slot)。

总结

Redis 分布式序列号生成器的核心是利用 Redis 的原子操作保证全局唯一性,通过结合时间戳、机器 ID 等扩展字段满足有序性和业务需求。基础实现适合简单高并发场景,复合实现(如 Snowflake 变种)适合需要更长生命周期或业务含义的场景。实际应用中需根据业务特点(如并发量、序列号长度、有序性要求)选择合适方案,并注意持久化、时钟回拨等问题。

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

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

相关文章

2025年SEVC SCI2区,基于深度强化学习与模拟退火的多无人机侦察任务规划,深度解析+性能实测

目录1.摘要2.问题定义3.SA-NNO-DRL方法4.结果展示5.参考文献6.算法辅导应用定制读者交流1.摘要 无人机&#xff08;UAV&#xff09;因其高自主性和灵活性&#xff0c;广泛应用于侦察任务&#xff0c;多无人机任务规划在交通监控和数据采集等任务中至关重要&#xff0c;但现有方…

汽车娱乐信息系统域控制器的网络安全开发方案

引言1.1 项目背景随着汽车行业的快速发展和智能化、网联化的趋势日益明显&#xff0c;汽车娱乐信息系统&#xff08;In-Vehicle Infotainment System&#xff0c;IVIS&#xff09;已经成为现代汽车的重要组成部分。汽车娱乐信息系统不仅提供了丰富的多媒体功能&#xff0c;如音…

【论文阅读】Deep Adversarial Multi-view Clustering Network

摘要多视图聚类通过挖掘多个视图之间的共同聚类结构&#xff0c;近年来受到了越来越多的关注。现有的大多数多视图聚类算法使用浅层、线性嵌入函数来学习多视图数据的公共结构。然而&#xff0c;这些方法无法充分利用多视图数据的非线性特性&#xff0c;而这种特性对于揭示复杂…

Redis - 使用 Redis HyperLogLog 进行高效基数统计

文章目录引言HyperLogLog 工作原理Spring Boot 集成 Redis1. 添加依赖2. 配置 Redis 连接3. Redis 配置类HyperLogLog 实战应用1. 基础操作服务类2. 网站日活跃用户统计3. 性能测试与误差分析应用场景分析适用场景不适用场景性能优化技巧与传统方案对比结论引言 在数据分析和监…

後端開發技術教學(三) 表單提交、數據處理

上回&#xff1a;後端開發技術教學(二) 條件指令、循環結構、定義函數 -CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 小皮出品 目錄 一、表單提交 1.1 get & post 1.…

Python训练Day39

浙大疏锦行 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 一、 图像数据的介绍 图像数据&#xff0c;相较于结构化数据&#xff08;表格数据&#xff09;他的特…

十八、MySQL-DML-数据操作-插入(增加)、更新(修改)、删除

DML数据操作添加数据更新(修改)数据删除数据总结代码&#xff1a; -- DML:数据操作语言-- -- DML:插入数据-insert -- 1.为tb_emp表的username,name&#xff0c;gender 字股插入值insert into tb_emp(username,name,gender,create_time,update_time) values (Toki,小时,2,now()…

Linux 安装 JDK 8u291 教程(jdk-8u291-linux-x64.tar.gz 解压配置详细步骤)​

一、准备工作 ​下载 JDK 安装包​ 去 Oracle 官网或者可信的镜像站下载&#xff1a; ​jdk-8u291-linux-x64.tar.gz​ &#xff08;这是一个压缩包&#xff0c;不是安装程序&#xff0c;解压就能用&#xff09; ​jdk-8u291-linux-x64.tar.gz​下载链接&#xff1a;https://pa…

蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor

(七)、锁存器1、原理蓝桥杯中数据传入口都是P0&#xff0c;也就是数码管段选、位选数据、LED亮灭的数据、蜂鸣器启动或禁用的数据&#xff0c;外设启动或者关闭都需要通过P0写入数据&#xff0c;那么如何这样共用一个端口会造成冲突嘛&#xff0c;答案是肯定的。所以蓝桥杯加入…

AI热点周报(8.3~8.9):OpenAI重返开源,Anthropic放大招,Claude4.1、GPT5相继发布

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录一、OpenAI的"开源回归"&#xff1a;时隔5年的战略大转弯1. GPT-OSS系列&a…

《Kubernetes部署篇:基于x86_64+aarch64架构CPU+containerd一键离线部署容器版K8S1.33.3高可用集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署基于containerd容器版 K8S 1.33.3集群&a…

Linux抓包命令tcpdump详解笔记

文章目录一、tcpdump 是什么&#xff1f;二、基本语法三、常用参数说明四、抓包示例&#xff08;通俗易懂&#xff09;1. 抓所有数据包&#xff08;默认 eth0&#xff09;2. 指定接口抓包3. 抓取端口 80 的数据包&#xff08;即 HTTP 请求&#xff09;4. 抓取访问某个 IP 的数据…

抖音、快手、视频号等多平台视频解析下载 + 磁力嗅探下载、视频加工(提取音频 / 压缩等)

跟你们说个安卓上的下载工具&#xff0c;还挺厉害的。它能支持好多种下载方式&#xff0c;具体多少种我没细数&#xff0c;反正挺全乎的。​ 平时用得最多的就是视频解析&#xff0c;像抖音、快手、B 站上那些视频&#xff0c;想存下来直接用它就行&#xff0c;连海外视频的也能…

【iOS】JSONModel源码学习

JSONModel源码学习前言JSONModel的使用最基础的使用转换属性名称自定义错误模型嵌套JSONModel的继承源码实现initWithDictionaryinit__doesDictionaryimportDictionary优点前言 之前了解过JSONModel的一些使用方法等&#xff0c;但是对于底层实现并不清楚了解&#xff0c;今天…

SmartMediaKit 模块化音视频框架实战指南:场景链路 + 能力矩阵全解析

✳️ 引言&#xff1a;从“内核能力”到“模块体系”的演进 自 2015 年起&#xff0c;大牛直播SDK&#xff08;SmartMediaKit&#xff09;便致力于打造一个可深度嵌入、跨平台兼容、模块自由组合的实时音视频基础能力框架。经过多轮技术迭代与场景打磨&#xff0c;该 SDK 已覆…

【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法

相机模型介绍及相机模型在自动驾驶中的作用及使用方法 相机模型是计算机视觉中的核心概念&#xff0c;用于描述真实世界中的点如何投影到图像平面上。在自动驾驶系统中&#xff0c;相机模型用于环境感知&#xff0c;如物体检测和场景理解。下面我将详细介绍针孔相机模型和鱼眼相…

推荐一款优质的开源博客与内容管理系统

Halo是一款由Java Spring Boot打造的开源博客与内容管理系统&#xff08;CMS&#xff09;&#xff0c;在 GitHub上拥有超过36K Start的活跃开发者社区。它使用GPL‑3.0授权开源&#xff0c;稳定性与可维护性极高。 Halo的设计简洁、注重性能&#xff0c;同时保持高度灵活性&a…

【GPT入门】第43课 使用LlamaFactory微调Llama3

【GPT入门】第43课 使用LlamaFactory微调Llama31.环境准备2. 下载基座模型3.LLaMA-Factory部署与启动4. 重新训练![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e7aa869f8e2c4951a0983f0918e1b638.png)1.环境准备 采购autodl服务器&#xff0c;24G,GPU,型号3090&am…

计算机网络:如何理解目的网络不再是一个完整的分类网络

这一理解主要源于无分类域间路由&#xff08;CIDR&#xff09;技术的广泛应用&#xff0c;它打破了传统的基于类的IP地址分配方式。具体可从以下方面理解&#xff1a; 传统分类网络的局限性&#xff1a;在早期互联网中&#xff0c;IP地址被分为A、B、C等固定类别&#xff0c;每…

小米开源大模型 MiDashengLM-7B:不仅是“听懂”,更能“理解”声音

目录 前言 一、一枚“重磅炸弹”&#xff1a;开源&#xff0c;意味着一扇大门的敞开 二、揭秘MiDashengLM-7B&#xff1a;它究竟“神”在哪里&#xff1f; 2.1 “超级耳朵” 与 “智慧大脑” 的协作 2.2 突破&#xff1a;从 “听见文字” 到 “理解世界” 2.3 创新训练&a…