RedisTemplate的Serializer将不同的数据类型进行序列化时,内置了一套逻辑,譬如Long类型的追回“L”,Byte的追加“B”。这就可能与redis期望的数据不一致,而引发错误
背景
要实现 次数/统计周期 的效果,可以通过incr和expire命令来实现:
1、根据访问者ip生成Redis key
2、执行incr命令,将key对应的数字+1
3、执行incr命令执行结果为1时【当前统计周期内第一次访问】,使用expire命令将key的过期时间设置为统计周期
4、根据incr的结果判断是否超出访问频率
看看上面的线程安全问题,会有啥影响
不过,上面的实现方案,在并发时,会有线程安全问题。【没get的小伙伴,可以留言讨论】
然后,查看了redis的文档时看到了建议的解法:
Lua脚本实现自增并过期
https://redis.io/commands/incr/
local current
current = redis.call("incr",KEYS[1])
if current == 1 then
redis.call("expire",KEYS[1],1)
end
问题描述
使用RedisTemplate执行上面的lua脚本是可以的。
但是有个问题:key的过期时间hard code在lua脚本中了。
统计需要根据情况动态调整的。
把 统计周期 作为参数传入时,却报错了:
ERR value is not an integer or out of range
show the code :
@SpringBootTest(classes = MainApplication.class)
@RunWith(Spri