Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不确定如何从Redis文档页面运行CAS(比较和交换)代码段_Redis_Lua - Fatal编程技术网

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

不确定如何从Redis文档页面运行CAS(比较和交换)代码段,redis,lua,Redis,Lua,我正在尝试从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) E

我正在尝试从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


有人是如何运行该代码段的?它只是某种伪代码吗?

是的,它是某种伪代码

redis-cli
仅接受redis命令,它不是一个成熟的编辑器,也不支持直接Lua脚本(伪代码中的
元素
变量等变量)

我记得大约9年前和lua一起工作过,所以在我看来这也不像lua

这不是Lua,而是伪代码。实际上,你链接到的Redis页面根本没有提到Lua(这就是为什么在你的帖子中有意义)

但是,可以使用Redis命令执行Lua脚本。

如上所述,给出的示例是伪代码

让我们看一下(我添加了行号供我们参考):

练习的重点是解决如果我们只读取键(第2行中的
ZRANGE
),然后修改键(第4行中的
ZREM
),将出现的争用条件。如果我们不使用“CAS”语义,我想您已经理解了这个问题,因此不需要深入讨论它

如前所述,
redis cli
只允许您运行redis命令并查看它们的回复,但不允许将值保存在变量中等

因此,该示例的思想是,在第
2行中,我们将“读取”操作的结果“保存”到一个伪变量
元素中

然后,在第
4
行中,我们在“set”操作中使用该值,当然第
1
3
5
行只是“CAS”命令,以确保没有竞争条件

据推测,这些命令的实际使用将从redis客户端以编程语言完成,该语言允许我们保存
ZRANGE
的返回值,然后在
ZREM
命令中使用它

但是如果您想在
redis cli
中运行它,您会看到这样的情况,我们假设客户端代码将读取并保存从
zrange
返回的
“a”
,然后将该值传递给
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>

除了Redis有一个LuaAPI之外,这篇文章与Lua有什么关系?请再次阅读问题
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>