24.Redis性能优化的方案有哪些?
对于过期key,Redis采用的是定期删除+惰性删除。但是针对于大量key集中过期,可以给key设置随机过期时间
。或者开启lazy free
机制,Redis会在后台异步删除过期的key,不会阻塞主线程的运行。
25.你知道缓存击穿吗?
缓存击穿
的意思是给某一个热点Key
设置了过期时间,当Key过期的时候,恰好这时间点对这个Key有大量的并发请求,这些大量并发的请求可能会瞬间把数据库压垮。
解决方案:
设置永不过期
,如果某个key的访问量突然激增到某一个数量,可以修改过期时间为永不过期。加锁排队
,只让一个线程进来,后面其它的线程排队等待。等第一个线程将数据更新到Redis中,后面排队的线程才能进来。从Redis中检索两次数据,第一次是查询Redis中是否存在这个key。如果不存在到会进入锁里面,再次查询Redis,防止上一个抢到锁的线程已经更新过了,这就是双重检查锁。正常情况下,如果redis中存在key会直接拿到key返回,不会进入锁中,所以双重检查锁对性能影响不是很大。
遇到过缓存击穿的问题,在给热门商品信息设置了过期时间。
26.你知道缓存雪崩吗?
缓存雪崩
是缓存中的key集中过期
或者缓存服务器宕机,导致大量的请求访问数据库,对数据库造成很大压力。
主要解决方案有两种:
- 对于key集中失效,可以设置随机的过期时间
- 针对于redis服务器宕机,只能提前给redis做集群。如果说服务器断电了,就得提前做好灾备,一个机房挂掉就切换到另一个机房。
27.你知道缓存穿透吗?
缓存穿透
是查询一个一定不存在的key
,这将导致据每次请求都要到数据库去查询,对数据库造成了巨大的压力。
解决方法主要有三种:
- 采用
参数校验
的方式,如果是无效的参数就过滤掉。 缓存空对象
,如果查询到的key在数据库中不存在,就缓存一个无效的key。这种情况下只能应对key变化不频繁的情况下,如果key变化频繁,会导致缓存中存在大量无效的key。布隆过滤器
,在缓存之前加一个布隆过滤器,每次请求先查询布隆过滤器,如果存在再去访问缓存。布隆过滤器是一个0、1数组
,可以检索一个元素是否存在。通过多次hash
可以标注一个key的存在,查找也是使用相同的hash函数判断key是否存在。这种方法存在误判
,数组越大误判越小。