Redis+DB实现基于号段的发号器原理
各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《Redis+DB实现基于号段的发号器原理》,很明显是关于数据库的文章哈哈哈,其中内容主要会涉及到Redis、集群、发号器等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!
什么是发号器
在互联网场景中,很多业务要求生成唯一的ID号,以用于区分某些资源。常见例子:电商系统中的订单ID号、聊天群组中的消息ID号、上传文件到存储系统中之后生成的文件ID号、用户注册系统中的用户ID号、商户系统中的商户ID号、开放平台中的开发者账号ID、餐饮店的排队进餐号、影剧院票据单号、医院/银行排队号等等,这些基本都是基于先来后到的规则生成,以期达到唯一性或稍显公平的享受某些资源。
你是否想过使用技术应该如何实现呢?下面引出本文主角:发号器(ticket dispenser),也可称之为ID生成器 (生成的ID号可以是字符串也可以是整数,本文仅探讨生成整数id的发号器实现原理)。
在互联网行业中,为了保证服务的稳定性、可用性、并发性等指标,服务一般是采用集群多节点部署,如何保证在这些不同的节点生成符合业务要求的ID,又引出另一个概念:分布式ID生成器(实现方案有多种)。关于分布式ID的常见实现方式参考笔者文章:分布式ID的5种生成方式以及Go源码中的一种应用,文章中列举了常见的5种实现方式以及原理。本文,则重点讲解使用Redis+DB基于号段的发号器实现原理。
实现发号器需要的关注点
需要关注的点大致有以下几个:
- 有序性
正序或倒序,发号器基本都是基于某种纬度的正序排列。还有一些不需要有序性,只要保证唯一性即可。
- 递增性
随着时间的流逝,号码的值只能增大不能变小,即:后面生成的一定大于前面生成的。
- 唯一性
在整个生成的号码值域中,同一个号码有且仅出现一次。
- 先到先得
先申请号码的先获取到,后申请号码的后获取到。
基于号段的发号器实现原理
由上图可知,实现基于号段的发号器逻辑有2个角色:

1. 发号生成器
2. 集中式号段管理器
对于基于号段的发号器来说,发号生成器本身存储一段可用的值域空间,其数据结构一般为:[currId, maxId],currId为下一个可用id,maxId为当前号段最大id。每当有号码申请到达后,发号器先判断是否有可用号码。
若currId
若currId>maxId,说明该号段被消耗殆尽。此时,发号器需要申请新的号段值域空间。即:申请新的maxId,一般使用步长的方式,发号器每次申请新的值域空间,会得到长度固定的新值域空间 (判断发号生成器是否存在可用号码,一般有2种写法,只是处理边界条件不一样,这里以currId
通常情况下,发号生成器分为进程内发号生成器与进程外发号生成器。即:在进程内部维护[currId, maxId]值域空间还是在进程外部维护[currId, maxId]值域空间。进程内部可以通过全局变量+进程内部锁(或原子操作)的方式实现,进程外部通过其他中间件(Redis or DB)或服务来实现。
进程内发号生成器与进程外发号生成器的使用场景也有很大不同之处,服务一般存在多个节点,每个节点都存在一个业务进程。若对全部请求都要保证先来后到严格的时序性,则需要使用唯一的进程外发号生成器。若不用保证先来后到严格的时序性,则进程内发号生成器与进程外发号生成器都可以使用,考虑性能优先选择进程内发号生成器。
Redis+DB实现基于号段的发号器

通过上面可知,实现发号器功能需要实现2个角色:发号生成器与集中式号段管理器,本文着重讲解进程外发号生成器的实现原理。这里使用Redis作为发号生成器,DB作为集中式号段管理器。
Redis发号生成器仅仅是一个hash类型的数值结构,包含2个field:v_l/v_h。
DB集中式号段管理器一般是一张表结构,核心的2个字段:server_name/max_id。
通过上图可知,业务在通过发号器获取号码时需要经历以下几个步骤:
1. 业务请求Redis发号生成器获取号码
2. 发号生成器判断是否存在可用号码
3. 有几种情况
3.1 正常获取号码返回给业务(到这里结束)
3.2 发号生成器数据结构不存在
3.3 发号生成器数值空间耗尽
4. 对于3.2/3.3这两种情况,业务会加分布式锁并请求DB集中式号段管理器获取新的号段
5. DB集中式号段管理器返回新的号段
6. 业务更新发号生成器号段
7. 回到第1步
文中关于redis的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Redis+DB实现基于号段的发号器原理》文章吧,也可关注golang学习网公众号了解相关技术文章。
深入理解MySQL索引底层数据结构
- 上一篇
- 深入理解MySQL索引底层数据结构
- 下一篇
- 谷歌下场优化扩散模型,三星手机运行Stable Diffusion,12秒内出图
-
- 聪慧的鼠标
- 这篇技术贴出现的刚刚好,作者加油!
- 2023-05-29 13:21:06
-
- 优雅的乌龟
- 赞 ??,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢老哥分享文章!
- 2023-05-29 10:50:24
-
- 重要的鲜花
- 很详细,mark,感谢师傅的这篇文章,我会继续支持!
- 2023-05-27 23:26:47
-
- 温婉的钥匙
- 这篇技术贴真及时,好细啊,真优秀,mark,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-05-23 15:46:06
-
- 数据库 · Redis | 7小时前 | Redis · 缓存一致性 · 失效通知 · redis CLIENT TRACKING 客户端缓存
- Client Tracking 失效通知怎么配置或排查
- 439浏览 收藏
-
- 数据库 · Redis | 8小时前 | Redis · cluster · redis Redis Cluster Hash Tag hash slot
- Cluster hash tag 同槽怎么配置或排查
- 358浏览 收藏
-
- 数据库 · Redis | 9小时前 |
- WATCH 事务重试怎么配置或排查
- 230浏览 收藏
-
- 数据库 · Redis | 18小时前 | Redis · Sorted Set · ZRANGE · ZRANGEBYLEX ·
- Sorted Set 字典序范围怎么配置或排查
- 461浏览 收藏
-
- 数据库 · Redis | 19小时前 | Redis · Redis Streams · XAUTOCLAIM ·
- XAUTOCLAIM 接管超时消息怎么配置或排查
- 287浏览 收藏
-
- 数据库 · Redis | 20小时前 |
- Stream pending 消息怎么配置或排查
- 109浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 116次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 36次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 59次使用
-
- AGI-Eval
- AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
- 36次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 271次使用
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览
-
- 一文搞懂Go语言操作Redis的方法
- 2023-01-07 171浏览
-
- Golang分布式应用之Redis示例详解
- 2023-01-07 113浏览
-
- Go Redis客户端使用的两种对比
- 2022-12-30 195浏览

