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

如何用Redis Lua脚本筛选哈希表中值大于指定整数的键值对?

解决Redis Lua脚本筛选哈希表中值大于1800的键值对问题

我来帮你搞定这个问题~你原来的代码有两个核心问题:

  • 循环里用数字i作为哈希表的键调用HGET,但你的哈希表键是monday、tuesday这类字符串,不是数字索引,所以根本拿不到正确的值;
  • 找到第一个符合条件的条目就直接return了,没法收集所有符合要求的键值对。

下面是修正后的Lua脚本,完全能满足你的需求:

-- 获取目标哈希表的全部键值对,返回格式为[key1, value1, key2, value2,...]的数组
local hash_data = redis.call("HGETALL", KEYS[1])
local result = {}

-- 以步长2遍历数组,因为键和值是交替存储的
for i = 1, #hash_data, 2 do
    local current_key = hash_data[i]
    local current_value = tonumber(hash_data[i + 1])
    
    -- 判断值是否大于等于1800,符合条件就加入结果数组
    if current_value >= 1800 then
        table.insert(result, current_key)
        table.insert(result, current_value)
    end
end

-- 返回筛选后的键值对集合
return result

代码解释

  1. 获取完整哈希数据:用HGETALL一次性拿到整个哈希表的所有键值对,避免多次调用HGET带来的性能损耗,同时能拿到所有需要处理的条目。
  2. 遍历处理:因为HGETALL返回的数组是键值交替排列的,所以用步长为2的循环,每次取i位置的键和i+1位置的值。
  3. 筛选逻辑:把字符串类型的值转成数字后判断是否满足>=1800,符合条件的键和值依次插入结果数组。
  4. 返回结果:最终返回的数组格式和HGETALL一致,完全匹配你期望的输出。

你可以在Redis里这样调用这个脚本(直接粘贴脚本内容即可):

EVAL "上面的脚本内容" 1 Data

执行后就能得到你想要的结果:

1) "monday"
2) "1802"
3) "wednesday"
4) "3487"
5) "thursday"
6) "1899"
7) "saturday"
8) "1909"

内容的提问来源于stack exchange,提问作者GlenXoseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:45:36