Redis_常见面试点总结

本文总结了Redis的面试重点,包括主从集群、去中心化部署、单线程高性能原因、数据结构及其应用、过期策略与淘汰机制、高可用方案、持久化、雪崩和穿透的解决方案、数据库缓存一致性以及并发竞争问题的处理。详细解析了Redis的多种特性,帮助理解Redis的设计理念和实践技巧。

面试点总结

主从关系的集群有哪些?
  1. 主从的特点就是数据可靠,低可用;

  2. 常见的zookeeper、redis的哨兵、主从复制;

  3. 只有一个写入点,所以数据可靠,不会数据覆盖;

  4. 即使加上哨兵,又有故障转移的时间,但是还是低可用;因为要主从同步,数据复制;

去中心化集群部署有哪些?
  1. 特点是数据不可靠,高可用;

  2. 有erueka和redis cluster,

  3. 因为有多个写入点,所以数据不可靠;因为去中心化所以高可用;

  4. 是一种局部的主从,正常主节点工作,主节点挂掉,从节点升级为局部主节点,继续完成集群事务;

  5. Erueka的集群方式实际上是去中心化的方式;和redis一样,但是redis并不是传统的每个redis进行数据的同步,而是将16000个插槽分配到每一个redis,所以说并不是数据一致,而是算法一致,每个请求不管访问哪一个节点,都可以通过key找到他的value在哪个位置;

为什么Redis单线程还可以高性能
  1. 非阻塞的IO多路复用模型:

    image-20220324155425902

    多路复用程序只负责监听连接,然后压到队列,不负责具体的处理,一个程序可以处理成百上千其请求; 所以称为非阻塞, 如果是阻塞的,那么监听程序会自己去处理每一个请求,没有完成前,其他请求等待;

  2. 问题来了,具体的事件处理器, 也是单线程的,他怎么有那么快可以一直处理呢?

    • 因为是基于纯内存的操作, 效率性能非常高, 处理一个请求时间非常少, 即便队列塞得很快,这里处理也非常快;1s几万请求;
    • 还避免了多线程频繁上下文切换的消耗问题;
redis数据结构及使用场景了解多少?

ps: 一定要结合业务场景说, 每个数据结构都有什么用;

  1. String:
    • 就是普通的kv缓存,没什么好说的;
  2. hash:
    • value类似于map的结构,主要用来存对象, 我们操作时,可以仅仅只操作value当中的一个值,其他不变;
  3. list:
    • value是有序的列表; 有很棒的 命令lrange:可以从哪个元素开始查多少个;实现分页查;
    • 比如某个微博下面的有很多粉丝,那么就可以将这些粉丝存到list,
  4. set:
    • 无序,自动去重;
    • 比如需要对数据进行实现快速去重, 当然java程序中可以使用hashset去重,但是如果数据存在多台机器的话,可以实现全局去重;
    • 还可以做一些交集操作(百度),比如比较两个微博账号的共同好友有谁;
  5. sortset:
    • 去重, 按分数排序;
    • 最常见的最排行榜; 有重要的命令: 获取排名前几的用户(百度):
redis的过期策略,数据淘汰策略了解吗?手写LRU?

​ ps: 说到redis过期一定讲删除策略, 内存淘汰机制;最常用的lru;

  1. 我们存数据的时候可以设置过期时间;但是并不是时间一到直接删除:

  2. 采用定期删除和惰性删除结合;

    • 定期: redis会默认每隔一段时间去检测一些过期的key去删掉;

    • 惰性: 如果有些没被检测到,下次查这个过期的key时,会被删掉,返回null;

    • 最后一定会保证删掉的,之所以会两种结合用, 而不用定时删除就是防止比如10万条数据,设置集中过期,那么redis得开销全花在删除上了;

    • 比如有些场景,设置了过期时间,但是内存占用还很多,就是因为redis的删除机制,并不是到期准时全部删除;

  3. 但是. 如果数据大量堆积, 又必须请求一次才能删除, 导致内存一致占用怎么办?

  4. 走内存淘汰机制:

    • allkeys-lru: 就是当内存不够用,就删除一些你最近最少未使用(不管设没设置过期);
    • volatile-lru: 区别就是,只去删设置了过期时间的不常使用的key;(不怎么用,不适合);
    • volatile-random: 内存不足时,在设置过期的key中随机删除一些;
    • volatie-ttl: 内存不足,删除即将过期的key;
  5. 手写一个LUR:

    • 操作系统原理的示例:

      • 是假设内存是按照栈的方式来表示访问时间的;
    • 基于hashmap和双向链表:

      • 用hashmap存kv,能够保证时间复杂度为0(1);
      • 用双向链表记录v的插入时间;新插入的放在头部;
      • 链表长度表示内存大小,内存满了,就删除链表的尾部;
      image-20220324202558576
redis怎么保证高可用的?

ps: 集群相关的,主从复制原理,哨兵原理,cluster原理

redis挂掉数据能恢复吗?redis持久化讲讲:

ps: 持久化方式的比较, 最后是怎么用的, 两种方式的具体流程,会出现哪些问题;

雪崩和穿透怎么解决的:
  1. 雪崩是一个时间段内,缓存集体失效,但是全部压力落在数据库上;过期时间设置上作调整;
  2. 穿透:是指绕过redis,直接作用数据库,比如访问一个不存在的key;解决方案是,不存在、查出来为null,也存到redis中;
数据库缓存双写一致性:

​ 先更新数据库,再删除缓存

redis并发竞争问题怎么解决:

ps:多个系统客户端连接redis更新key,导致顺序的问题;分布式锁解决;

  1. 用zookeeper做分布式锁来保证;确保同一时间只能有一个实例来操作key,其他不允许读写;
redis6为什么引入多线程:

而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。

;

redis6为什么引入多线程:

而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。

一句话讲完:之前用单线程是因为基于内存速度快,而且多路复用有多路复用的作用,也就是足够了,现在引入是因为在某些操作要优化,比如删除操作,因此引入了多线程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值