12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- -- 参数说明
- -- 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
|