Redis 常见面试问题集锦

74 阅读3分钟

缓存穿透

缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。

  1. 缓存空对象 当数据库中查不到数据的时候,缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。但这种解决方式有两个缺点:

    • 需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象很多的时候,就会浪费更多的内存;
    • 会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致问题。
  2. 布隆过滤器

缓存击穿

缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。

  1. 设置Key不过期 在设置热点key的时候,不给key设置过期时间即可。或者正常给key设置过期时间,不过在后台同时启一个定时任务去定时地更新这个缓存。
  2. 分布式锁 当大量查询同一个key的请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程查询数据库,然后将结果放入到缓存中,然后释放锁,此时,其他处于锁等待的请求即可继续执行,由于此时缓存中已经有了数据,所以直接从缓存中获取到数据返回,并不会查询数据库。

缓存雪崩

缓存雪崩是指当缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。

  1. 分散key的过期时间

  2. 高可用方案

SnowFlake 雪花算法

最早是Twitter公司在其内部用于分布式环境下生成唯一ID。

雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一id。 image.png 在高并发分布式环境下生成不重复id,每秒可生成百万个不重复id。以及同一时间戳下序列号自增,基本保证id有序递增。

依赖服务器时间,服务器的时间进行了回拨(机器发生了故障或者别的情况)生成了重复id。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。