知识点4:redis常见问题
•缓存穿透:每个缓存都有一个key,当缓存中有这个key,不需要到数据库去查询,如果调用方查询提供的一个不存在的key,每次都需要与数据库查询数据,数据库压力变大,这样缓存就失去了作用,这种情况叫缓存穿透。
•解决方案:
采用布隆过滤器,布隆过滤器可以检索一个数据是否在集合中。如果在在经过缓存或数据库,不在直接返回结果不与数据库交互
•缓存雪崩:在某一时刻,大量缓存同时失效,导致所有的请求都去查询数据库。导致数据库压力过大,挂掉的情况叫雪崩。
•解决方案:
1、高设缓存时间(随机几分钟等),避免同时失效
2、服务限流:限制访问次数
3、对数据库查询的地方加锁控制(分步式锁),不让同一时间都去查询数据库。
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
•解决方案:
A:设置热点数据永远不过期。
B:加互斥锁,互斥锁参考代码如下
bigkeys
hotkeys
知识点4:缓存hotkeys热键:
hotkeys是在Redis实例中某些key的操作频次远高于其他key,那么这些被频繁操作的热点key我们就称之为
hotkeys.
hotkey危害、将面临以下挑战:
A、请求分配不均,存在hotkeys的节点面临较大的访问压力
B、缓存击穿,hotkeys过期时,大量请求将直接导向DB
C、缓存雪崩,击垮存在hotkeys的节点,导致不能正常提供服务
Redis4. 0之后客户端提供了hotkeys发现的命令,我们可以通过 redis-cli — hotkeys 来发现hotkeys;
首先针对hotkeys过期,面临的重建问题,可以使用以下有效手段来尽可能的减少key重建的过程:
解决方案:
A、设置互斥锁,保证由一个线程完成热点key的重建,避免大量的请求直接导向DB
B、“永不过期”,将hotkeys的过期时间设置较长的时间,或者永不过期;等待hotkeys触发的热点事件过去后再考虑过期。
