如何在Redis Lua脚本中使用GETEX替代GET+EXPIRE实现单调用
解决方案
正确的Lua脚本实现如下:
local key = ARGV[1] local ttl = tonumber(ARGV[2]) return redis.call("GETEX", key, "EX", ttl)
问题原因分析
你之前的两种写法都存在问题:
- 第一种写法未将
ARGV[2]传入的ttl转为数字类型。Redis的GETEX命令中,EX选项要求后续参数是数字格式的秒数,而从ARGV获取的参数默认是字符串,直接传递会导致命令执行失败。 - 第二种写法省略了
EX标识,不符合GETEX的命令语法——Redis需要明确知道你要设置的是秒级过期(EX)还是毫秒级过期(PX),缺少这个标识无法正确解析参数。
逻辑匹配说明
这个单调用的脚本和你原来的逻辑完全一致:
- 当key存在时,返回key的值并为其设置指定的秒级过期时间;
- 当key不存在时,返回
nil,不会执行任何额外操作。
内容的提问来源于stack exchange,提问作者Aryan Chhetri
相关产品推荐
相关产品推荐

