分布式id生成
分布式id問題來源于分庫分表,一張表可能多庫中存在多表桶蛔,所以傳統(tǒng)自增的主鍵會出現(xiàn)重復;需要利用分布式來解決漫谷,分配主鍵不重復仔雷。
分布式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ù),機器位 機房+機器