在redis中,如何删除一个key同时获取它的值

李东勇*_*李东勇 4 python redis

在redis中,我如何删除一个键并同时获取它的值,而且,最重要的是,它是在一个命令中执行的,因此它是线程安全的。

小智 9

2021 年更新:从 redis v 6.2.0 开始,您可以使用GETDEL


Not*_*fer 5

没有单一的命令。您可以编写 Lua 脚本或执行事务。一个交易看起来很简单:

127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> GET foo
QUEUED
127.0.0.1:6379> DEL foo
QUEUED
127.0.0.1:6379> EXEC
1) "bar"
2) (integer) 1
Run Code Online (Sandbox Code Playgroud)

使用 Lua 脚本

127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> EVAL "local x = redis.call('GET', KEYS[1]); redis.call('DEL', KEYS[1]); return x" 1 foo
"bar"
127.0.0.1:6379> GET foo
(nil)
Run Code Online (Sandbox Code Playgroud)

两者操作相同,但使用 Lua 脚本,可以缓存脚本,下次调用时无需重复整个代码。我们可以使用 SCRIPT LOAD 缓存脚本并返回它的唯一 id 以用作后续调用的函数名称(大多数客户端透明地对此进行抽象)例如

127.0.0.1:6379> SCRIPT LOAD "local x = redis.call('GET', KEYS[1]); redis.call('DEL', KEYS[1]); return x"
"89d675c84cf3bd6b3b38ab96fec7c7fb2386e4b7"

127.0.0.1:6379> SET foo bar
OK

# Now we use the returned SHA of the script to call it without parsing it again:
127.0.0.1:6379> EVALSHA 89d675c84cf3bd6b3b38ab96fec7c7fb2386e4b7 1 foo
"bar"
Run Code Online (Sandbox Code Playgroud)