在一次开发中,有个redis key 用于统计参数人数,代码大概是这么写的,
1.参与活动,逻辑里有类似如下,每次参与,redis 记录参与人数+1
ValueOperations<String,Integer> valueOperations = redisTemplate.opsForValue();
Integer count = valueOperations.get("xxxxxxxxx_count");
valueOperations.set("xxxxxxxxx_count",count==null?1:count+1,600,TimeUnit.SECONDS);
2.参与成功后的展示页面
ValueOperations<String,Integer> valueOperations = redisTemplate.opsForValue();
Integer totalPerson = valueOperations.get("xxxxxxxxx_count"); // 用于统计xxx参与人数
if (totalPerson == null){
totalPerson = xxxxxService.selectCount(); // redis key 不存在的话就去查数据库。
valueOperations.set("xxxxxxxxx_count",totalPerson);
}
在线上跑一直没有问题,其中redis 的key 虽然只设置了10分钟过期,但是一直有人参与 或 访问方法 2,所以key 一直
存在,(这里即使redis key 刚好过期了,如果刚好有人访问 2 ,值又重新从数据库读取,并设置到了redis 中)
所以导致了这个问题 上线好几天都一直没发现,直到下一次的停机上线 , 问题最终浮出水面了。
解决办法就是:
找不到key ,从数据库重新读取。
Key 不设置过期,或者足够长( 比如我这个功能只上线 30天 ,key 过期时间就设置 30多天,不然到时候忘记清理,
redis 数据会越积越多),