一、
使用redis进行去重的时候用到了setnx
原先的写法是
setnx = redisDao.setnx(key, "1") == 1;
if (setnx){
redisDao.expire(key, timeOut);
}
那么一条去重的数据会访问2次redis
修改为
String v = redisDao.set(key, "1", "NX", "EX", timeOut);
setnx = "OK".equals(v);
一次请求即可满足
二、按天去重key过期雪崩的问题
使用redis按天去重的时候,有个问题就是自然天跨天的时候,所有key会集中过期,会消耗大量资源
修改为 日期(yyyyMMdd)+key的形式,过期时间修改为24点后+10分钟 然后随机延迟1到10分钟,这样可以保证key分批过期
private static final DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyyMMdd");
private String date = LocalDateTime.now().format(formater);
private long lastUpdateDateMills = 0;
private static final long UPDATE_INTERVAL = 60 * 1000;
long currentTimeMillis = System.currentTimeMillis();
if(currentTimeMillis - lastUpdateDateMills > UPDATE_INTERVAL){
date = LocalDateTime.now().format(formater);
lastUpdateDateMills = currentTimeMillis;
}
DateUtil.getTodayLastSeconds() + ( 10 + ran.nextInt(10) ) * 60
网友评论