更新時(shí)間:2020年07月09日11時(shí)42分 來(lái)源:傳智播客 瀏覽次數(shù):
當(dāng)我們web系統(tǒng)處于初期系統(tǒng)的時(shí)候,用戶量比較小,我們的數(shù)據(jù)庫(kù)的數(shù)據(jù)生成主鍵的時(shí)候可以采用increment自增策略,簡(jiǎn)單的做id的唯一生成器, 這種模式我們的web服務(wù)器不需要做額外的操作就可以保證數(shù)據(jù)庫(kù)中主鍵是唯一的,但是隨著業(yè)務(wù)量和用戶量增長(zhǎng),我們就會(huì)做web集群和數(shù)據(jù)庫(kù)集群。如下圖所示:
在圖中,我們發(fā)現(xiàn)當(dāng)數(shù)據(jù)庫(kù)集群化,就不能在使用increment自增了(這里暫時(shí)不考慮oracle的sequence的方案,因?yàn)閛racle要錢(qián)啊,手動(dòng)滑稽)。因?yàn)閿?shù)據(jù)庫(kù)自增長(zhǎng)是依賴表的,分表分庫(kù)之后就不行了。這時(shí)候我們需要一個(gè)策略可以實(shí)現(xiàn)id的自增且不唯一,這里給出一個(gè)方案使用redis的方案,因?yàn)閞edis是單線程的。不會(huì)有線程安全問(wèn)題,redis提供了incr和incrby兩種安全的自增方法。我們可以在web服務(wù)器端直接調(diào)用redis的方案.在業(yè)務(wù)層就給出一個(gè)唯一自增的id。如下圖所示:
如圖中所示我們可以使用同一的redis服務(wù)器生成id,具體的代碼實(shí)現(xiàn) 這里使用java實(shí)現(xiàn) 使用jedis作為通信的工具包,封裝兩個(gè)工具類。第一個(gè)類是用來(lái)封裝跟redis獲取連接相關(guān)工具類。
這里需要用到一個(gè)配置文件:
接下來(lái)是redis生成id工具類
我們就可以直接用IDGenerator的next方法傳入一個(gè)字符串作為key生成id 比如說(shuō)要為用戶生成id,可以給出一個(gè)"user"字符串 。
猜你喜歡:
Java中級(jí)程序員培訓(xùn)課程
北京校區(qū)