社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Redis

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

Justin Mathew • 5 年前 • 825 次点击  

根据此答案[ 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
 
825 次点击  
文章 [ 2 ]  |  最新文章 5 年前
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。