redis對hash欄位加鎖

junwind發表於2021-11-23

評論中有人指出文案不對,修正一下

之前提了一個問題 , 見 問答:redis中,只能對key加鎖嗎

現在我大概清楚了,redis可以針對hash裡面的某一個k-v加過期機制,因此不用對整個hash加過期機制,減少併發時的報錯次數;提高體驗;

下面演示具體的實現

# 先新增一個hash資料
> HMSET 1:item 10001_10 "{'a':1,'b':3}" 10002_20 "{'a':5, 'c':10}"

# 檢視一下
127.0.0.1:6379> HGETALL 1:item
1) "10001_10"   //欄位
2) "{'a':1,'b':3}"  // 值
3) "10002_20"  // 欄位
4) "{'a':5, 'c':10}"  // 值
每個欄位和值組成一條資料

# 假如我現在要操作 1:item 的 10001_10 這條資料,為了避免併發問題,需要給其加鎖; 
# 為了針對這一條資料加鎖,我們可以將其field欄位名包含到加鎖的set的鍵名中去;
> set 1:item:10001_10:lock 1 EX 5 NX  
可以看這裡的鍵名稱,很關鍵, 值可以隨便給一個, 過期時間是5秒, 如果不存在才建立; 不能建立則表示別人正在使用這條資料,已經加鎖了;
ttl key  可以檢視過期時間還剩多少

當我們處理完業務後,需要解鎖,也就是
> del 1:item:10001_10:lock

設定過期時間,是為了避免意外造成死鎖問題

補上一個圖

redis對hash欄位加鎖

我對f1加鎖了, 此時別人操作f3的資料,是沒有鎖衝突的,可以直接去操作的

不對之處,歡迎大家糾正和評論!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風

相關文章