redis簡單的分布式鎖

2021-10-10 18:42:45 字數 1241 閱讀 9881

一、前言

分布式鎖,其實原理是就是多台機器,去爭搶乙個資源,誰爭搶成功,那麼誰就持有了這把鎖,然後去執行後續的業務邏輯,執行完畢後,把鎖釋放掉。

可以通過多種途徑實現分布式鎖,例如利用資料庫(mysql等)樂觀鎖和悲觀鎖;還可通過zookeeper來實現分布式鎖,建立順序節點輪到誰就是誰。本文介紹通過redis來實現分布式鎖。

本文使用springboot提供的redistemplate來操作redis,這裡對使用redistemplate來操作redis做了介紹。當然也可以直接使用jedis來操作redis,大家可以參考下jedis的文件,使用上都是大同小異的。

二、實現分布式鎖的步驟

第一步:通過redis的setnx方式(不存在則設定),往redis上設定乙個帶有過期時間的key,如果設定成功,則獲得了分布式鎖。這裡設定過期時間,是防止在釋放鎖的時候出現異常導致鎖釋放不掉。

第二步:執行完業務操作之後,刪除該鎖。

三、編寫工具類

@component

public class redislockutils

public boolean dellock(string lockid)

}

setifabsent方法,就是當鍵不存在的時候,設定,並且該方法可以設定鍵的過期時間。該方法對應到redis的原生命令就是:

set lockid content px millisecond nx
至於設定多少的過期時間合適,這個是沒有定論的,需要根據真是的業務場景來衡量。

釋放鎖

當處理完業務邏輯後,需要手動的把鎖釋放掉。

釋放鎖的操作比較簡單,直接刪除之前設定的鍵即可。其實,基於redis實現分布式鎖的方式,在釋放鎖的時候,是存在釋放失敗的風險的(比如網路抖動什麼的),這也是為什麼在設定鎖的時候需要設定過期時間的原因,可以防止在出現異常的時候,鎖會自動的消失掉。同時,我們也可以增加幾次失敗之後的重試機制。

四、測試

flag=redislockutils.getlock("redislock",5*60*1000);

log.info("傳送郵件開始獲取鎖{}",flag);

if(!flag)

//執行業務

flag=redislockutils.dellock("redislock");

如果沒有得到鎖等待則可以寫個while迴圈直到獲得為止

五、總結

簡單聊聊分布式鎖 Redis分布式鎖

單機redis分布式鎖 單機redis分布式鎖 首先咱們先聊聊單機的redis分布式鎖 第乙個最普通的實現方式,就是在 redis 裡使用 setnx 命令建立乙個 key,這樣就算加鎖。set resource name my random value nx px 30000執行這個命令就 ok。...

Redis分布式鎖簡單實現

偽 下訂單 1 查庫存 getstock 2 判斷庫存 stock 0下單 3 下單 addorder 4 減庫存 public class redisutils setnx param key param value param seconds 過期時間,單位秒 return public sta...

Redis分布式鎖簡單實戰

redis就話不多說了,上乾貨。1 引包 redis.clients groupid jedis artifactid 2.9.3 version dependency org.springframework.boot groupid spring boot starter redis artifa...