当前位置: 首页 > 科技观察

Redis面试FAQ

时间:2023-03-15 14:04:14 科技观察

1.什么是缓存雪崩?如何处理?通常,我们使用缓存来缓冲对DB的影响。如果缓存宕机,所有请求都将直接发送到数据库,导致数据库宕机——进而导致整个系统宕机。如何解决?两种策略(同时使用):为缓存做高可用和使用断路器防止缓存宕机。如果缓存宕机,为了防止系统宕机,限制部分流量进入DB,保证部分流量可用,其余请求返回断路器默认值。2、什么是缓存穿透?如何处理?解释一:缓存查询一个不存在的键,数据库没有。如果黑客大量使用这种方法,会导致数据库宕机。解决方法:我们可以使用一个默认值来防止,比如访问一个不存在的key,然后访问数据库,还是不行,然后在缓存中放一个placeholder,下次检查这个Placeholder,如果出现placeholder,不会查询数据库,防止DB宕机。解释2:大量请求查询一个刚刚过期的key,会给DB带来成倍的压力,可能会导致宕机,但实际上查询的都是同一份数据。解决方案:可以在这些请求代码中添加复查锁。但是那个阶段的请求会比较慢。但这比数据库停机要好。3、什么是缓存并发竞争?如何处理?说明:多个client写入一个key,顺序不对,数据就会出错。但订单是我们无法控制的。解决方案:使用分布式锁,比如zk,同时加上数据的时间戳。同时,只有抢到锁的客户端才能写。同时在写的时候,比较当前数据的时间戳和缓存中数据的时间戳。4.缓存和数据库双写不一致是什么?如何处理?解释:数据库和缓存是连续写入的,但是在运行过程中,出现并发,数据不一致。一般来说,更新缓存和数据库有以下顺序:先更新数据库,再更新缓存。先删除缓存,再更新数据库。先更新数据库,再删除缓存。下面来看看三种方式的优缺点:先更新数据库,再更新缓存。这样做的问题是:当两个请求同时更新数据时,如果不使用分布式锁,将无法控制最终的缓存值。也就是并发写的时候有问题。先删除缓存,再更新数据库。这样做的问题:如果客户端在删除缓存后读取数据,它可能会读取旧数据并设置到缓存中,导致缓存中的数据始终是旧数据。解决办法有两种:使用“双删”,即删除再删除。删除的最后一步是一个异步操作,这是为了防止在客户端读取时设置旧值。使用队列。当key不存在时,放入队列,串行执行。您必须等到数据库更新后才能读取数据。一般来说,比较麻烦。先更新数据库,再删除缓存其实是一种常见的解决方法,只是很多人不知道。我在这里介绍一下。这个叫做CacheAsidePattern,是老外发明的。如果先更新数据库,然后删除缓存,那么在更新数据库之前会出现数据不是很及时的时刻。同时,如果缓存刚好在更新前失效,读客户端可能会读到旧值,写客户端删除后又重新设置旧值,这是一种非常巧合的情况。有2个前提:写前缓存失效,同时写客户端delete操作完成后,放旧数据——即读比写慢。一些写操作也会锁定表。所以,这很难做到,但如果做到了呢?使用双删除!!!记录更新时是否有客户端在读取数据库,如果有,则在数据库更新后执行延迟删除。还有一种可能,如果在更新数据库快要删除缓存的时候服务挂了,删除失败怎么办???这就是坑!!!但是可以通过订阅数据库的binlog来删除。