根据您提供的Lua脚本,返回的table
为空可能有以下几个原因:
1. ZRANGEBYSCORE未查询到数据
- 脚本首先执行
ZRANGEBYSCORE
查询,如果该命令返回空(#res == 0
),则直接返回:return { delete_sid = sid, msg = "no portal timeout session" }
- 检查点:
- 确认传入的
key
(如sdp:session:timeout
)是否存在。 - 确认
min_score
和max_score
的范围是否正确(例如是否传入了非数值参数导致转为0
)。
- 确认传入的
2. 键名拼接问题
- 脚本中删除了多个带前缀/后缀的键(如
{sdp:session:timeout}:processing
),但实际Redis中的键名可能不符合预期:- Redis的键名区分大小写。
- 如果使用了集群模式,花括号
{}
是哈希标签(强制同一个槽),需确认是否符合业务逻辑。
- 检查点:
- 通过
KEYS *sdp*
命令确认所有相关键的实际名称。 - 确保键名的拼写和格式完全一致。
- 通过
3. Lua脚本中的循环逻辑问题
- 当前脚本从
res
中每隔一个元素读取sid
(即偶数位是分数):for i = 1,#res,2 do table.insert(sid, res[i]) -- res[i]是sid,res[i+1]是分数 end
- 验证方法:
在循环内添加日志输出,确认是否进入循环:
for i = 1,#res,2 do redis.log(redis.LOG_NOTICE, "Processing sid: " .. res[i]) table.insert(sid, res[i]) -- ...其他操作... end
调试建议
手动执行ZRANGEBYSCORE
在Redis客户端直接运行以下命令,验证是否有数据:ZRANGEBYSCORE sdp:session:timeout min_score max_score WITHSCORES
打印中间结果
在Lua脚本中添加日志输出,检查关键变量:redis.log(redis.LOG_NOTICE, "ZRANGEBYSCORE result size: " .. #res)
简化脚本测试
先移除删除操作,仅返回查询结果:local res = redis.call('ZRANGEBYSCORE', key, min_score, max_score) return res -- 直接返回结果,确认数据是否存在
检查参数传递
确保调用脚本时传入的ARGV[1]
、ARGV[2]
(即min_score
,max_score
)是正确的数值类型。
如果仍有问题,可以提供以下信息进一步分析:
- Redis版本和部署模式(单机/集群)。
- Lua脚本的具体调用方式(如命令行或客户端代码)。
- Redis中相关键的实际数据示例。
内容由零声教学AI助手提供,问题来源于学员提问