通過redis lua指令碼,將設定值和設定超時時間在redis服務端一次執行。
eval script numkeys key [key …] arg [arg …]
其中script為lua指令碼,numkeys為鍵個數
127.0.0.1:6379> eval "if redis.call('setnx', keys[1], keys[2]) == 1 then return redis.call('expire', keys[1], keys[3]) end" 3 name11 qdm 30
(integer) 1
127.0.0.1:6379> ttl name11
(integer) 28
127.0.0.1:6379> eval "if redis.call('setnx', keys[1], keys[2]) == 1 then return redis.call('expire', keys[1], keys[3]) end" 3 name11 qdm 30
(nil)
127.0.0.1:6379> ttl name11
(integer) 25
ex / px:鍵的過期時間
nx:只有鍵的key值不存在的時候才設定key的值
xx:只有鍵的key存在的時候才會設定key的值
127.0.0.1:6379> set name22 qdm ex 30 xx
(nil)
127.0.0.1:6379> set name22 qdm ex 30 nx
ok127.0.0.1:6379> ttl name22
(integer) 25
127.0.0.1:6379> set name22 qdm ex 30 nx
(nil)
127.0.0.1:6379> set name22 qdm ex 30 xx
ok127.0.0.1:6379> ttl name22
(integer) 27
127.0.0.1:6379> del name22
(integer) 1
127.0.0.1:6379> ttl name22
(integer) -2
127.0.0.1:6379> set name22 qdm ex 30 nx
ok127.0.0.1:6379> eval "if redis.call('get',keys[1]) == ar**[1] then return redis.call('del', keys[1]) else return 0 end" 1 name22 qdm
(integer) 1
127.0.0.1:6379> ttl name22
(integer) -2
網上關於該實現很多。
前兩種只作用單節點(即使redis通過sentinel保證高可用,但是由於主從同步原因仍然可能發生丟失)。
redlock是依賴於時鐘的,使用時要求超時時間要遠小於鎖的失效時間。參見:
Memcached 和 Redis 分布式鎖方案
分布式快取,能解決單台伺服器記憶體不能無限擴張的瓶頸。在分布式快取的應用中,會遇到多個客戶端同時爭用的問題。這個時候,需要用到分布式鎖,得到鎖的客戶端才有操作許可權。memcached 和 redis 是常用的分布式快取構建方案,下面列舉下基於memcached 和 redis 分布式鎖的實現方法。...
Memcached和Redis分布式鎖方案例項講解
分布式快取,能解決單台伺服器記憶體不能無限擴張的瓶頸。在分布式快取的應用中,會遇到多個客戶端同時爭用的問題。這個時候,需要用到分布式鎖,得到鎖的客戶端才有操作許可權。memcached 和 redis 是常用的分布式快取構建方案,下面列舉下基於memcached 和 redis 分布式鎖的實現方法。...
redis分布式鎖
redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...