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 ` 是客户端用的,跟服务端实现不一样很正常。
假设客户端实现也是先加锁,在设置超时:加完锁,客户端挂掉了怎么办? 这样锁不就释放不了了。 |