go实现雪花算法
唯一ID可以说是分布式场景下最常见的需求了,前几天发现有一个服务里面使用的唯一ID直接使用的纳秒时间戳
Id := time.Now().UnixNano()
这种唯一ID获取方式有没有什么问题了?
1.大并发情况下,有没有Id冲突?
2.多节点部署情况下有没有Id冲突?
3.如果有多个数据中心表数据要合并怎么办?
所以我们的选择一个更合适的唯一Id生成方案
在分布式场景下生成唯一ID方式有很多比如:
1.使用MySQL的自动增量 。优点实现简单,数据持久化,缺点并发不要,在多数据中心下数据无法合并。
2.使用redis incr 。 优点并发高,缺点无法持久化 。(这里要强调一点,redis默认和常用的持久化策略是有1s间隔的)
3.雪花算法。 优点 性能高,实现不去复杂 缺点:依赖计算机时钟,如果时钟错误可能导致Id回滚。
下面给一个雪花算法具体实现:
https://articles.zsxq.com/id_2d5vftkn7l45.html