Redis雪崩通常发生在以下情况下:
- 大规模的缓存数据在相同的时间段内过期或失效。
- 系统中存在缓存的热点数据,这些数据的访问频率很高,但过期后没有被及时刷新。
- 缓存层没有采取合适的容错措施,如设置缓存的过期时间随机化。
为了防止Redis雪崩问题,可以采取措施:合理设置缓存的过期时间
java代码:
枚举:
public enum CacheKeyEnum {
PRODUCT_DETAIL("product_detail","商品详情",60 * 60 * 24); // 一天的过期时间
CacheKeyEnum(String key,String name,int expire){
this.key = key;
this.name = name;
this.expire = expire;
}
private String key; // key
private String name; // key 描述
private int expire; // 过期时间单位秒
public int getExpire() {
return expire;
}
public void setExpire(int expire) {
this.expire = expire;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这边我们可以去写一个工具类:
/**
* 所有的缓存 key 都写这里
*/
public final class CacheKeysUtils {
public static CacheKey getProductDetail(Long id){
// 随机缓存时间,防止缓存雪崩
return neW CacheKey(CacheKeyEnum.PRODUCT_DETAIL.getKey()+":"+id,CacheKeyEnum.PRODUCT_DETAIL.getExpire() + RandomUtils.nextInt(0, 10) * 60);
}
public static class CacheKey{
private CacheKey(String key,int expire){
this.key = key;
this.expire = expire;
}
private final String key;
private final int expire;
public String getKey() {
return key;
}
public int getExpire() {
return expire;
}
}
}
代码讲解:
CacheKeyEnum.PRODUCT_DETAIL.getKey():这边是我们枚举里面自定义的key
id:可以传业务ID来作redis的key,例如:订单ID(在我们业务中是唯一的)
CacheKeyEnum.PRODUCT_DETAIL.getExpire():这边是我们枚举里面自定义的expire设置的过期时间为一天
RandomUtils.nextInt(0, 10) * 60):这边是生成一个随机时间,作用就是为了防止同一时间大量key的过期去访问数据库
业务层代码:
// 缓存到redis
CacheKeysUtils.CacheKey key = CacheKeysUtils.getProductDetail(id);
// 获取key
String key1 = key.getKey();
// 获取存入的时间
int expire = key.getExpire();
这样的话就成功的防止了redis雪崩的问题
标签:String,int,解决方案,redis,expire,雪崩,key,public,name From: https://blog.csdn.net/shixiaoyanma/article/details/142522047