Lua脚本读取Redis Stream提取isbusy字段赋值变量的方法
Redis Stream Lua脚本读取字段实现
需求说明
需要读取指定Redis Stream的最新一条数据,将其中isbusy字段的值赋值给Lua本地变量is_busy。
待读取的Stream查询结果示例:
127.0.0.1:6379> xrevrange driver:70 + - count 1 1) 1) "1656531417451-0" 2) 1) "field1" 2) "value1" 3) "isbusy" 4) "true"
现有初始代码框架如下:
local stream = KEYS[1] local is_busy = false local messages = redis.call("XREVRANGE", stream, "+", "-", "COUNT", "1") for _, message in ipairs(messages) do end
实现逻辑
XREVRANGE返回的结果结构规则:
- 返回值是数组,每个元素对应一条Stream消息
- 单条消息本身也是长度为2的数组:第一个元素是消息ID字符串,第二个元素是键值交替排列的一维数组,格式为
[字段1名, 字段1值, 字段2名, 字段2值, ...],不是键值映射结构的table,无法直接通过字段名索引取值。
补全后的可运行代码:
local stream = KEYS[1] local is_busy = false local messages = redis.call("XREVRANGE", stream, "+", "-", "COUNT", "1") for _, message in ipairs(messages) do local field_table = message[2] -- 步长设为2,依次配对读取字段名和字段值 for i = 1, #field_table, 2 do local current_field = field_table[i] local current_value = field_table[i+1] if current_field == "isbusy" then -- 把Redis返回的字符串类型"true"/"false"转为Lua布尔值 is_busy = (current_value == "true") break end end end
注意点
- 遍历字段表时步长必须设为2,否则会把字段值当成字段名匹配,出现逻辑错误
- Redis Lua环境中
redis.call返回的Stream字段值全部为字符串类型,如果需要使用布尔、数字类型,要手动做类型转换 - 因为查询时已经加了
COUNT 1参数,外层循环最多只会遍历1条消息,匹配到目标字段后直接break即可,不需要多余遍历
内容的提问来源于stack exchange,提问作者Sami Al-Subhi
相关产品推荐
相关产品推荐

