当前位置: 代码迷 >> 综合 >> redis缓存穿透、缓存雪崩和热点key
  详细解决方案

redis缓存穿透、缓存雪崩和热点key

热度:16   发布时间:2023-09-28 01:33:40.0

缓存穿透

穿过缓存,直接访问数据库。

解决方案:

对查询不存在的保存到缓存中value设置为null.

采用布隆过滤器.

如果key有规则,那么就可以直接过滤掉无规则的key

//伪代码
//if(jedis查询缓存不存在){//检测布隆过滤器是否存在if(存在&&查询数据库有结果){//将结果刷新到缓存中}else{//将不存在的key加入缓存//并且设置一个较短的过期时间}//返回结果
}else{return value;
}

缓存雪崩

某一时刻大量的key过期,用户又大量的查询这些key。造成系统大量的请求查询数据库。造成CPU和内存压力,数据库压力。

解决方案:

让key均匀的过期.

采用加锁的方式.

//单进程的话,就采用加锁的方式即可。
//分布式模式的话,就采用分布式锁咯。
//以下举例单进程模式
//查询缓存中有没有
public Result getValue(){if(存在){return value;}else{if(tryLock成功的话){//检测缓存中是否存在//不存在查询数据库并加入缓存// 返回结果}else{Thread.sleep(50);getValue();}}
}临时想到的知识点:
//感觉采用函数递归的话,有点像操作的循环。大概多了个返回值?不是很懂
//一般循环的话,大概是不知道递归的退出条件?不是很懂。
//可以尝试一下解决掉

热点key

一般比如说爆款商品

可以设置为永不过期.(物理不过期,逻辑过期)但是可能会出现一小段时间内,还在访问原有的缓存值。

设置二级缓存。

 

 

等等还有可能有hystrix来处理