SET key value [EX seconds] [PX milliseconds] [NX|XX]
Set?key?to hold the string?value. If?key?already holds a value, it is overwritten, regardless of its type. Any previous time to live associated with the key is discarded on successful?SET?operation.
將鍵key設定為指定的“字符串”值。
如果 key 已經保存了一個值,那么這個操作會直接覆蓋原來的值,并且忽略原始類型。
當set命令執行成功之后,之前設置的過期時間都將失效
選項
從2.6.12版本開始,redis為SET命令增加了一系列選項:
- EX?seconds?– Set the specified expire time, in seconds.
- PX?milliseconds?– Set the specified expire time, in milliseconds.
- NX?– Only set the key if it does not already exist.
-
XX?– Only set the key if it already exist.
- EX?seconds?– 設置鍵key的過期時間,單位時秒
- PX?milliseconds?– 設置鍵key的過期時間,單位時毫秒
- NX?– 只有鍵key不存在的時候才會設置key的值
- XX?– 只有鍵key存在的時候才會設置key的值
注意:?由于SET命令加上選項已經可以完全取代SETNX,?SETEX,?PSETEX的功能,所以在將來的版本中,redis可能會不推薦使用并且最終拋棄這幾個命令。
返回值
simple-string-reply:如果SET命令正常執行那么回返回OK,否則如果加了NX?或者?XX選項,但是沒有設置條件。那么會返回nil。
例子
redis> SET mykey "Hello" OK redis> GET mykey "Hello" redis>設計模式
注意:?下面這種設計模式并不推薦用來實現redis分布式鎖。應該參考the Redlock algorithm的實現,因為這個方法只是復雜一點,但是卻能保證更好的使用效果。
命令?SET resource-name anystring NX EX max-lock-time?是一種用 Redis 來實現鎖機制的簡單方法。
如果上述命令返回OK,那么客戶端就可以獲得鎖(如果上述命令返回Nil,那么客戶端可以在一段時間之后重新嘗試),并且可以通過DEL命令來釋放鎖。
客戶端加鎖之后,如果沒有主動釋放,會在過期時間之后自動釋放。
可以通過如下優化使得上面的鎖系統變得更加魯棒:
- 不要設置固定的字符串,而是設置為隨機的大字符串,可以稱為token。
- 通過腳步刪除指定鎖的key,而不是DEL命令。
上述優化方法會避免下述場景:a客戶端獲得的鎖(鍵key)已經由于過期時間到了被redis服務器刪除,但是這個時候a客戶端還去執行DEL命令。而b客戶端已經在a設置的過期時間之后重新獲取了這個同樣key的鎖,那么a執行DEL就會釋放了b客戶端加好的鎖。
解鎖腳本的一個例子將類似于以下:
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1]) elsereturn 0 end這個腳本執行方式如下:
EVAL …script… 1 resource-name token-value
?
總結
以上是生活随笔為你收集整理的SET key value [EX seconds] [PX milliseconds] [NX|XX]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSR303自定义校验注解
- 下一篇: 缓存-分布式锁-分布式锁原理与使用