Redis经典8问

经历几年开发经验之后,再去面试,缓存问题是不可避免的,现在最常见的缓存就应该是Redis了,下面是在面试中最常见的Redis的8个问题。

一、为什么要使用 Redis ?

主要可以从两个方面来考虑:性能和并发

1、性能:如果我们在项目中碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别合适将查询结果放入到缓存中,以便下次查询的时候能够快速的相应;

2、并发:在大并发的情况下,所有的请求直接访问数据库,数据库就会出现连接异常,这个时候就需要 Redis 做一个缓冲,每次请求过来的时候,首先访问 Redis ,而不是直接访问数据库,极大的降低了数据库的压力。

二、使用 Redis 有什么优缺点?

要知道任何事物都是有利有弊的,Redis 也不例外:

  1. 缓存和数据库双写一致性问题

  2. 缓存雪崩问题

  3. 缓存击穿问题

  4. 缓存的并发竞争问题

三、单线程的 Redis 为什么这么快?

此问题主要考察 redis 的内部机制,主要从一下三点回答:

  1. 纯内存操作
  2. 单线程操作,避免了频繁的上下文切换
  3. 采用了非阻塞 I/O 多路复用机制

四、Redis 的数据类型,以及每种数据类型的使用场景?

这个就比较简单了,一共五种:String、hash、list、set、zset 。 具体的使用场景可查看另一篇博文Redis基本数据类型及使用场景

五、Redis 的过期策略以及内存淘汰机制

Redis 采用的是定期删除+惰性删除策略:定期删除、redis默认每隔100ms 检查内存中是否有过期的 key ,有过期的 key 则删除。而 redis 不是每100ms 将所有的 key 检查一次(如果所有的都检查,岂不会卡死),而是随机抽取检查。如果只采用定期删除,将会导致很多 key 到期没有删除。于是惰性删除就上场了、也就是说在你获取某个 key 的时候,redis 会检查一下,这个 key 如果过期了就删除。在 redis.conf 中配置 maxmemory-policy  volatile-lru

  1. noeviction : 内存不足时写入数据,写入数据报错
  2. allkeys-lru : 内存不足时写入数据,键空间中移除最近最少使用的 key(推荐使用)
  3. allkeys-random : 内存不足时写入数据,随机删除某个 key
  4. volatile-lru : 内存不足时写入数据,在设置过期时间的键空间中,移除最近最少使用的key
  5. volatile-random : 内存不足时写入数据,在设置过期时间的键空间中,随机移除某个 key
  6. volatile-ttl : 内存不足时写入数据,更早过期的 key ,优先移除 

六、Redis 和数据库双写一致性问题

一致性问题是分布式常见的问题,可以分为最终一致性和强一致性。强一致性要求的数据,不能放缓存。首先。采取正确的更新策略,先更新数据库,在删除缓存。其次,因为可能存在删除缓存失败的问题,提供做一个补偿措施即可,比如利用消息队列。

七、如何应对缓存穿透和缓存雪崩的问题

缓存穿透:黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。

解决方案:

    1、利用互斥锁,缓存失效的时候,先去获取锁,得到锁再去请求数据库,没得到锁则休眠一段时间再重试。

    2、采用异步更新策略,无论 key 是否取到值,都直接返回。value 中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。要做缓存预热(项目启动时加载缓存)

    3、提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的 key 。迅速判断请求所带的 key 的合法性。不合法则直接返回。

缓存雪崩:缓存同一时刻大面积失效,此时又来一大波请求怼到数据库……

解决方案:

    1、给缓存加上一个随机值,避免集体失效

    2、使用互斥锁,但是该方案吞吐量明显下降。

    3、双缓存,缓存A 和 缓存B ,缓存A 有失效时间,缓存B 没有失效时间,当A没有数据时,读取B,并异步读取数据库中的数据 更新 缓存A 与缓存B中的数据。

八、如何解决 Redis 的并发竞争 key 的问题

这个问题就是同时有多个子系统去 set 一个 key 。

解决方案:

    1、如果不要求顺序:设置分布式锁,抢到锁就去 设置 key 的值。

    2、有顺序要求:分布式锁,写入数据的时候保存一个时间戳,如果设置的时间戳大于缓存中的时间戳 就进行写入操作,如果 写入数据的时间戳小于缓存中的时间戳,则不进行写入操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章