有什么方法可以在访问 Redis 后立即从中驱逐密钥?
Is there any ways to evict keys from Redis just after accessing it?
根据这个答案 [
"You might not know it, but Redis is actually single-threaded, which
is how every command is guaranteed to be atomic. While one command is
executing, no other command will run."
Redis 是单线程的。我的要求是在 Redis 中存储一个密钥,一旦线程访问它,它就应该退出。
例如:
HSET bucket-1 名称贾斯汀
线程A和B访问同一个key
HGET bucket-1 名称
在任何给定点,只有一个线程应该获取数据。
是否有任何特定设置可以实现此目的?
没有使用哈希执行此操作的命令。您可以使用 Lua 脚本来处理这个问题。
您也可以改用 GETSET,您可以将密钥重置为表示它已被其他消费者使用的值。
术语 "eviction" 指的是具有到期设置 (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
A nil
回复表示你是 B.
根据这个答案 [
"You might not know it, but Redis is actually single-threaded, which is how every command is guaranteed to be atomic. While one command is executing, no other command will run."
Redis 是单线程的。我的要求是在 Redis 中存储一个密钥,一旦线程访问它,它就应该退出。
例如: HSET bucket-1 名称贾斯汀
线程A和B访问同一个key
HGET bucket-1 名称
在任何给定点,只有一个线程应该获取数据。
是否有任何特定设置可以实现此目的?
没有使用哈希执行此操作的命令。您可以使用 Lua 脚本来处理这个问题。
您也可以改用 GETSET,您可以将密钥重置为表示它已被其他消费者使用的值。
术语 "eviction" 指的是具有到期设置 (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
A nil
回复表示你是 B.