You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:51:19