lua - 在 Redis/Lua 脚本中使用 TYPE 命令

标签 lua redis

我正在尝试使用 Redis TYPE Lua 脚本中的命令(通过 EVAL 执行)

local key_type = redis.call("TYPE", key)

根据Redis的文档,这应该返回一个"none""zset"等的字符串

但是返回值的类型是lua table。将值与字符串进行比较总是返回 false。

我已经设法通过将调用更改为

来解决这个问题
local key_type = redis.call("TYPE", key)["ok"]

这个值确实是一个字符串并且在字符串比较命令中起作用。我担心这是我特定版本的 Redis 中的一个错误,当我升级时它会在未来的版本中中断。

有谁知道这是预期的行为还是错误?

最佳答案

TYPE命令返回一个状态回复(也就是一个简单的字符串),例如"+list\r\n"

在 Redis 脚本方面,callluaRedisCallCommand 实现它在幕后执行真正的 Redis 命令。

一旦成功执行,此函数将命令结果转换为redisProtocolToLuaType。 .

当遇到状态回复时,此函数创建一个 Lua 表,以 "ok" 为键,状态回复为值(参见 redisProtocolToLuaType_Status)。所以:

  • 没有错误,
  • 这就是为什么 redis.call("TYPE", key) 是一个表(因此您需要获取 "ok" 键的值,因为做了,以获取 key 的字符串类型)。

注意:当您直接返回表时,Redis 会注意获取与 “ok” 键关联的值,并将其作为状态回复返回,例如:

> EVAL 'return redis.call("TYPE", "foo")' 
set

查看此 code section了解更多详情。

关于lua - 在 Redis/Lua 脚本中使用 TYPE 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435315/

相关文章:

android - 应用程序可以在模拟器上运行,但不能在安卓上运行

lua - 如何检查两个表(对象)在Lua中是否具有相同的值

c# - Redis Stack Exchange 如何按模式删除或获取键

rest - 微服务编排的低层协议(protocol)

multithreading - Lua channel 和多核支持 : Can it be done?

Luajit 从当前工作目录而不是默认搜索路径加载共享对象

postgresql - postgresql容器的数据保存在哪里,还有容器的位置在哪里?

java - Redis - 处理故障转移和负载平衡?

redis - 如何从列表中停止并添加到 lua 脚本中的另一个列表中

lua - 为什么我在我的 lua 函数中看不到打印