set name token nx ex timeout
python 中的 redis Lock 实际上就是以上函数来实现锁。但是原生的 Lock 是先 setnx 在 expire,LuaLock 是使用 lua 脚本先 setnx 在 expire,所以有两个问题。
setnx key value
比 set key value nx
高级一些么?函数在 redis/lock.py
原生的 Lock
def do_acquire(self, token): if self.redis.setnx(self.name, token): if self.timeout: # convert to milliseconds timeout = int(self.timeout * 1000) self.redis.pexpire(self.name, timeout) return True return False
使用 LuaLock
# KEYS[1] - lock name # ARGV[1] - token # ARGV[2] - timeout in milliseconds # return 1 if lock was acquired, otherwise 0 LUA_ACQUIRE_SCRIPT = """ if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then if ARGV[2] ~= '' then redis.call('pexpire', KEYS[1], ARGV[2]) end return 1 end return 0 """
1 seven2016 2018-08-24 20:50:47 +08:00 刚好在学习 redis - set key value nx 是分布式锁的奥义所在,两个步骤合成一个原子操作不会有并发问题 - Redis 服务器内部可以直接执行 Lua 代码,恩,有这样一句话,学好 redis,必会 Lua。(逃 |
![]() | 2 scriptB0y 2018-08-24 21:15:55 +08:00 你所说的 “原生的 lock ” “ python 中的 redis lock ” “ lualock ” 分别指什么? 为什么“原生的 lock ”是一段 Python 代码? |
3 windardyang OP |
4 windardyang OP @seven2016 #1 我的意思也是 `set key value nx` 较现有方式好一些,可是现在它并不是这样实现。 |
![]() | 5 helloSpringBoot 2018-08-25 09:36:35 +08:00 via Android `set name token nx ex timeout ` 是客户端用的,跟服务端实现不一样很正常。 假设客户端实现也是先加锁,在设置超时:加完锁,客户端挂掉了怎么办? 这样锁不就释放不了了。 |