prevent-resubmit.lua 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. -- 参数说明
  2. -- KEYS[1]: 缓存键名 (cache_repeat_key)
  3. -- KEYS[2]: 请求URL
  4. -- ARGV[1]: 当前请求参数
  5. -- ARGV[2]: 当前时间戳
  6. -- ARGV[3]: 间隔时间(秒)
  7. -- 获取缓存数据
  8. local cacheData = redis.call('GET', KEYS[1])
  9. local result = false
  10. if cacheData then
  11. -- 将JSON字符串转为Lua表
  12. local sessionMap = cjson.decode(cacheData)
  13. -- 检查是否包含当前URL
  14. if sessionMap[KEYS[2]] then
  15. local preDataMap = sessionMap[KEYS[2]]
  16. -- 比较参数是否相同
  17. if preDataMap["repeatParams"] == ARGV[1] then
  18. -- 比较时间间隔
  19. local time1 = tonumber(ARGV[2])
  20. local time2 = tonumber(preDataMap["repeatTime"])
  21. if (time1 - time2) < (tonumber(ARGV[3]) * 1000) then
  22. result = true
  23. end
  24. end
  25. end
  26. end
  27. if not result then
  28. -- 创建新的缓存数据
  29. local nowDataMap = {
  30. repeatParams = ARGV[1],
  31. repeatTime = ARGV[2]
  32. }
  33. local cacheMap = {}
  34. if cacheData then
  35. cacheMap = cjson.decode(cacheData)
  36. end
  37. cacheMap[KEYS[2]] = nowDataMap
  38. -- 设置缓存,带过期时间
  39. redis.call('SETEX', KEYS[1], tonumber(ARGV[3]), cjson.encode(cacheMap))
  40. end
  41. -- 返回结果:true表示重复提交,false表示不是重复提交
  42. return result