本文主要介绍redis三个概念,旨在明白概念,才能想出对应解决方案。
缓存穿透
缓存和数据库中都没有的数据,这样每次请求都会去查库,不会查缓存,如果同一时间有大量请求进来的话,就会给数据库造成巨大的查询压力,甚至击垮db系统
- 解决思路
- 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存击穿
一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库;当发生缓存击穿的时候,数据库的查询压力会倍增,导致大量的请求阻塞。
缓存雪崩
缓存中大批量的数据同时过期,巨大的请求量直接落到db层,引起db压力过大甚至宕机。
- 解决思路
-
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
-
做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
-
不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
-