redis分布式鎖設定的3種方式

2021-09-10 09:50:10 字數 1504 閱讀 2549

通過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...