snowflake 的思考

概念和实现

snowflake算法的思路很简单,就是把时间放在前面,机器码放在后面做bit拼接:
前面的41bit 为ms时间,后面12bit为序号,所以1m最多生成 2 12 2^{12} 212 4096个ID

这里写图片描述

实现也很简单,比如:
https://blog.csdn.net/yuanyuanispeak/article/details/54969029
官方的链接:
https://github.com/twitter/snowflake

mongoObjectId的实现和snowflake很像,不过前面的时间是秒级别的,后面24位的序列号,其实容量是要比snowflake 更大的
这里写图片描述

和uuid 比较

相同:

  • 同样是内存生成,不需要依赖数据库等其他东西
  • 同样满足分布式唯一

不同:
uuid 无序,snowflake 趋势递增
snowflake 个适合作为数据库的主键(索引?)
snowflake 时间回拨时,有可能发生重复

思考

感觉snowflake的会有的一些问题:

1.由于服务器时间并不是完全同步,所以虽然对单台服务器来说ID是递增的,但不同服务器间生成的ID并不是随时间递增的。

2.服务器时间回拨(如果服务器时间差别过大,会使用授时服务调整服务器时间),可能会引起ID 重复,解决方法可以是:

  • 回拨后使用不同的机器Id
  • 停止服务一段时间,比如回报100ms,则服务停止100ms

参考:
漫画:什么是SnowFlake算法?
https://jiasule.v2ex.com/t/430285
http://www.cnblogs.com/haoxinyue/p/5208136.html
https://tech.meituan.com/MT_Leaf.html (美团的这篇,稍微有些不好懂,建议看完上面两篇再看)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值