偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Redis 分布式鎖|從青銅到鉆石的五種演進(jìn)方案

存儲(chǔ) 存儲(chǔ)軟件 分布式 Redis
目前題目微服務(wù)被拆分成了四個(gè)微服務(wù)。前端請(qǐng)求進(jìn)來(lái)時(shí),會(huì)被轉(zhuǎn)發(fā)到不同的微服務(wù)。假如前端接收了 10 W 個(gè)請(qǐng)求,每個(gè)微服務(wù)接收 2.5 W 個(gè)請(qǐng)求,假如緩存失效了,每個(gè)微服務(wù)在訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí)加鎖,通過(guò)鎖(synchronzied 或 lock)來(lái)鎖住自己的線(xiàn)程資源,從而防止緩存擊穿。

[[396901]]

上篇我們講到如何用本地內(nèi)存:《緩存實(shí)戰(zhàn)(上篇)》 來(lái)做緩存從而增強(qiáng)系統(tǒng)的性能,另外探討了加鎖解決緩存擊穿的問(wèn)題。但是本地加鎖的方式在分布式的場(chǎng)景下就不適用了,所以本文我們來(lái)探討下如何引入分布式鎖解決本地鎖的問(wèn)題。本篇所有代碼和業(yè)務(wù)基于我的開(kāi)源項(xiàng)目 PassJava。

本篇主要內(nèi)容如下:

一、本地鎖的問(wèn)題

首先我們來(lái)回顧下本地鎖的問(wèn)題:

目前題目微服務(wù)被拆分成了四個(gè)微服務(wù)。前端請(qǐng)求進(jìn)來(lái)時(shí),會(huì)被轉(zhuǎn)發(fā)到不同的微服務(wù)。假如前端接收了 10 W 個(gè)請(qǐng)求,每個(gè)微服務(wù)接收 2.5 W 個(gè)請(qǐng)求,假如緩存失效了,每個(gè)微服務(wù)在訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí)加鎖,通過(guò)鎖(synchronzied 或 lock)來(lái)鎖住自己的線(xiàn)程資源,從而防止緩存擊穿。

這是一種本地加鎖的方式,在分布式情況下會(huì)帶來(lái)數(shù)據(jù)不一致的問(wèn)題:比如服務(wù) A 獲取數(shù)據(jù)后,更新緩存 key =100,服務(wù) B 不受服務(wù) A 的鎖限制,并發(fā)去更新緩存 key = 99,最后的結(jié)果可能是 99 或 100,但這是一種未知的狀態(tài),與期望結(jié)果不一致。流程圖如下所示:

二、什么是分布式鎖

基于上面本地鎖的問(wèn)題,我們需要一種支持分布式集群環(huán)境下的鎖:查詢(xún) DB 時(shí),只有一個(gè)線(xiàn)程能訪(fǎng)問(wèn),其他線(xiàn)程都需要等待第一個(gè)線(xiàn)程釋放鎖資源后,才能繼續(xù)執(zhí)行。

生活中的案例:可以把鎖看成房門(mén)外的一把鎖,所有并發(fā)線(xiàn)程比作人,他們都想進(jìn)入房間,房間內(nèi)只能有一個(gè)人進(jìn)入。當(dāng)有人進(jìn)入后,將門(mén)反鎖,其他人必須等待,直到進(jìn)去的人出來(lái)。

我們來(lái)看下分布式鎖的基本原理,如下圖所示:

我們來(lái)分析下上圖的分布式鎖:

  • 1.前端將 10W 的高并發(fā)請(qǐng)求轉(zhuǎn)發(fā)給四個(gè)題目微服務(wù)。
  • 2.每個(gè)微服務(wù)處理 2.5 W 個(gè)請(qǐng)求。
  • 3.每個(gè)處理請(qǐng)求的線(xiàn)程在執(zhí)行業(yè)務(wù)之前,需要先搶占鎖。可以理解為“占坑”。
  • 4.獲取到鎖的線(xiàn)程在執(zhí)行完業(yè)務(wù)后,釋放鎖。可以理解為“釋放坑位”。
  • 5.未獲取到的線(xiàn)程需要等待鎖釋放。
  • 6.釋放鎖后,其他線(xiàn)程搶占鎖。
  • 7.重復(fù)執(zhí)行步驟 4、5、6。

大白話(huà)解釋?zhuān)核姓?qǐng)求的線(xiàn)程都去同一個(gè)地方“占坑”,如果有坑位,就執(zhí)行業(yè)務(wù)邏輯,沒(méi)有坑位,就需要其他線(xiàn)程釋放“坑位”。這個(gè)坑位是所有線(xiàn)程可見(jiàn)的,可以把這個(gè)坑位放到 Redis 緩存或者數(shù)據(jù)庫(kù),這篇講的就是如何用 Redis 做“分布式坑位”。

三、Redis 的 SETNX

Redis 作為一個(gè)公共可訪(fǎng)問(wèn)的地方,正好可以作為“占坑”的地方。

用 Redis 實(shí)現(xiàn)分布式鎖的幾種方案,我們都是用 SETNX 命令(設(shè)置 key 等于某 value)。只是高階方案?jìng)鞯膮?shù)個(gè)數(shù)不一樣,以及考慮了異常情況。

我們來(lái)看下這個(gè)命令,SETNX是set If not exist的簡(jiǎn)寫(xiě)。意思就是當(dāng) key 不存在時(shí),設(shè)置 key 的值,存在時(shí),什么都不做。

在 Redis 命令行中是這樣執(zhí)行的:

  1. set <key> <value> NX 

我們可以進(jìn)到 redis 容器中來(lái)試下 SETNX 命令。

先進(jìn)入容器:

  1. docker exec -it <容器 id> redid-cli 

然后執(zhí)行 SETNX 命令:將 wukong 這個(gè) key 對(duì)應(yīng)的 value 設(shè)置成 1111。

  1. set wukong 1111 NX 

返回 OK,表示設(shè)置成功。重復(fù)執(zhí)行該命令,返回 nil表示設(shè)置失敗。

四、青銅方案

我們先用 Redis 的 SETNX 命令來(lái)實(shí)現(xiàn)最簡(jiǎn)單的分布式鎖。

3.1 青銅原理

我們來(lái)看下流程圖:

  • 多個(gè)并發(fā)線(xiàn)程都去 Redis 中申請(qǐng)鎖,也就是執(zhí)行 setnx 命令,假設(shè)線(xiàn)程 A 執(zhí)行成功,說(shuō)明當(dāng)前線(xiàn)程 A 獲得了。
  • 其他線(xiàn)程執(zhí)行 setnx 命令都會(huì)是失敗的,所以需要等待線(xiàn)程 A 釋放鎖。
  • 線(xiàn)程 A 執(zhí)行完自己的業(yè)務(wù)后,刪除鎖。
  • 其他線(xiàn)程繼續(xù)搶占鎖,也就是執(zhí)行 setnx 命令。因?yàn)榫€(xiàn)程 A 已經(jīng)刪除了鎖,所以又有其他線(xiàn)程可以搶占到鎖了。

代碼示例如下,Java 中 setnx 命令對(duì)應(yīng)的代碼為 setIfAbsent。

setIfAbsent 方法的第一個(gè)參數(shù)代表 key,第二個(gè)參數(shù)代表值。

  1. // 1.先搶占鎖 
  2. Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock""123"); 
  3. if(lock) { 
  4.   // 2.搶占成功,執(zhí)行業(yè)務(wù) 
  5.   List<TypeEntity> typeEntityListFromDb = getDataFromDB(); 
  6.   // 3.解鎖 
  7.   redisTemplate.delete("lock"); 
  8.   return typeEntityListFromDb; 
  9. else { 
  10.   // 4.休眠一段時(shí)間 
  11.   sleep(100); 
  12.   // 5.搶占失敗,等待鎖釋放 
  13.   return getTypeEntityListByRedisDistributedLock(); 

一個(gè)小問(wèn)題:那為什么需要休眠一段時(shí)間?

因?yàn)樵摮绦虼嬖谶f歸調(diào)用,可能會(huì)導(dǎo)致??臻g溢出。

3.2 青銅方案的缺陷

青銅之所以叫青銅,是因?yàn)樗亲畛跫?jí)的,肯定會(huì)帶來(lái)很多問(wèn)題。

設(shè)想一種家庭場(chǎng)景:晚上小空一個(gè)人開(kāi)鎖進(jìn)入了房間,打開(kāi)了電燈??,然后突然斷電了,小空想開(kāi)門(mén)出去,但是找不到門(mén)鎖位置,那小明就進(jìn)不去了,外面的人也進(jìn)不來(lái)。

從技術(shù)的角度看:setnx 占鎖成功,業(yè)務(wù)代碼出現(xiàn)異?;蛘叻?wù)器宕機(jī),沒(méi)有執(zhí)行刪除鎖的邏輯,就造成了死鎖。

那如何規(guī)避這個(gè)風(fēng)險(xiǎn)呢?

設(shè)置鎖的自動(dòng)過(guò)期時(shí)間,過(guò)一段時(shí)間后,自動(dòng)刪除鎖,這樣其他線(xiàn)程就能獲取到鎖了。

四、白銀方案

4.1 生活中的例子

上面提到的青銅方案會(huì)有死鎖問(wèn)題,那我們就用上面的規(guī)避風(fēng)險(xiǎn)的方案來(lái)設(shè)計(jì)下,也就是我們的白銀方案。

還是生活中的例子:小空開(kāi)鎖成功后,給這款智能鎖設(shè)置了一個(gè)沙漏倒計(jì)時(shí)?,沙漏完后,門(mén)鎖自動(dòng)打開(kāi)。即使房間突然斷電,過(guò)一段時(shí)間后,鎖會(huì)自動(dòng)打開(kāi),其他人就可以進(jìn)來(lái)了。

4.2 技術(shù)原理圖

和青銅方案不同的地方在于,在占鎖成功后,設(shè)置鎖的過(guò)期時(shí)間,這兩步是分步執(zhí)行的。如下圖所示:

4.3 示例代碼

清理 redis key 的代碼如下

  1. // 在 10s 以后,自動(dòng)清理 lock 
  2. redisTemplate.expire("lock", 10, TimeUnit.SECONDS); 

完整代碼如下:

  1. // 1.先搶占鎖 
  2. Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock""123"); 
  3. if(lock) { 
  4.     // 2.在 10s 以后,自動(dòng)清理 lock 
  5.     redisTemplate.expire("lock", 10, TimeUnit.SECONDS); 
  6.     // 3.搶占成功,執(zhí)行業(yè)務(wù) 
  7.     List<TypeEntity> typeEntityListFromDb = getDataFromDB(); 
  8.     // 4.解鎖 
  9.     redisTemplate.delete("lock"); 
  10.     return typeEntityListFromDb; 

4.4 白銀方案的缺陷

白銀方案看似解決了線(xiàn)程異?;蚍?wù)器宕機(jī)造成的鎖未釋放的問(wèn)題,但還是存在其他問(wèn)題:

因?yàn)檎兼i和設(shè)置過(guò)期時(shí)間是分兩步執(zhí)行的,所以如果在這兩步之間發(fā)生了異常,則鎖的過(guò)期時(shí)間根本就沒(méi)有設(shè)置成功。

所以和青銅方案有一樣的問(wèn)題:鎖永遠(yuǎn)不能過(guò)期。

五、黃金方案

5.1 原子指令

上面的白銀方案中,占鎖和設(shè)置鎖過(guò)期時(shí)間是分步兩步執(zhí)行的,這個(gè)時(shí)候,我們可以聯(lián)想到什么:事務(wù)的原子性(Atom)。

原子性:多條命令要么都成功執(zhí)行,要么都不執(zhí)行。

將兩步放在一步中執(zhí)行:占鎖+設(shè)置鎖過(guò)期時(shí)間。

Redis 正好支持這種操作:

  1. # 設(shè)置某個(gè) key 的值并設(shè)置多少毫秒或秒 過(guò)期。 
  2. set <key> <value> PX <多少毫秒> NX 
  3. 或 
  4. set <key> <value> EX <多少秒> NX 

然后可以通過(guò)如下命令查看 key 的變化

 

  1. ttl <key

下面演示下如何設(shè)置 key 并設(shè)置過(guò)期時(shí)間。注意:執(zhí)行命令之前需要先刪除 key,可以通過(guò)客戶(hù)端或命令刪除。

  1. # 設(shè)置 key=wukong,value=1111,過(guò)期時(shí)間=5000ms 
  2. set wukong 1111 PX 5000 NX 
  3. # 查看 key 的狀態(tài) 
  4. ttl wukong 

執(zhí)行結(jié)果如下圖所示:每運(yùn)行一次 ttl 命令,就可以看到 wukong 的過(guò)期時(shí)間就會(huì)減少。最后會(huì)變?yōu)?-2(已過(guò)期)。

5.2 技術(shù)原理圖

黃金方案和白銀方案的不同之處:獲取鎖的時(shí)候,也需要設(shè)置鎖的過(guò)期時(shí)間,這是一個(gè)原子操作,要么都成功執(zhí)行,要么都不執(zhí)行。如下圖所示:

5.3 示例代碼

設(shè)置 lock 的值等于 123,過(guò)期時(shí)間為 10 秒。如果 10 秒 以后,lock 還存在,則清理 lock。

  1. setIfAbsent("lock""123", 10, TimeUnit.SECONDS); 

5.4 黃金方案的缺陷

我們還是舉生活中的例子來(lái)看下黃金方案的缺陷。

5.4.1 用戶(hù) A 搶占鎖

  • 用戶(hù) A 先搶占到了鎖,并設(shè)置了這個(gè)鎖 10 秒以后自動(dòng)開(kāi)鎖,鎖的編號(hào)為 123。
  • 10 秒以后,A 還在執(zhí)行任務(wù),此時(shí)鎖被自動(dòng)打開(kāi)了。

5.4.2 用戶(hù) B 搶占鎖

  • 用戶(hù) B 看到房間的鎖打開(kāi)了,于是搶占到了鎖,設(shè)置鎖的編號(hào)為 123,并設(shè)置了過(guò)期時(shí)間 10 秒。
  • 因房間內(nèi)只允許一個(gè)用戶(hù)執(zhí)行任務(wù),所以用戶(hù) A 和 用戶(hù) B 執(zhí)行任務(wù)產(chǎn)生了沖突。
  • 用戶(hù) A 在 15 s 后,完成了任務(wù),此時(shí) 用戶(hù) B 還在執(zhí)行任務(wù)。
  • 用戶(hù) A 主動(dòng)打開(kāi)了編號(hào)為 123的鎖。
  • 用戶(hù) B 還在執(zhí)行任務(wù),發(fā)現(xiàn)鎖已經(jīng)被打開(kāi)了。
  • 用戶(hù) B 非常生氣:我還沒(méi)執(zhí)行完任務(wù)呢,鎖怎么開(kāi)了?

5.4.3 用戶(hù) C 搶占鎖

  • 用戶(hù) B 的鎖被 A 主動(dòng)打開(kāi)后,A 離開(kāi)房間,B 還在執(zhí)行任務(wù)。
  • 用戶(hù) C 搶占到鎖,C 開(kāi)始執(zhí)行任務(wù)。
  • 因房間內(nèi)只允許一個(gè)用戶(hù)執(zhí)行任務(wù),所以用戶(hù) B 和 用戶(hù) C 執(zhí)行任務(wù)產(chǎn)生了沖突。

從上面的案例中我們可以知道,因?yàn)橛脩?hù) A 處理任務(wù)所需要的時(shí)間大于鎖自動(dòng)清理(開(kāi)鎖)的時(shí)間,所以在自動(dòng)開(kāi)鎖后,又有其他用戶(hù)搶占到了鎖。當(dāng)用戶(hù) A 完成任務(wù)后,會(huì)把其他用戶(hù)搶占到的鎖給主動(dòng)打開(kāi)。

這里為什么會(huì)打開(kāi)別人的鎖?因?yàn)殒i的編號(hào)都叫做 “123”,用戶(hù) A 只認(rèn)鎖編號(hào),看見(jiàn)編號(hào)為 “123”的鎖就開(kāi),結(jié)果把用戶(hù) B 的鎖打開(kāi)了,此時(shí)用戶(hù) B 還未執(zhí)行完任務(wù),當(dāng)然生氣了。

六、鉑金方案

6.1 生活中的例子

上面的黃金方案的缺陷也很好解決,給每個(gè)鎖設(shè)置不同的編號(hào)不就好了~

如下圖所示,B 搶占的鎖是藍(lán)色的,和 A 搶占到綠色鎖不一樣。這樣就不會(huì)被 A 打開(kāi)了。

做了個(gè)動(dòng)圖,方便理解:

動(dòng)圖演示

靜態(tài)圖更高清,可以看看:

6.2 技術(shù)原理圖

與黃金方案的不同之處:

  • 設(shè)置鎖的過(guò)期時(shí)間時(shí),還需要設(shè)置唯一編號(hào)。
  • 主動(dòng)刪除鎖的時(shí)候,需要判斷鎖的編號(hào)是否和設(shè)置的一致,如果一致,則認(rèn)為是自己設(shè)置的鎖,可以進(jìn)行主動(dòng)刪除。

6.3 代碼示例

  1. // 1.生成唯一 id 
  2. String uuid = UUID.randomUUID().toString(); 
  3. // 2. 搶占鎖 
  4. Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 10, TimeUnit.SECONDS); 
  5. if(lock) { 
  6.     System.out.println("搶占成功:" + uuid); 
  7.     // 3.搶占成功,執(zhí)行業(yè)務(wù) 
  8.     List<TypeEntity> typeEntityListFromDb = getDataFromDB(); 
  9.     // 4.獲取當(dāng)前鎖的值 
  10.     String lockValue = redisTemplate.opsForValue().get("lock"); 
  11.     // 5.如果鎖的值和設(shè)置的值相等,則清理自己的鎖 
  12.     if(uuid.equals(lockValue)) { 
  13.         System.out.println("清理鎖:" + lockValue); 
  14.         redisTemplate.delete("lock"); 
  15.     } 
  16.     return typeEntityListFromDb; 
  17. else { 
  18.     System.out.println("搶占失敗,等待鎖釋放"); 
  19.     // 4.休眠一段時(shí)間 
  20.     sleep(100); 
  21.     // 5.搶占失敗,等待鎖釋放 
  22.     return getTypeEntityListByRedisDistributedLock(); 
  • 1.生成隨機(jī)唯一 id,給鎖加上唯一值。
  • 2.搶占鎖,并設(shè)置過(guò)期時(shí)間為 10 s,且鎖具有隨機(jī)唯一 id。
  • 3.搶占成功,執(zhí)行業(yè)務(wù)。
  • 4.執(zhí)行完業(yè)務(wù)后,獲取當(dāng)前鎖的值。
  • 5.如果鎖的值和設(shè)置的值相等,則清理自己的鎖。

6.4 鉑金方案的缺陷

上面的方案看似很完美,但還是存在問(wèn)題:第 4 步和第 5 步并不是原子性的。

  • 時(shí)刻:0s。線(xiàn)程 A 搶占到了鎖。
  • 時(shí)刻:9.5s。線(xiàn)程 A 向 Redis 查詢(xún)當(dāng)前 key 的值。
  • 時(shí)刻:10s。鎖自動(dòng)過(guò)期。
  • 時(shí)刻:11s。線(xiàn)程 B 搶占到鎖。
  • 時(shí)刻:12s。線(xiàn)程 A 在查詢(xún)途中耗時(shí)長(zhǎng),終于拿多鎖的值。
  • 時(shí)刻:13s。線(xiàn)程 A 還是拿自己設(shè)置的鎖的值和返回的值進(jìn)行比較,值是相等的,清理鎖,但是這個(gè)鎖其實(shí)是線(xiàn)程 B 搶占的鎖。

那如何規(guī)避這個(gè)風(fēng)險(xiǎn)呢?鉆石方案登場(chǎng)。

七、鉆石方案

上面的線(xiàn)程 A 查詢(xún)鎖和刪除鎖的邏輯不是原子性的,所以將查詢(xún)鎖和刪除鎖這兩步作為原子指令操作就可以了。

7.1 技術(shù)原理圖

如下圖所示,紅色圈出來(lái)的部分是鉆石方案的不同之處。用腳本進(jìn)行刪除,達(dá)到原子操作。

7.2 代碼示例

那如何用腳本進(jìn)行刪除呢?

我們先來(lái)看一下這段 Redis 專(zhuān)屬腳本:

  1. if redis.call("get",KEYS[1]) == ARGV[1] 
  2. then 
  3.     return redis.call("del",KEYS[1]) 
  4. else 
  5.     return 0 
  6. end 

這段腳本和鉑金方案的獲取key,刪除key的方式很像。先獲取 KEYS[1] 的 value,判斷 KEYS[1] 的 value 是否和 ARGV[1] 的值相等,如果相等,則刪除 KEYS[1]。

那么這段腳本怎么在 Java 項(xiàng)目中執(zhí)行呢?

分兩步:先定義腳本;用 redisTemplate.execute 方法執(zhí)行腳本。

  1. // 腳本解鎖 
  2. String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end"
  3. redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList("lock"), uuid); 

上面的代碼中,KEYS[1] 對(duì)應(yīng)“lock”,ARGV[1] 對(duì)應(yīng) “uuid”,含義就是如果 lock 的 value 等于 uuid 則刪除 lock。

而這段 Redis 腳本是由 Redis 內(nèi)嵌的 Lua 環(huán)境執(zhí)行的,所以又稱(chēng)作 Lua 腳本。

那鉆石方案是不是就完美了呢?有沒(méi)有更好的方案呢?

下篇,我們?cè)賮?lái)介紹另外一種分布式鎖的王者方案:Redisson。

八、總結(jié)

本篇通過(guò)本地鎖的問(wèn)題引申出分布式鎖的問(wèn)題。然后介紹了五種分布式鎖的方案,由淺入深講解了不同方案的改進(jìn)之處。

從上面幾種方案的不斷演進(jìn)的過(guò)程中,知道了系統(tǒng)中哪些地方可能存在異常情況,以及該如何更好地進(jìn)行處理。

舉一反三,這種不斷演進(jìn)的思維模式也可以運(yùn)用到其他技術(shù)中。

下面總結(jié)下上面五種方案的缺陷和改進(jìn)之處。

青銅方案:

  • 缺陷:業(yè)務(wù)代碼出現(xiàn)異?;蛘叻?wù)器宕機(jī),沒(méi)有執(zhí)行主動(dòng)刪除鎖的邏輯,就造成了死鎖。
  • 改進(jìn):設(shè)置鎖的自動(dòng)過(guò)期時(shí)間,過(guò)一段時(shí)間后,自動(dòng)刪除鎖,這樣其他線(xiàn)程就能獲取到鎖了。

白銀方案:

  • 缺陷:占鎖和設(shè)置鎖過(guò)期時(shí)間是分步兩步執(zhí)行的,不是原子操作。
  • 改進(jìn):占鎖和設(shè)置鎖過(guò)期時(shí)間保證原子操作。

黃金方案:

  • 缺陷:主動(dòng)刪除鎖時(shí),因鎖的值都是相同的,將其他客戶(hù)端占用的鎖刪除了。
  • 改進(jìn):每次占用的鎖,隨機(jī)設(shè)為較大的值,主動(dòng)刪除鎖時(shí),比較鎖的值和自己設(shè)置的值是否相等。

鉑金方案:

  • 缺陷:獲取鎖、比較鎖的值、刪除鎖,這三步是非原子性的。中途又可能鎖自動(dòng)過(guò)期了,又被其他客戶(hù)端搶占了鎖,導(dǎo)致刪鎖時(shí)把其他客戶(hù)端占用的鎖刪了。
  • 改進(jìn):使用 Lua 腳本進(jìn)行獲取鎖、比較鎖、刪除鎖的原子操作。

鉆石方案:

  • 缺陷:非專(zhuān)業(yè)的分布式鎖方案。
  • 改進(jìn):Redission 分布式鎖。

王者方案,下篇見(jiàn)~

上述所有代碼都基于 PassJava 開(kāi)源項(xiàng)目,后端、前端、小程序都上傳到同一個(gè)倉(cāng)庫(kù)里面了,大家可以通過(guò) github 或 碼云訪(fǎng)問(wèn)。地址如下:

Github: https://github.com/Jackson0714/PassJava-Platform

碼云:https://gitee.com/jayh2018/PassJava-Platform

配套教程:www.passjava.cn

參考資料:

http://redis.cn/commands/set.html

https://www.bilibili.com/video/BV1np4y1C7Yf

本文轉(zhuǎn)載自微信公眾號(hào)「悟空聊架構(gòu)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系悟空聊架構(gòu)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 悟空聊架構(gòu)
相關(guān)推薦

2023-04-03 10:00:00

Redis分布式

2021-11-26 06:43:19

Java分布式

2019-06-19 15:40:06

分布式鎖RedisJava

2023-03-01 08:07:51

2024-06-07 07:41:03

2021-03-07 16:11:26

Redis分布式

2022-06-16 08:01:24

redis分布式鎖

2022-01-06 10:58:07

Redis數(shù)據(jù)分布式鎖

2023-08-21 19:10:34

Redis分布式

2013-06-07 13:46:29

分布式存儲(chǔ)自動(dòng)化運(yùn)維

2020-10-19 07:30:57

Java Redis 開(kāi)發(fā)

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2023-09-13 09:52:14

分布式鎖Java

2023-09-28 08:39:23

分布式鎖Redis

2022-06-14 15:28:37

數(shù)據(jù)庫(kù)存儲(chǔ)系統(tǒng)變革趨勢(shì)

2024-04-22 08:10:29

2024-05-16 07:51:55

分布式系統(tǒng)架構(gòu)

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2024-10-07 10:07:31

2022-09-19 08:17:09

Redis分布式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)