分布式缓存
以下是缓存中经常遇到的问题
缓存雪崩:
- 当大量请求访问同一个缓存时,对应得缓存失效,结果所有的请求都去访问数据库,对数据库CPU和内存造成巨大压力,可能导致宕机,从而形成的一系列连锁反应,造成系统崩溃损坏。
- 一般处理方式有:设置缓存标记,记录缓存是否过期,过期的话就更新缓存。或者是给不同的缓存设置不同的过期时间
缓存穿透:
- 当用户查询数据时,在缓存中没命中后,去数据库中查询,查到返回空或者查不到(就是数据不存在,相当于两次查询了没用的数据)这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
- 一般解决方式有:常用的可以使用布隆过滤器,另外一种简单粗暴如果结果返回空的话就直接把空结构进行缓存,设置过期时间短一点大概不超过5分钟的样子,这样下次请求就会有值了就不会直接去访问数据库了
缓存击穿
- 当大量请求数据时,缓存未命中(就是缓存中没有缓存此类的请求数据,但数据库中有),此时大量请求机会直接穿过缓存,请求到数据库中,从而大大增加数据库的压力。
- 一般解决的办法就是,通过job(定时任务)去判断热点数据并及时更新到缓存中,或者时通过互斥锁的方式添加缓存数据
- 击穿和穿透区别在于:击穿本身的数据是属于存在的只是不存在缓存中,而穿透本是就是不存在的数据
缓存预热
- 就是系统上线后,将相关的数据缓存到缓存系统中,避免用户查询的时候先查数据库、再去查缓存的问题
缓存更新(淘汰策略)
- 除了缓存服务器自带的缓存失效策略之外(Redis 默认的有 6 种策略可供选择),我们还可以根据具体的业务需求进行自定义缓存淘汰策略,常见的策略有两种:
1、定时去清理过期的缓存;
2、当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新的数据并更新缓存。
缓存降级
- 当访问量剧增时、服务器出现问题如:响应时间慢或长时间不响应,为了保证服务的高可用性,系统可根据一些关键数据进行自动降级、也可以通过人工降级的方式来保证服务的高可用,但是要注意该操作是会对服务造成一定损失的谨慎操作,有些服务是无法降级例如:购物车、结算操作。
- 在缓存降级之前要梳理好,必须要保护的不可以降级和可降级的。降级的方式可以通过业务或者是日志等级来划分降级的级别,一般都是通过日志等级来划分,主要划分为:一般、警告、错误、严重错误,还可以根据不同的级别来设定不同的操作,比如这里的错误和严重错误的时候就可以通过人工降级的方式处理