• Redis面试必问知识点


    一、Redis只有单线程吗?
      Redis 是单线程的,主要是指 Redis 的网络 I/O 线程,以及键值的 SET 和 GET 等读写操作都是由一个线程来完成的。但 Redis 的持久化、集群同步等操作,则是由另外的线程来执行的。
      Redis 6.0 版本之后,为了更好地提高 Redis 的性能,新增了多线程 I/O 的读写并发能力
     
    二、Redis采用单线程为什么还那么快?
      首先,一个重要的原因是,Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,比如哈希表和跳表。
      其次,因为是单线程模型避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且也不会导致死锁问题。
      最后,也是最重要的一点, Redis 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求,这让 Redis 可以高效地进行网络通信,因为基于非阻塞的 I/O 模型,就意味着 I/O 的读写流程不再阻塞。
      1、完全基于内存操作
      2、C语言实现,优化过得数据结构,基于几种基础的数据结构,Redis做了大量的优化,性能极高
      3、使用单线程,无上下文的切换成本
      4、基于分阻塞的IO多路复用机制
     
    三、怎么解决缓存并发呢?
      首先,客户端发起请求,先从缓存中读取数据,判断是否能从缓存中读取到数据;
      如果读取到数据,则直接返回给客户端,流程结束;
      如果没有读取到数据,那么就在 Redis 中使用 setNX 方法设置一个状态位,表示这是一种锁定状态;
      如果锁定状态设置成功,表示已经锁定成功,这时候请求从数据库中读取数据,然后更新缓存,最后再将数据返回给客户端;
      如果锁定状态没有设置成功,表示这个状态位已经被其他请求锁定,此时这个请求会等待一段时间再重新发起数据查询;
      再次查询后发现缓存中已经有数据了,那么直接返回数据给客户端。
     
    四、为什么Redis6.0之后有改用多线程呢?
      Redis使用多线程并非是完全抛弃单线程,Redis还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析执行命令还是使用单线程
      目的:是因为Redis的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高Redis的性能。
     
    五、什么是热key吗?热key问题怎么解决?
      所谓热key问题就是,突然有几十万的请求去访问Redis上的某一个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台人Redis的服务器宕机引发雪崩
    针对热key的解决方案:
    1. 提前把热key打散到不同的服务器,降低压力
    2. 加入二级缓存,提前加载热key数据到内存中,如果Redis宕机,就走内存查询
     
    六、什么是缓存击穿、缓存穿透、缓存雪崩?
    • 缓存击穿
      缓存击穿的概念就是单个key并发访问过高,过期时导致所有请求直接打到db上,这个和热key的问题类似,只是说的点在于过期导致请求全部打到DB上而已
    解决方案:
    1. 加锁更新,比如查询请求A发现缓存中没有,那么对A这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户,这样后面的请求就可以从缓存中拿到数据了。
    2. 将过期时间组合写在value中,通过异步的方式不断的刷新过期时间,防止此类现象
     
    • 缓存穿透
      缓存穿透是指查询不存在缓存中的数据,每次请求都会打到DB,就像缓存不存在一样。
      针对这个问题,加一层布隆过滤器。布隆过滤器的原理:是在你存入数据的时候,会通过散列函数将它映射为一个位数组中的K个点,同时把他们置为1.
      这样当用户再次查询A,而A在布隆过滤器值为0,直接返回,就不会产生击穿请求打到DB了。
      显然,使用布隆过滤器之后会有一个问题就是误判,因为它本身是一个数组,可能会有多个值落到同一个位置,那么理论上来说只要我们的数组长度够长,误判的概率就会越低,这样问题就根据实际情况来就好了。
    • 缓存雪崩
      当某一时刻发生大规模的缓存失效情况,比如你的缓存宕机了,会有大量的请求进来直接打到DB上,这样可能导致整个系统的崩溃,称为雪崩,雪崩和击穿、热key的问题不太一样的是,他是指大规模的缓存都过期失效了
    针对雪崩几个解决方案:
    1. 针对不同key设置不同的过期时间,避免同时过期
    2. 限流,如果Redis宕机,可以限流,避免同时刻大量请求打崩DB
    3. 二级缓存,同热key的方案
     
    七、Redis的过期策略有哪些?
     Redis主要2种过期删除策略
     惰性删除
      惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有一个缺点就是如果这些过期的key没有被访问,那么他就是一直无法被删除,而且一直占用内存。
     定期删除
      定期删除指的是Redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所以Redis会每次随机取一些key去做检查和删除
     
    八、那么定期+惰性都没有删除过期的key怎么办?
     假设Redis每次定期随机查询key的时候没有删除,这些key也没有做查询的话,就会导致这些key一直保存在Redis里面无关被删除,这时候就会走到Redis的内存淘汰机制。
    1. volatile-lru:从已设置过期时间的key中,移除最近最少使用的key进行淘汰
    2. volatile-ttl:从已设置过期时间的key中,移除将要过期的key
    3. volatile-random:从已设置过期时间的key中随机选择key淘汰
    4. allkeys-lru:从key中选择最近最少使用的进行淘汰
    5. allkeys-random:从key中随机选择key进行淘汰
    6. noeviction:当内存达到阈值的时候,新写入操作报错
     
    九、了解Redis事务机制吗?
    Redis通过MULTI、EXEC、WATCH等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,并且在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。
    事务的执行过程如下:
    1. 服务端收到客户端请求,事务以MULTI开始
    2. 如果客户端正处于事务状态,则会把事务放入队列同时返回给客户端QUEUED,反之则直接执行这个命令
    3. 当收到客户端EXEC命令时,WATCH命令监视真个事务中的key是否被修改,如果有则返回空回复到客户端表示失败,否则Redis会遍历真个事务队列,执行队列中保存的所有命令,最后返回结果给客户端
    WATCH的机制本身是一个CAS的机制,被监视的key会被保存到一个链表中,如果某一个key被修改,那么REDIS_DIRTY_CAS标志将会被打开,这时服务器会拒绝执行事务
     
    十、MySQL和Redis如何实现数据一致性?
      基于cannel解析mysql binlog同步到redis基于MQ同步到redis
      分库分表 + binlog 的方式
     

  • 相关阅读:
    React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton)
    React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例)
    drf框架
    drf框架
    drf框架
    drf框架
    drf框架
    drf框架
    drf框架
    drf框架
  • 原文地址:https://www.cnblogs.com/easyjie/p/14725720.html
Copyright © 2020-2023  润新知