根据此答案[https://stackoverflow.com/a/17099452/8804776][1]
“您可能不知道,但是Redis实际上是单线程的, 保证每个命令都是原子的。当一个命令是 执行中,将不会运行其他命令。”
Redis是单线程的。我的要求是将密钥存储在Redis中,一旦线程访问它就应该退出。
例如: HSET bucket-1的名字贾斯汀
线程A和B访问相同的密钥
HGET bucket-1名称
在任何给定点,只有一个线程应该获取数据。
有什么我可以做的特殊设置吗?
答案 0 :(得分:0)
没有命令执行散列操作。您可以使用Lua脚本进行处理。
您也可以改用GETSET,在这里您可以将密钥重置为一个值,该值表示该密钥已被另一个使用者使用。
答案 1 :(得分:0)
术语“逐出”是指具有有效期(TTL)的键。虽然没有专用命令可以实现所需的功能,但是可以使用以下事务:
WATCH bucket-1
HGET bucket-1 name
(pseudo: if not nil)
MULTI
HDEL bucket-1 name
EXEC
如果EXEC
失败,则表明您在线程B中(假设A优先到达那里)。
或者,也可以将上述内容压缩成一个惯用的Lua脚本-如@The_Dude所建议-例如(为便于阅读而添加的换行符):
EVAL "local v=redis.call('HGET', KEYS[1], ARGV[1])
redis.call('HDEL', KEYS[1], ARGS[1])
return v"
1 bucket-1 name
nil
的回复表示您是B。