如何用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
代码解释
- 获取完整哈希数据:用
HGETALL一次性拿到整个哈希表的所有键值对,避免多次调用HGET带来的性能损耗,同时能拿到所有需要处理的条目。 - 遍历处理:因为
HGETALL返回的数组是键值交替排列的,所以用步长为2的循环,每次取i位置的键和i+1位置的值。 - 筛选逻辑:把字符串类型的值转成数字后判断是否满足
>=1800,符合条件的键和值依次插入结果数组。 - 返回结果:最终返回的数组格式和
HGETALL一致,完全匹配你期望的输出。
你可以在Redis里这样调用这个脚本(直接粘贴脚本内容即可):
EVAL "上面的脚本内容" 1 Data
执行后就能得到你想要的结果:
1) "monday" 2) "1802" 3) "wednesday" 4) "3487" 5) "thursday" 6) "1899" 7) "saturday" 8) "1909"
内容的提问来源于stack exchange,提问作者GlenXoseph
相关产品推荐
相关产品推荐

