最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

單機redis分布式鎖實現(xiàn)原理解析

 更新時間:2020年04月26日 09:45:36   作者:Ayato  
這篇文章主要介紹了單機redis分布式鎖實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

最近我們有個服務(wù)經(jīng)常出現(xiàn)存儲的數(shù)據(jù)出現(xiàn)重復,首先上一個系統(tǒng)流程圖:

用戶通過http請求可以通知任務(wù)中心結(jié)束掉自己發(fā)送的任務(wù),這時候任務(wù)中心會通過MQ通知結(jié)束服務(wù)去結(jié)束任務(wù)保存數(shù)據(jù),由于任務(wù)結(jié)束數(shù)據(jù)計算保存有一定延時,所以存在用戶短時間內(nèi)多次結(jié)束同一個任務(wù),這時候就會導致我們結(jié)束服務(wù)對同一個任務(wù)保存多次數(shù)據(jù)。恰好我們也是用了redis,所以對于這個問題我當時想到使用分布式鎖來解決,那么如何用redis實現(xiàn)分布式鎖呢?

首先要明確一個分布式鎖應(yīng)具備的原則:

互斥性。在任意時刻,只有一個客戶端能持有鎖;不會發(fā)生死鎖。即使一個客戶端持有鎖的期間崩潰而沒有主動釋放鎖,也需要保證后續(xù)其他客戶端能夠加鎖成功;加鎖和解鎖必須是同一個客戶端;有高可用的獲取鎖和釋放鎖功能。

由于我們只使用了單機的redis,所以本文的實現(xiàn)不具備第四點原則。

我們這個鎖的實現(xiàn)就包括兩點:加鎖、解鎖。首先看加鎖。先上代碼:

public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) throws Exception{
    Jedis jedis = null;
    try {
      jedis = getJedisClient();
      String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
      if (LOCK_SUCCESS.equals(result)) {
        return true;
      }
      return false;
    } finally {
      returnResource(jedis);
    }
 }

我們的加鎖就是設(shè)置一個鍵值對,并且滿足以下條件:

確保只有當鍵不存在時才設(shè)置有效;設(shè)置的值必須是當前客戶端生成的uuid;鍵必須要有過期時間。

這三點條件就可以滿足上述的原則1、原則2。

接下來看下解鎖,代碼如下:

public boolean releaseDistributedLock(String lockKey, String requestId) throws Exception{
    Jedis jedis = null;
    try {
      jedis = getJedisClient();
      String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
      Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
      if (RELEASE_SUCCESS.equals(result)) {
        return true;
      }
      return false;
    }finally {
      returnResource(jedis);
    }
}

解鎖是通過一段lua腳本實現(xiàn),邏輯如下:

1、獲取鎖鍵值看是否與當初設(shè)置的值一致;

2、如果一致則刪除鍵。

由于解鎖過程分為兩步,為了確保原子性所以通過讓redis執(zhí)行l(wèi)ua腳本來實現(xiàn),校驗鍵值可以確保加鎖解鎖都是同一個客戶端。

這樣一個簡易的分布式鎖就實現(xiàn)完畢了,當然在本文開頭就說了,這個實現(xiàn)只能滿足單機redis的情況,對于redis集群其實是不嚴謹?shù)?,對于redis集群有一個redlock方案,我也在研究中,后面也會總結(jié)一下。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的實例代碼

    SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的實例代碼

    WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • java的poi技術(shù)讀取和導入Excel實例

    java的poi技術(shù)讀取和導入Excel實例

    本篇文章主要介紹了java的poi技術(shù)讀取和導入Excel實例,報表輸出是Java應(yīng)用開發(fā)中經(jīng)常涉及的內(nèi)容,有需要的可以了解一下。
    2016-11-11
  • Java兩整數(shù)相除向上取整的方式詳解(Math.ceil())

    Java兩整數(shù)相除向上取整的方式詳解(Math.ceil())

    在調(diào)外部接口獲取列表數(shù)據(jù)時,需要判斷是否已經(jīng)取完了所有的值,因此需要用到向上取整,下面這篇文章主要給大家介紹了關(guān)于Java兩整數(shù)相除向上取整的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java中的RASP機制實現(xiàn)詳解

    Java中的RASP機制實現(xiàn)詳解

    這篇文章主要介紹了Java中的RASP實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Java通過賣票理解多線程

    Java通過賣票理解多線程

    本文主要介紹了一個多線程賣票的例子,通過賣票這個實例來介紹多線程的方式,加深理解,需要的朋友可以參考下
    2017-09-09
  • springboot2如何禁用自帶tomcat的session功能

    springboot2如何禁用自帶tomcat的session功能

    這篇文章主要介紹了springboot2如何禁用自帶tomcat的session功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot中Redis數(shù)據(jù)庫的使用實例

    Spring Boot中Redis數(shù)據(jù)庫的使用實例

    Spring Boot中除了對常用的關(guān)系型數(shù)據(jù)庫提供了優(yōu)秀的自動化支持之外,對于很多NoSQL數(shù)據(jù)庫一樣提供了自動化配置的支持。本篇文章主要介紹了Spring Boot中Redis的使用實例代碼,有興趣的開業(yè)了解一下。
    2017-04-04
  • 簡單了解SpringCloud運行原理

    簡單了解SpringCloud運行原理

    這篇文章主要介紹了簡單了解SpringCloud運行原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 淺談Java幾種文件讀取方式耗時

    淺談Java幾種文件讀取方式耗時

    本文主要介紹了淺談Java幾種文件讀取方式耗時,主要介紹了4種,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Java Web過濾器詳解

    Java Web過濾器詳解

    這篇文章主要為大家詳細介紹了Java WEB過濾器的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

土默特左旗| 黄大仙区| 青田县| 上蔡县| 伊宁市| 焦作市| 佛山市| 广宗县| 彰化县| 双辽市| 稷山县| 洱源县| 临沧市| 原阳县| 昌江| 秭归县| 长春市| 武安市| 普安县| 驻马店市| 建瓯市| 剑河县| 梨树县| 武胜县| 灵石县| 仁寿县| 治多县| 平度市| 通城县| 墨玉县| 大埔区| 清流县| 石嘴山市| 右玉县| 图片| 东兰县| 喀喇沁旗| 滁州市| 丰县| 江华| 拜泉县|