缓存穿透
redis当中没有数据,数据库当中也没有数据,请求每次都是访问数据库,而数据库有没有数据返回。
缓存穿透解决方案
有很多种方法可以有效地解决缓存穿透问题。
- 最常见的则是采用布隆过滤器,它是一种数据结构,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
- 另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存击穿
热点key的过期,从而导致大量访问热点key的请求访问数据库,从而导致数据库压力过大。
缓存击穿解决方案
- 互斥锁实现:只允许一个线程对redis缓存进行重建,其他线程处于等待状态,可以通过redis当中的setnx实现。缺点是串行化执行,效率低。优点是一致性高。
- 逻辑过期:给需要缓存的数据添加一个逻辑过期字段,通过对逻辑过期字段的判断,判断数据有无过期,如果过期则开启一个线程进行缓存重建,并且返回之前的数据。缺点是数据的一致性低,优点是相应速度快。
缓存雪崩
redis中大量key集中过期或者redis服务器宕机,从而导致大量请求从数据库获取数据,导致数据库服务器访问压力过大。
缓存雪崩解决方案
- 若是由于大量key过期所造成的,可以给key的ttl设置一个过期时间
- 若是因为redis服务器宕机所导致的,可以搭建redis集群,保证高可用
- 可以从请求量层面进行解决,对缓存业务添加限流和服务降级策略
- 可以添加多级缓存,比如说nginx缓存