json - 如何在 Redis 的 Lua cjson 中检查 nil/null?
问题描述
我有一个带有代码块的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
in 表来标记已删除的条目。如果 JSONincnull
被转换为 Lunatic nil
,则解码的对象将被破坏。因此,cjson 库使用轻量级的 userdata 类型来表示null
/ nil
。
您的“call_data”有一个“date_created”字段为空 - 这会导致错误。
有趣的是,Redis 和 Lua 一样,不会存储 nil/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 - 它旨在帮助您解决您正在尝试做的事情。
推荐阅读
- sql - SQL Count 基于 like 语句和 Group by
- sql - 有没有办法检查一个位是否已设置而另一个不是同时设置?
- r - 如何减少/删除 R Markdown 代码中列表项之间的空间?
- javascript - 如何左对齐y轴标签D3图表
- amazon-web-services - 如何在 AWS Serverless Application Repository 中发布嵌套堆栈
- reactjs - 反应:默认上下文值为空白
- nginx - mikrotik 在 dst-nat 中更改 src 标头 ip
- css - 检查输入后文本的css选择器
- php - 如果求和时任一侧的单个数组中的值相等,则查找索引
- java - 将高级、简单搜索、列表视图添加到 WCMS 后台资源管理器树 Sap Hybris