?
? ????? PHP ??? ???? ??? ?? ??
SET key value [EX seconds] [PX milliseconds] [NX|XX]
自1.0.0起可用。
時間復雜度: O(1)
設置key
為保存字符串value
。如果key
已經(jīng)保存了一個值,則不管其類型如何,都會被覆蓋。在 SET 操作成功之后,任何以前與密鑰關聯(lián)的生存時間都將被丟棄。
從 Redis 開始2.6.12 SET 支持一組修改其行為的選項:
EX
秒 - 設置指定的到期時間,以秒為單位。
PX
毫秒 - 設置指定的到期時間,以毫秒為單位。
NX
- 只有在密鑰不存在的情況下才能設置密鑰。
XX
- 只有在鑰匙已經(jīng)存在的情況下才能設置。
注意:由于 SET 命令選項可以替代 SETNX,SETEX,PSETEX,因此在未來的 Redis 版本中,這三個命令可能會被棄用并最終被刪除。
簡單字符串回復:OK
如果 SET 正確執(zhí)行。空回復:如果由于用戶指定了NX
or XX
選項但未滿足條件而未執(zhí)行 SET 操作,則返回 Null Bulk Reply 。
redis> SET mykey "Hello" "OK"
redis> GET mykey "Hello"
注意:以下模式不推薦使用Redlock算法,該算法實現(xiàn)起來稍微復雜一些,但提供了更好的保證并具有容錯性。
該命令SET resource-name anystring NX EX max-lock-time
是使用Redis實現(xiàn)鎖定系統(tǒng)的簡單方法。
如果上述命令返回OK
(或者如果命令返回 Nil 后一段時間后重試),則客戶端可以獲取鎖,并使用 DEL 刪除鎖。
鎖定將在到期時間后自動釋放。
可以使這個系統(tǒng)更健壯地修改解鎖模式,如下所示:
設置一個不可猜測的大型隨機字符串(稱為標記),而不是設置固定字符串。
不要使用 DEL 來釋放鎖定,而是發(fā)送一個只在值匹配時才刪除密鑰的腳本。
這樣可以避免客戶端在過期時間后嘗試釋放鎖,從而刪除由稍后獲取鎖的另一個客戶端創(chuàng)建的密鑰。
解鎖腳本的一個示例與以下內容類似:
if redis.call("get",KEYS[1]) == ARGV[1]then return redis.call("del",KEYS[1])else return 0end
該腳本應該用來調用 EVAL ...script... 1 resource-name token-value