在redis中,如何删除一个键并同时获取其值,并且,最重要的是,它在一个命令中执行,因此它是线程安全的。
答案 0 :(得分:4)
没有单一命令。您可以编写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脚本,脚本可以缓存,下次要调用它时无需重复整个代码。我们可以使用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"
答案 1 :(得分:2)
2021 年更新:从 redis v 6.2.0 开始,您可以使用 GETDEL