缓存穿透
穿过缓存,直接访问数据库。
解决方案:
对查询不存在的保存到缓存中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来处理