Redis Lua 脚本 redis.call('get', 'nonexisting') 返回值

Dej*_*avu 2 lua eval redis

似乎以下 Redis Lua 脚本返回false而不是nil,这与文档所说的相矛盾:

> eval "local r = redis.call('get', 'none'); if r==nil then return 42 end" 0
(nil)
> eval "local r = redis.call('get', 'none'); if r==false then return 42 end" 0
(integer) 42
> eval "local r = redis.call('get', 'none'); if not r then return 42 end" 0
(integer) 42
Run Code Online (Sandbox Code Playgroud)

第一个eval在条件下失败r==nil,第二个eval似乎证明返回值是false

似乎 usingnot r是我手头最安全的选项,但此处的文档说该GET命令将返回nil

这是其他人都观察到并依赖的事实,即检查返回的命令的最安全的 Redis Lua 脚本nil是使用not r吗?

Dej*_*avu 5

好的,在文档中深入挖掘,Redisnil确实false在 Lua 脚本中转换为:

Redis 到 Lua 的转换表。

  • Redis整数回复-> Lua数
  • Redis 批量回复 -> Lua 字符串
  • Redis 多批量回复 -> Lua 表(可能嵌套了其他 Redis 数据类型)
  • Redis 状态回复 -> Lua 表,带有一个包含状态的 ok 字段
  • Redis 错误回复 -> Lua 表,带有一个包含错误的 err 字段
  • Redis Nil 批量回复和 Nil 多批量回复 -> Lua false 布尔类型