java id生成器 分布式_分布式高效唯一ID生成器(sequence)
分布式高效唯一ID生成器(sequence)
簡介
高效GUID產生算法(sequence),基于Snowflake實現64位自增ID算法。
Twitter-Snowflake算法產生的背景相當簡單,為了滿足Twitter每秒上萬條消息的請求,每條消息都必須分配一條唯一的id,這些id還需要一些大致的順序(方便客戶端排序),并且在分布式系統中不同機器產生的id必須不同。
性能測試數據:
Snowflake算法核心
把時間戳,工作機器id,序列號組合在一起。
除了最高位bit標記為不可用以外,其余三組bit占位均可浮動,看具體的業務需求而定。默認情況下41bit的時間戳可以支持該算法使用到2082年,10bit的工作機器id可以支持1023臺機器,序列號支持1毫秒產生4095個自增序列id。下文會具體分析。
Snowflake – 時間戳
這里時間戳的細度是毫秒級,具體代碼如下,建議使用64位linux系統機器,因為有vdso,gettimeofday()在用戶態就可以完成操作,減少了進入內核態的損耗。
Snowflake – 工作機器id
嚴格意義上來說這個bit段的使用可以是進程級,機器級的話你可以使用MAC地址來唯一標示工作機器,工作進程級可以使用IP+Path來區分工作進程。如果工作機器比較少,可以使用配置文件來設置這個id是一個不錯的選擇,如果機器過多配置文件的維護是一個災難性的事情。
Snowflake – 序列號
序列號就是一系列的自增id(多線程建議使用atomic),為了處理在同一毫秒內需要給多條消息分配id,若同一毫秒把序列號用完了,則“等待至下一毫秒”。
獲取
cn.izern
sequence
${version}
使用
import cn.izern.sequence.Sequence;
Sequence sequence = new Sequence();
sequence.nextId();
線程安全,生成唯一序列ID
hibernate/jpa 使用Sequence作為ID生成方式
private Long id;
// other
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "cn.izern.hibernate.id.IDSequenceGenerator")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
總結
以上是生活随笔為你收集整理的java id生成器 分布式_分布式高效唯一ID生成器(sequence)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java分发器_SpringMVC核心分
- 下一篇: tokyo cabinet java_T