【问题标题】:What is the value if the key does not exist in eval 'redis.call' in Redis?如果 Redis 中的 eval 'redis.call' 中不存在该键,则值是什么?
【发布时间】:2019-11-15 14:37:44
【问题描述】:

我发现如何在 Lua 中测试变量 nil Learn X in Y minutes,等于 ==,不等于 ~=,以及参考 here,但为什么我的代码不能那样工作?

在 docker 中启动 Redis 服务器:

PS C:\Program Files\Docker\Docker\resources\bin> .\docker.exe run --name redis-work -p 2019:6379 redis

Docker 中的 Redis 客户端

PS C:\Program Files\Docker\Docker\resources\bin> docker run -it --name redis-cli-work --link redis-work:redis --rm redis redis-cli -h redis -p 6379

第一:

redis:6379> eval 'local r = redis.call("get", "key_which_does_not_exist") return r' 0
(nil)

第二:

redis:6379> eval 'local r = redis.call("get", "key_which_does_not_exist") if r == nil then return \'nil for key\' else return r end' 0
(nil)

第三:

redis:6379> eval 'local r = redis.call("get", "key_which_does_not_exist") if r ~= nil then return r else return \'nil for key\' end' 0
(nil)

如果密钥不存在,我认为redis.call 将从第一个代码返回nil,但从第二个代码中,我认为r == nil 为假,否则它将打印' nil for key',这是否意味着r不是nil?,那么从第三个开始,由于r不是nil,为什么要打印(nil),我认为只有nil结果才能打印(nil)

所以这个值,在客户端看起来像nil,但在服务器端,它既不是nil也不是非nil,这是什么值?


问题是如果key_which_does_not_exist不存在,那么r为假,如果lua只是把这个false返回给redis,redis客户端就会变成(nil);对于第二个代码段,如果我们想要return r,只有当r == nil为false,那么r为false使得r == nil为false,我们返回r导致返回false,redis将false转换为再次(nil);对于最后一个,r 为 false 使 r ~= nil 为 true,然后 lua return r,实际上返回 false 到 redis,redis 隐蔽 false(nil)

问题是,在lua中,false不是nil,在redis中,来自lua的false会被转换成(nil)

【问题讨论】:

    标签: redis lua


    【解决方案1】:

    TL;DR

    127.0.0.1:6379> eval "local r = redis.call('get','foo') if r == false then return 'falsehood' else return r end" 0
    "falsehood"
    

    根据"Conversion between Lua and Redis data types " 下的文档:

    Redis 到 Lua 转换表。
    ...
    * Redis Nil 批量回复和 Nil 多批量回复 -> Lua false boolean 类型

    所以,当 GET 因为 key 不存在而返回 Redis nil 时,在这种情况下它表示为 Lua false。

    【讨论】:

    • 谢谢,继续,represented as Lua false in this case. 因为在 lua 中 false 不是 nil,所以 lua 返回 false,但是 redis 将 lua false 转换为 nil,因此对于这种情况,我们总是有 nil,
    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2019-04-23
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2017-06-26
    • 2021-01-14
    相关资源
    最近更新 更多