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