-- 参数说明 -- KEYS[1]: 缓存键名 (cache_repeat_key) -- KEYS[2]: 请求URL -- ARGV[1]: 当前请求参数 -- ARGV[2]: 当前时间戳 -- ARGV[3]: 间隔时间(秒) -- 获取缓存数据 local cacheData = redis.call('GET', KEYS[1]) local result = false if cacheData then -- 将JSON字符串转为Lua表 local sessionMap = cjson.decode(cacheData) -- 检查是否包含当前URL if sessionMap[KEYS[2]] then local preDataMap = sessionMap[KEYS[2]] -- 比较参数是否相同 if preDataMap["repeatParams"] == ARGV[1] then -- 比较时间间隔 local time1 = tonumber(ARGV[2]) local time2 = tonumber(preDataMap["repeatTime"]) if (time1 - time2) < (tonumber(ARGV[3]) * 1000) then result = true end end end end if not result then -- 创建新的缓存数据 local nowDataMap = { repeatParams = ARGV[1], repeatTime = ARGV[2] } local cacheMap = {} if cacheData then cacheMap = cjson.decode(cacheData) end cacheMap[KEYS[2]] = nowDataMap -- 设置缓存,带过期时间 redis.call('SETEX', KEYS[1], tonumber(ARGV[3]), cjson.encode(cacheMap)) end -- 返回结果:true表示重复提交,false表示不是重复提交 return result