基于 Redis 的序列号服务的设计 (查看原文)

本文讲述基于 Redis 的序列号服务的设计,主要从序列号服务的概念、需求以及服务的设计思路与详细设计等方面对其进行阐述。〇、前言在笔者团队中,由于分布式 ID 具有单调递增、形成...

mp.weixin.qq.com  by 一帅同学  
评论 (11)
Thumb

ivxivx 2017-12-06 08:51

每隔1000个号存储一次,每次重启读上一次存储的号并加上1000
Thumb

黄博 2017-12-06 10:14

这个方案有个问题就是无法动态的扩展服务提供方
Thumb

u424528 2017-12-07 08:09

用数据库存maxid很巧妙,另外redis 3.2+可以通过lua脚本自定义实现带时间戳的序列号,同样可以解决故障恢复时序列号依然单调递增,主公不选lua的原因是啥?
Thumb

泛金融技术 2017-12-07 19:28

@王伟 没太听明白 redis 3.2+ 提供了 lua 什么新功能支持自定义带时间戳的序列号,可能详细讲讲?
Thumb

u424528 2017-12-07 20:13

redis3.2+内置了lua环境,可以自定义lua脚本扩展redis能力,通过脚本内获取redis当前时间加分片字段加自增序列实现64位自增序列号,不过想了一下,时间戳的方式避免不了redis主从切换时时间不一致的问题,还是基于一个统一的maxid更可靠
Thumb

泛金融技术 2017-12-07 20:22

@王伟 没记错的话 redis 2.6 就引入了 lua,我们也用了 lua 保证 INCR 和 check 两个操作的事务,以及提高传输和执行性能。使用数据库保存 maxid 主要是觉得 redis 不可靠,故障恢复麻烦,而多一层数据库存 maxid 可以让序列号服务更可靠。
Thumb

u424528 2017-12-07 22:17

对的,2.6引入了lua,但是3.2之前的redis不支持随机写入,例如lua脚本调用time函数后就不允许其他写操作。但这个方案依赖机器时间,没有maxid可靠,给你👍
Thumb

泛金融技术 2017-12-07 22:22

原来 3.2+ 支持这个,赞!似乎解答了之前的一个疑惑了,回头详细了解一下。感谢伟神,膜拜伟神!😁😁😁
Thumb

u424528 2017-12-08 07:00

主公太客气,跟主公学习,受益匪浅^ - ^
Thumb

u280701 2017-12-08 12:36

@王伟 博主是一帅哦
Thumb

u424528 2017-12-19 09:30

果然是好文章,有好几个地方的分享哎
Post wxa image%2f2472335cc0f843d39bd6eaac5224d360 用微信扫描
小程序码阅读原文

开发者头条

程序员分享平台