分布式id生成
分布式id問題來源于分庫分表,一張表可能多庫中存在多表,所以傳統(tǒng)自增的主鍵會出現(xiàn)重復(fù);需要利用分布式來解決,分配主鍵不重復(fù)。
分布式id在分布式的前提下,有以下幾點需求:
唯一、高性能、高可用、簡單、利于數(shù)據(jù)庫存儲查找等
介紹以下幾種方式
UUID
UUID生成簡單,一行代碼,而且本地生成不需要資源;生成直接可用
缺點:過長,純字符,無規(guī)則,不適合數(shù)據(jù)庫主鍵,影響性能以及數(shù)據(jù)變動需要改變位置
數(shù)據(jù)庫自增id
維護一張表,向表中插入數(shù)據(jù)返回自增id;
缺點:數(shù)據(jù)庫會成為分布式高并發(fā)的瓶頸,且單機不能保證高可用
數(shù)據(jù)庫集群生成id
幾個庫一起生成id,通過起點、步長不一致保證唯一
缺點:不利于擴容,需要改動所有機器規(guī)則;還不能滿足高并發(fā)
數(shù)據(jù)庫號段模式
維護一張表,max_id,step,version基本元素,每次取一段數(shù)值(id取值)到內(nèi)存中使用,使用后更新表中max_id值,更新version保證并發(fā)正確性
redis
利用redis數(shù)字型原子自增(incr),需要注意redis持久化問題
雪花算法
1數(shù)字位 41時間戳 10機器位 12序列號
數(shù)據(jù)位取0為整數(shù),時間戳建議當前-一個固定值可以取更多數(shù)據(jù),機器位 機房+機器