当前位置: 首页 > 面试题库 >

如何在Redis的Lua cjson中检查nil / null?

赫连鸿振
2023-03-14
问题内容

我有一个带代码块的lua脚本,如下所示:

local call_data     = cjson.decode(ARGV[1])
local other_data    = cjson.decode(ARGV[2])
local data          = {}
local next          = next
local populate_data = function(source)
  if next(source) == nil then
    return
  end

  for property,value in pairs(source) do
    redis.call('HSET', KEYS[2], property, value)
  end
end
populate_data(call_data)
populate_data(other_data)

当我尝试使用以下命令KEYS和ARGV运行脚本时:-

redis-cli --eval dialed.lua "inflight_stats:18" "calls:AC443d7a8111a96ba8074f54a71f0521ce:CA1ec49703eee1959471c71506f43bb42e:dialed" , "{\"from\":\"+18035224181\",\"to\":\"+919943413333\",\"sid\":\"CA1ec49703eee1959471c71506f43bb42e\",\"status\":\"queued\",\"direction\":\"outbound-api\",\"date_created\":null,\"account_sid\":\"AC443d8a8111a96ba8074f54a71f0521ce\"}" "{\"phone\":\"919943413333\",\"campaign_id\":18,\"caller_session_sid\":\"CA828b163153bf5cc301ef5285e38925f9\"}" 0

错误:-

(error) ERR Error running script (call to f_08dcc69ee8baa0200e0cf552948ab4bc338c9978): @user_script:11: @user_script: 11: Lua redis() command arguments must be strings or integers

问题答案:

TL; DR表示由返回的值cjson.decode(),用于cjson.null与JSON的null值进行比较。

说明:Lua nil在表中用于标记已删除的条目。如果将JSONinc null转换为Lunatic nil,则解码的对象将损坏。因此,cjson
lib使用轻量级的userdata类型表示null/ nil

您的“ call_data”具有一个“ date_created”字段,该字段为null-导致错误。

有趣的是,Redis与Lua一样,不会存储nil / null值,因此您必须忽略null值,或者在Redis中使用特殊值来标记它们。

假设您将忽略它们,这是一种解决方法:

local call_data     = cjson.decode(ARGV[1])
local other_data    = cjson.decode(ARGV[2])
local data          = {}
local next          = next
local null          = cjson.null
local populate_data = function(source)
  if next(source) == nil then
    return
  end

  for property,value in pairs(source) do
    if value ~= null then
      redis.call('HSET', KEYS[2], property, value)
    end
  end
end
populate_data(call_data)
populate_data(other_data)

另外,一个小的优化将是批量更新,如下所示:

  local payload = {}
  for property,value in pairs(source) do
    if value ~= null then
      table.insert(payload, property)
      table.insert(payload, value)
    end
  end
  redis.call('HSET', KEYS[2], unpack(payload))

PS,如果您愿意的话,请看一下我编写的ReJSON-它旨在帮助您解决您试图做的事情。



 类似资料:
  • 问题内容: 目前,我正在使用此辅助函数来检查nil和nil接口 由于恐慌,如果该值的种类比其他任何东西,,,,或者,我在推迟扔赶上那些。 有没有更好的方法来完成此检查?它认为应该有更直接的方法来做到这一点。 问题答案: 例如,在golang-nuts邮件列表中,请参阅此线程中的Kyle答案。 简而言之:如果您从不存储在接口中,那么您可以可靠地使用对nil的比较,而无需使用反射。另一方面,将无类型的

  • 目前我正在使用这个帮助函数来检查nil和nil接口 因为<代码>反映。(a)的值。如果值的种类不是< code>Chan、< code>Func、< code>Map、< code>Ptr、< code>Interface或< code>Slice,IsNil()会出现混乱,我在deferred 中抛出了这些内容。 有没有更好的方法来实现这种检查?它认为应该有一个更直接的方法来做到这一点。

  • 如何检查Redis服务器版本? 那么如何检查Redis服务器版本呢?

  • 问题内容: 我应该使用哪种构造来检查Twig模板中的值是否为NULL? 问题答案: 根据您的实际需求: 检查值是否为: {% endif %} 检查是否定义了变量: {% endif %} 另外,对两个值进行类型严格比较的测试可能对检查(如)以外的值很有用:

  • 问题内容: 我正在尝试查询Firebase,以检查是否有任何用户,然后在返回快照时,我想查看它是否等于nil。我尝试执行此操作,但是我使用的方法不起作用,并且如果快照不等于nil,则只有某种输出。我添加了当前拥有的代码和Firebase中的JSON文本。 JSON数据: 问题答案: 这里发生了几件事,但是最重要的是,您无法测试患儿的存在。如果您考虑一下,那是有道理的:当将一个孩子添加到该位置时,将

  • nil 和 BOOL 检查 类似于 Yoda 表达式,nil 检查的方式也是存在争议的。一些 notous 库像这样检查对象是否为 nil: if (nil == myValue) { ... 或许有人会提出这是错的,因为在 nil 作为一个常量的情况下,这样做就像 Yoda 表达式了。 但是一些程序员这么做的原因是为了避免调试的困难,看下面的代码: if (myValue == nil) { .