访问后是否有任何方法可以从Redis中逐出密钥?

时间:2018-10-03 14:12:36

标签: redis spring-data spring-data-redis

根据此答案[https://stackoverflow.com/a/17099452/8804776][1]

  

“您可能不知道,但是Redis实际上是单线程的,   保证每个命令都是原子的。当一个命令是   执行中,将不会运行其他命令。”

Redis是单线程的。我的要求是将密钥存储在Redis中,一旦线程访问它就应该退出。

例如:    HSET bucket-1的名字贾斯汀

线程A和B访问相同的密钥    HGET bucket-1名称
在任何给定点,只有一个线程应该获取数据。

有什么我可以做的特殊设置吗?

2 个答案:

答案 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。