Py学习  »  Redis

有没有什么方法可以在访问Redis后将其从Redis中逐出?

Justin Mathew • 6 年前 • 858 次点击  

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

< Buff行情>

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

< /块引用>

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

HSET Bucket-1名称Justin

线程A和B访问同一密钥 hget bucket-1名称
在任何给定点上,只有一个线程可以获取数据。

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

“您可能不知道,但redis实际上是单线程的,它 是如何保证每个命令都是原子的。当一个命令 正在执行,不会运行其他命令。“

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

如: HSET Bucket-1名称Justin

线程A和B访问同一密钥 hget bucket-1名称
在任何给定点上,只有一个线程可以获取数据。

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37890
 
858 次点击  
文章 [ 2 ]  |  最新文章 6 年前
TheDude
Reply   •   1 楼
TheDude    6 年前

没有命令可以用哈希值来实现这一点。您可以使用Lua脚本来处理这个问题。

你也可以用 GETSET 相反,您可以将某个键重置为一个值,该值表示该键已被另一个使用者使用。

Itamar Haber
Reply   •   2 楼
Itamar Haber    6 年前

术语“收回”是指具有到期集(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。