不确定如何从redis文档页运行cas(比较和交换)代码段

bkkx9g8r  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(358)

我正在尝试从redis事务页面运行代码。具体而言,本部分:

WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC

如果我尝试从cli逐行执行此操作,我会得到以下结果:

localhost:6380> zadd set 1 a
(integer) 1
localhost:6380> WATCH zset
localhost:6380> element = ZRANGE zset 0 0
(error) ERR unknown command 'element'
OK

这可能意味着我做错了什么?我记得9年前和lua一起工作过,所以在我看来这也不像lua。
有人是怎么运行这个代码段的?只是某种伪代码吗?

kognpnkq

kognpnkq1#

是的,这是某种伪代码。 redis-cli 它只接受redis命令,不是一个成熟的编辑器,也不支持直接lua脚本(既不支持 element 伪代码中的变量)。
我记得9年前和lua一起工作过,所以在我看来这也不像lua。
这不是lua,而是伪代码。实际上,您链接到的redis事务页面根本没有提到lua(这就是@pipeet在您的帖子中的评论有意义的原因)。
但是,可以使用redis的 EVAL 命令。

axr492tv

axr492tv2#

正如@dinei所说,给出的例子是伪代码。
让我们看一下(我添加了行号供我们参考):

1 WATCH zset
2 element = ZRANGE zset 0 0
3 MULTI
4 ZREM zset element
5 EXEC

这个练习的重点是解决如果我们只读取密钥(使用 ZRANGE ,直线 2 ),然后修改键(使用 ZREM 在第4行)。如果我们不使用“cas”语义,我假设您理解这个问题,因此无需深入讨论。
正如所指出的, redis-cli 只是让您能够运行redis命令并查看它们的回复,而不是将值保存在变量中,等等。
所以这个例子的想法是 2 ,我们正在将“read”操作的结果“保存”到伪变量中 element .
然后,排队 4 ,我们在“set”操作中使用这个值,当然还有行 1 , 3 以及 5 只是“cas”命令,以确保没有竞争条件。
这类命令的实际使用可能是通过redis客户机使用一种编程语言来完成的,这种语言允许我们保存命令的返回值 ZRANGE 然后在以后的工作中使用它 ZREM 命令。
但如果你想把它放进去 redis-cli ,您会看到,我们假装客户端代码已经读取并保存了 "a" 那是从 zrange 然后将该值传递给 zrem 命令:

127.0.0.1:6379> zadd zset 1 a
(integer) 1
127.0.0.1:6379> watch zset
OK
127.0.0.1:6379> zrange zset 0 0
1) "a"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> zrem zset a
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
127.0.0.1:6379>

相关问题