一种分布式id生成规则

本文探讨了一种针对订单号生成的需求,要求包括唯一性、趋势递增、时间信息、防止冲突和限制长度等。通过分析,排除了自增id、uuid和snowflake等方案,最终提出使用时间戳加4位随机数的方案,并结合redis实现,利用其原子性特性避免race condition,同时确保高可用性。在实现过程中,需注意lua脚本的确定性以防止主从同步问题。
摘要由CSDN通过智能技术生成

需求

有个生成订单号的需求,对于生成订单号有如下要求

  • 不能被猜出订单量
  • 唯一性
  • 趋势递增
  • 订单号包含时间信息
  • 防止race condition生成重复的id
  • 防止时间回拨生成重复的id
  • 满足每秒可以生成1w个订单号
  • 订单号不能过长

分析

  • 不能被猜出订单量,所以自增id排除掉
  • 要求趋势递增,所以uuid排除掉
  • 订单号不能过长,所以snowflake、Mongdb objectID之类的排除掉

方案

订单号=12位时间信息+4位随机数。时间信息精确到秒,加上4位随机数,支持每秒最多生成1w个订单号。

利用redis来实现方案。
incr命令防止4位随机数重复。初始化的时候就设置一个随机数,而不是从0开始incr。类型TCP协议的ISN(Initial Sequence Number)
time命令获取redis服务器的时间,防止各机器本地时间不一致,导致订单号重复。
lua脚本确保原子性,避免race condition.
set命令指定nx参数,避免race condition.

由于redis用的是AWS的服务,所以高可用性可以保障。

伪代码如下

def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值