ZBLOG

local key = KEYS[1] local min_score = tonumber(ARGV[1]) or 0 local max_score = tonumber(ARGV[2]) or 0 local sid = {} local res = redis.call('ZRANGEBYSCORE', key, min_score, max_score, 'WITHSCORES') if not res or #res == 0 then ...

根据您提供的Lua脚本,返回的table为空可能有以下几个原因:


1. ZRANGEBYSCORE未查询到数据

  • 脚本首先执行 ZRANGEBYSCORE 查询,如果该命令返回空(#res == 0),则直接返回:
    
     return { delete_sid = sid, msg = "no portal timeout session" }
    
  • 检查点
    1. 确认传入的 key(如 sdp:session:timeout)是否存在。
    2. 确认 min_scoremax_score 的范围是否正确(例如是否传入了非数值参数导致转为 0)。

2. 键名拼接问题

  • 脚本中删除了多个带前缀/后缀的键(如 {sdp:session:timeout}:processing),但实际Redis中的键名可能不符合预期:
    • Redis的键名区分大小写。
    • 如果使用了集群模式,花括号 {} 是哈希标签(强制同一个槽),需确认是否符合业务逻辑。
  • 检查点
    1. 通过 KEYS *sdp* 命令确认所有相关键的实际名称。
    2. 确保键名的拼写和格式完全一致。

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
    

调试建议

  1. 手动执行ZRANGEBYSCORE
    在Redis客户端直接运行以下命令,验证是否有数据:

    ZRANGEBYSCORE sdp:session:timeout min_score max_score WITHSCORES
    
  2. 打印中间结果
    在Lua脚本中添加日志输出,检查关键变量:

    redis.log(redis.LOG_NOTICE, "ZRANGEBYSCORE result size: " .. #res)
    
  3. 简化脚本测试
    先移除删除操作,仅返回查询结果:

    local res = redis.call('ZRANGEBYSCORE', key, min_score, max_score)
    return res -- 直接返回结果,确认数据是否存在
    
  4. 检查参数传递
    确保调用脚本时传入的 ARGV[1]ARGV[2] (即 min_score, max_score)是正确的数值类型。


如果仍有问题,可以提供以下信息进一步分析:

  • Redis版本和部署模式(单机/集群)。
  • Lua脚本的具体调用方式(如命令行或客户端代码)。
  • Redis中相关键的实际数据示例。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23740

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?