缓存击穿
是指缓存中某一个key失效,如果出现高并发,则直接查询数据库,导致系统崩溃
解决方案:
加锁: 分布式锁
基于redis实现分布式锁.
锁的本质是: 可以放过一个请求,去数据库里查询,让其他的请求处于睡眠状态,放过的请求;查询到数据,放到缓存中后,再唤醒其他的请求,其他请求就直接查询缓存了,给数据库减轻了压力.
缓存穿透
是指用户查询一个在数据库中根本不存在的数据,(数据库中没有这条记录),那么我们
做缓存的时候,不向缓存中放入数据的话,会导致缓存穿透.
:不进缓存,直接进入数据库
解决方式:
代码判断
if(数据库也没有数据){
在缓存中设置一个null值
set 49 null
expire 49 60*10 设置一个10分钟失效
}
缓存雪崩
是指在同一时刻,缓存中的多个key全部失效,如果出现高并发,则会直接查询数据库
可能导致系统崩溃
解决方案:
缓存key,不要设置同一过期时间! expire key timout
缓存锁
本地锁(synchronized):
单服务
结果:没有问题
多服务(集群)
server.port 8206
server.port 8226
server.port 8236
结果:数据错误
结果
测试本地锁: 单击版本 没有问题
分布式锁
使用redis做分布式锁(redisson )