評論中有人指出文案不對,修正一下
之前提了一個問題 , 見 問答: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
設定過期時間,是為了避免意外造成死鎖問題
補上一個圖
我對f1加鎖了, 此時別人操作f3的資料,是沒有鎖衝突的,可以直接去操作的
不對之處,歡迎大家糾正和評論!
本作品採用《CC 協議》,轉載必須註明作者和本文連結