在Redis中,我如何删除一个键并同时获得其值

dpiehjr4  于 2023-10-15  发布在  Redis
关注(0)|答案(3)|浏览(113)

在redis中,我如何删除一个键并同时获得其值,最重要的是,它在一个命令中执行,所以它是线程安全的。

vawmfj5a

vawmfj5a1#

2021年更新:从redis v6.2.0开始,您可以使用GETDEL

9gm1akwq

9gm1akwq2#

没有单一的命令。您可以编写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

使用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)

两者的操作相同,但使用Lua脚本,脚本可以被缓存,下次你想调用它时不需要重复整个代码。我们可以使用缓存脚本并返回一个唯一的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"
g6ll5ycj

g6ll5ycj3#

从Redis 6.2.0开始,你可以使用GETDEL命令:
获取键的值并删除键。此命令类似于GET,除了它也在成功时删除键(当且仅当键的值类型是字符串时)。
Reference

相关问题