1. 缓存雪崩
缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
1.1 解决方案
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
- 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
- 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
一个过期时间均匀分布的示例:
@Override
public UserDetails getUserInfoById(Integer uid){
String key = String.format("user_info_id:%d",uid);
UserDetails userDetails = (UserDetails)templateRedis.opsForValue().get(key);
if(userDetails != null){
return userDetails;
}else{
userDetails = userDetailsMapper.getUserDetailsByUid(uid);
Random random = new Random();
int time = 600;
// type: 1: 大V用户 2: 网红 3: 普通用户
if(userDetails != null){
if(userDetails.getType() == 1){
time = 3600 + random.nextInt(3600);
// 如果有其他逻辑
}else if(userDetails.getType() == 2){
time = 1200 + random.nextInt(1200);
// 如果有其他逻辑
}else{
// 如果有其他逻辑
}
redisTemplate.opsForValue().set(key, userDetails, time, TimeUnit.SECONDS);
}
}