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
英文地址,請注明出處:http://en.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…