1.什么是redis缓存穿透?如何避免
一般的缓存系统,都是按照key去缓存查询,如果key不存在对应的value,就该去数据库中查找。一些恶意的请求就会故意查询不存在的key,请求量很大,就会对数据库造成很大的压力。这就叫缓存穿透。
如何避免?
(1)对查询结果为空的情况也进行缓存,将缓存的时间设置短一点,或者该key对应的数据插入过后进行清理缓存。
(2)对一定不存在的key进行过滤。可以将所有的可能存在的key放到一个大的BitMap中,查询时通过将该BitMap过滤。(布隆过滤器
)
2.什么是redis缓存雪崩 ?如何避免?
当缓存服务器重启或者大量缓存集中在某一个时间段失效,,这样再时效的时候,会给数据库造成很大的压力。导致系统崩溃。
Redis挂掉了,请求全部走数据库。
对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。
缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!
如何避免?
(1)在缓存失效后,通过加锁或者队列的来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询线程或写缓存,其他线程等待。
(2)不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
(3)对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:
事发前:实现Redis的高可用(主从架构+Sentinel(哨兵) 或者RedisCluster(集群)),尽量避免Redis挂掉这种情况发生。
事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据