1、發號器特徵redis
1)全局惟一性:保證不會出現重複ID算法
2)有序性:保證必定的順序性數據庫
3)易擴展:方便擴容安全
4)易恢復:服務不可用時或數據能從原服務器恢復服務器
5)高性能網絡
2、實現發號器的方式併發
2.一、數據庫自增分佈式
優勢:性能
1)保證惟一性spa
2)保證順序遞增
3)簡單
缺點:
1)分表分庫後ID會重複
2)經過設置固定步長解決分錶帶來的問題,但擴容不方便
3)網絡異常時沒法判斷插入是否成功,若是在執行語句時發生。網絡中斷,客戶端沒法知道事務是否成功,即便成功,也無法再得到產生的 ID
2.二、當前時間毫秒值
優勢:
1)性能好
2)不依賴數據庫,id能優先生成
缺點:
1)併發超過1000時,會產生重複ID
2)時鐘回撥會產生重複ID
3)分佈式應用不適用
2.三、UUID
優勢:
1)簡單、性能好
2)不受分表分庫影響
缺點:
1)沒法保證遞增趨勢
2)UUID用32位字符串,佔用空間大
3)查詢性能慢,做爲數據庫主鍵時,新增數據效率慢,會對索引重排序
2.四、數據庫ID分組(設置不一樣的自增步長)
和數據庫自增相似,只是設置不一樣的步長,可知足分佈式應用ID重複的場景,但不易擴容
2.五、Snowflake算法
優勢:全局惟一性,併發高,性能好,易恢復,易擴展
缺點:收時鐘回撥影響
2.六、Redis鍵自增
3、實現思路
3.1 Snowflake算法
1)第1位:符號位,0表示正數,1表示負數,發號器第一位默認爲0
2)第2-42位:時間戳,精確到毫秒
3)第43-52位:機器ID(機房ID+服務器ID)
4)第53-64位:序列號,自增加,支持同一個節點1ms可產生4096個ID
3.2 redis實現思路
1)每次預先從redis取一批有效的ID,用完後再去redis取,提升性能
2)發號器sdk保證線程安全
3)redis保證ID惟一性