1 什么是缓存雪崩?–首先缓存作用:第一:缓存查询速度比查询数据库快;第二:分担了部分请求,支持更高的并发;雪崩:原因一:Redis挂掉了,请求全部走数据库。
二:对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。
危害:缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!
2 雪崩的结局方案:一:在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。
其他:对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:
事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。
事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。
3 什么是缓存穿透???-----缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。
4 如何解决缓存穿透?解决缓存穿透也有两种方案:
一:由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)或者压缩filter提前拦截,不合法就不让这个请求到数据库层!
二:当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。
这种情况我们一般会将空对象设置一个较短的过期时间!!!
5 缓存与数据库双写一致???读操作:一般我们对读操作的时候有这么一个固定的套路
如果我们的数据在缓存里边有,那么就直接取缓存的。
如果缓存里没有我们想要的数据,我们会先去查询数据库,然后将数据库查出来的数据写到缓存中。
最后将数据返回给请求;---------更新问题出现:当我们要更新时候呢?各种情况很可能就造成数据库和缓存的数据不一致了。
这里不一致指的是:数据库的数据跟缓存的数据不一致!!!
解决更新不一致问题:先操作数据库,1 再操作缓存
2 先操作缓存,再操作数据库-----优缺点比较和适用场景:对比两种策略
我们可以发现,两种策略各自有优缺点:
先删除缓存,再更新数据库
在高并发下表现不如意,在原子性被破坏时表现优异
先更新数据库,再删除缓存(Cache Aside Pattern设计模式)
在高并发下表现优异,在原子性被破坏时表现不如意
3 redis为何快?redis采用C编写,redis服务器是核心业务采用单线程模式,无锁竞争且基于内存操作,执行效率非常高。