【问题标题】:how to do null \ nil check in LUA with redis-scripto and redis DB?如何使用 redis-scripto 和 redis DB 在 LUA 中执行 null \ nil 检查?
【发布时间】:2014-02-17 07:28:08
【问题描述】:

我正在使用 scripto 在 node.js 中编写一个脚本,并且我正在尝试对数据库中的一个值进行 nil 检查: 这是js代码(用于节点)-

var redis = require("redis");
var redisClient = redis.createClient("6379","localhost");
var Scripto = require('redis-scripto');
var scriptManager = new Scripto(redisClient);

var scripts = {
    'test':'local function test(i) '+
    'if (i==nil) then return i end '+
    'local ch = redis.call("get", i) '+
    'if (ch==nil) then return ("ch is nil") '+
    'else return "1" '+
    'end end '+
    'return (test(KEYS[1]))',
};

scriptManager.load(scripts);
scriptManager.run('test', ["someInvalidKey"], [], function(err,result){
    console.log(err || result);
});

但我无法在 if 语句中输入 "ch is nil"...有什么帮助吗??

【问题讨论】:

    标签: lua redis null node-redis null-check


    【解决方案1】:

    Lua 片段:

    redis.call("get", i)
    

    Redis 的 GET 方法从不返回 nil,但如果不存在键,它会返回布尔值 (false)。

    将您的代码更改为:

    local function test(i)
      if (i==nil) then 
        return 'isnil ' .. i 
      end
      local ch = redis.call("get", i)
      if (ch==nil or (type(ch) == "boolean" and not ch)) then 
        return ("ch is nil or false")
      else 
        return "isthere '" .. ch .. "'"
      end
    end
    return (test(KEYS[1]))
    

    甚至更简单(允许不同类型之间的 Lua 相等性检查,总是返回 false):

    local function test(i)
      if (i==nil) then 
        return 'isnil ' .. i 
      end
      local ch = redis.call("get", i)
      if (ch==false) then 
        return ("ch is false")
      else 
        return "isthere '" .. ch .. "'"
      end
    end
    return (test(KEYS[1]))
    

    如果你多尝试一下,你会发现你可以得到比这更简单的方法,但你会明白这一点的。

    希望这会有所帮助,TW

    【讨论】:

    • 这救了我。为什么将 nil/null 的返回处理为布尔值 false,这绝对没有意义。非常感谢!
    • 这很有趣,因为最新的 redis 文档说:“获取键的值。如果键不存在,则返回特殊值 nil”GET key 但我发现与描述的行为相同这篇文章...
    • @Nitax 比这更微妙一些。在 Lua 内部,这是错误的。但是当返回给客户时,它是零。这可能与 Lua 的限制有关。 Nills 不是 Lua 最强大的壮举。尽管如此,还是喜欢这种语言。 --- redis-cli get blah (nil) redis-cli eval 'return redis.call("get","blah")' 0 (nil) redis-cli eval 'return tostring(redis.call("get","blah"))' 0 "false"
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2015-04-06
    • 2015-10-21
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多