在redis中,我如何删除一个键并同时获取它的值,而且,最重要的是,它是在一个命令中执行的,因此它是线程安全的。
没有单一的命令。您可以编写 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)
| 归档时间: |
|
| 查看次数: |
3306 次 |
| 最近记录: |