Redis分佈式鎖實現

 

1、分佈式鎖的實現方式

分佈式鎖通常有三種實現方式:
    1. 數據庫樂觀鎖;
    2. 基於Redis的分佈式鎖;
    3. 基於ZooKeeper的分佈式鎖;java

2、鎖的四要素

    1.互斥性。在任意時刻,只有一個客戶端能持有鎖。
    2.不會發生死鎖。即便有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證後續其餘客戶端能加鎖。
    3.具備容錯性。只要大部分的Redis節點正常運行,客戶端就能夠加鎖和解鎖。
    4.解鈴還須繫鈴人。加鎖和解鎖必須是同一個客戶端,客戶端本身不能把別人加的鎖給解了。redis

3、Redis分佈式鎖的實現

加鎖:

1.正確姿式:數據庫

String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
"OK".equal(result);//成功時返回OK

2.錯誤使用:
使用setnx & expire
。。。分佈式

解鎖:

1.正確姿式:(將Lua代碼傳到jedis.eval()方法)spa

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));
Long.valueOf(1L).equal(result);//成功時返回1

執行eval()方法能夠確保原子性,源於Redis的特性;
官網解釋:
    在eval命令執行Lua代碼的時候,Lua代碼將被當成一個命令去執行,而且直到eval命令執行完成,Redis纔會執行其餘命令;.net

2.錯誤使用
直接del 或者 requestId比較後刪除delcode

 

分佈式鎖實現:https://xiaozhuanlan.com/topic/4672859130blog

相關文章
相關標籤/搜索