分布式系统之发号器

一、发号器特征

1)全局唯一性:保证不会出现重复ID

2)有序性:保证一定的顺序性

3)易扩展:方便扩容

4)易恢复:服务不可用时或数据能从原服务器恢复

5)高性能

二、实现发号器的方式

2.1、数据库自增

优点:

1)保证唯一性

2)保证顺序递增

3)简单

缺点:

1分表分库后ID会重复

2)通过设置固定步长解决分表带来的问题,但扩容不方便

3网络异常时无法判断插入是否成功,如果在执行语句时发生。网络中断,客户端无法知道事务是否成功,即使成功,也无法再获得产生的 ID

2.2、当前时间毫秒值

优点:

1)性能好

2)不依赖数据库,id能优先生成

缺点:

1并发超过1000时,会产生重复ID

2)时钟回拨会产生重复ID

3)分布式应用不适用

2.3、UUID

优点:

1)简单、性能好

2)不受分表分库影响

缺点:

1无法保证递增趋势

2UUID32位字符串,占用空间大

3)查询性能慢,作为数据库主键时,新增数据效率慢,会对索引重排序

2.4、数据库ID分组(设置不同的自增步长)

和数据库自增类似,只是设置不同的步长,可满足分布式应用ID重复的场景,但不易扩容

2.5、Snowflake算法

优点:全局唯一性,并发高,性能好,易恢复,易扩展

缺点:收时钟回拨影响

2.6、Redis键自增

三、实现思路

3.1  Snowflake算法

eb7cf8eca93211fa300b3d500c4301f033b.jpg

11位:符号位,0表示正数,1表示负数,发号器第一位默认为0

22-42位:时间戳,精确到毫秒

343-52位:机器ID机房ID+服务器ID

453-64位:序列号,自增长,支持同一个节点1ms可产生4096ID

3.2  redis实现思路

f8d4fe9bf30440463f4c2e10489c8a23cd2.jpg

1)每次预先从redis取一批有效的ID,用完后再去redis取,提高性能

2)发号器sdk保证线程安全

3)redis保证ID唯一性

转载于:https://my.oschina.net/u/732520/blog/2231478

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值