最全面的redis常见面试题总结

浅问题全部是博主面试学习过程中总结的。全部手码,如果喜欢或者对你有帮助的话可以点赞加收藏!!!
这篇文章是从易到难来拆解redis的常见面试题的,大家可以依次来看。

目录

  • 1、redis和mamcached的区别
  • 2、redis设置过期时间 expire
  • 3、内存淘汰机制 6种
  • 4、持久化机制(快照RDB,追加文件AOF)
  • 5、缓存雪崩
  • 6、缓存穿透
  • 7、如何解决redis并发竞争key问题
  • 8、缓存与数据库双写时的数据一致性问题
  • 9、redis集群过程
    • 1、主从复制
    • 2、 哨兵
    • 3、redis集群

1、redis和mamcached的区别

  1. 支持更多的数据类型。 mamcached只支持String
  2. redis有持久化操作,而mamcached在内存中
  3. redis有自带的集群模式
  4. mamcached是多线程非阻塞IO复用模型,而redis使用的是单线程多路IO复用模型。

2、redis设置过期时间 expire

  1. 定期删除:每100ms随机抽取一些过期的,因为要遍历所有的数据,对cpu压力较大。
  2. 惰性删除:当查到这个key时,才进行删除。但是长时间不查的过期数据会导致内存被占满。

为了解决上面的问题有了

3、内存淘汰机制 6种

  1. volatile-lru:从已设置过期时间的数据集中选最近最少使用的进行淘汰。
  2. volatile-ttl:从已设置过期时间的数据集中选将要过期的。
  3. volatile-random:从已设置过期时间的数据集中选任意数据。
  4. allkeys-lru:从所有key中选最近最少使用的进行淘汰。
  5. allkeys-random:从所有key中选任意数据进行淘汰。
  6. no-eviction:禁止驱逐数据

4、持久化机制(快照RDB,追加文件AOF)

默认使用RDB:

  1. 配置:save 900 1 900秒之后至少有1个key发生变化则保存快照
    save 300 10 300秒之后至少有10个key发生变化则保存快照
    save 60 10000 60秒之后至少有10000个key发生变化则保存快照
  2. 优缺点:生成文件比较小,适合全量复制场景,可能会造成数据丢失,在做快照时对系统资源消耗比较大。

AOF:
1、配置:appendonly yes 开启
appendfsync everysec 每秒同步一次,可以兼顾数据和写入性能,宕机后只会丢失一秒内的数据。
2、优缺点:因为要记录所有操作所以文件比较大(可能会对一个值进行多次操作),但丢失数据会少一些。

AOF重写:是产生一个压缩的AOF文件,代替之前的AOF文件。开辟一个子线程对内存中所有的key进行遍历,转换成一些列redis操作,再将操作期间发生的增量的AOF日志,添加到文件尾部,替换掉之前的文件。

5、缓存雪崩

解释:缓存同一时间大面积的失效,导致请求都会落到数据库上,然后导致数据库崩掉。
解决办法:

  1. 使用限流组件,在流量达到一定值之后,对请求直接返回失败信息。
  2. 在使用expire时,在后面加一个random时间,不让缓存同一时间失效。
  3. 使用熔断组件,进行降级处理,返回默认数据库或其他页面。

6、缓存穿透

解释:大量请求的key在缓存中不存在,直接打到数据库上,导致数据库崩溃。
解决办法:

  1. 做好参数校验,包括前端和后端,尽量在系统上有对无效参数进行过滤。
  2. 缓存无效key,并设置过期时间为1分钟,但是也有缺点,如果黑客用大量请求无效key,可能导致缓存被占满。
  3. 使用布隆过滤器(之后单独解释,很简单)

7、如何解决redis并发竞争key问题

使用分布式锁(可以用redis实现,zookepper,或者数据库来实现)东西有些多,后面单独开一篇文章来解释。

8、缓存与数据库双写时的数据一致性问题

如何解决

  1. 读时正常先读缓存,没有就读数据库,再写入缓存,返回响应,更新时,先删除缓存,再更新数据库,这是一种lazy的思想,防止有冷数据多次更新。但是也会面临一个问题,就是当有大量热数据时,会导致查的时候,缓存是一直不存在的状态,都要去读数据库,实际应用时,并不能提高特别多的并发量。
  2. 读数据库请求和写缓存请求串行化,串到一个内存队列中,但是这种会大大降低系统效率,除非数据要求请一致性,不然尽量不要使用这种方法。
  3. 先读缓存,再用缓存的值使用乐观锁的方式进行数据库更新,更新成功后再更新缓存。这种方式还是比较推荐的。可以防止热数据一直查不到,并且并发量也还不错。

9、redis集群过程

1、主从复制

解释:主要是为了备份数据,防止数据丢失
过程:

  1. slave向master发起tcp连接。
  2. master与client建立tcp连接。
  3. master发送ping请求,确认对方是一个redis实例。
  4. slave返回pong。
  5. 发送SYNC命令进行同步(master开始执行SYNC命令准备数据)
  6. master将RDB文件发送给slave

命令:SYNC命令

  1. 主服务器器执行BGSAVE命令来生成RDB文件,消耗大量资源
  2. master发送数据占用大量网络资源
  3. slave接收时会阻塞无法处理其他命令。

改进的:PSYNC命令

  1. 全量复制:将全部数据复制
  2. 部分复制:网络中断后,只将网络中断期间的数据进行发送。

2、 哨兵

哨兵节点:哨兵系统由一个或多个哨兵节点组成,是一个特殊的redis节点,不存数据。
数据节点:主从节点构成
最全面的redis常见面试题总结_第1张图片
功能:

  1. 监控,心跳检测。
  2. 自动故障转移,主节点宕机时,升级一个从节点成为主节点。
  3. 配置提供者,客户端初始化时,通过哨兵来获取主从节点信息。
  4. 通知,将故障转移结果发送给客户端。

如何选择主节点:

  1. 淘汰ping命令大于5秒的或已经断线的从节点
  2. 淘汰与失效主服务器断开时间过长的从节点
  3. 两次淘汰后选择复制偏移量最大的从节点
    (这么多操作都是为了找到一个从节点,这个从节点的数据和失效主服务器的数据最接近)

3、redis集群

主要作用:

  1. 将数据分区:增大redis容量上限
  2. 高可用,支持主从复制和自动故障转移

分区的方法:

  1. 哈希值%节点数:计算hash,对节点数量进行取余,但是在新增或删除节点时要全部重新计算
  2. 一致性哈希分区:一致性哈希算法,是将整个哈希值空间组织成一个虚拟闭环,对每个数据进行hash运算,计算出在环上的位置,然后顺时针向前走,找到第一个服务器即可。缺点:当节点较少时,增删节点时,对单个节点的流量影响较大。
  3. 带有虚拟节点的哈希分区,优点:解耦了数据和实际节点之间的关系。

你可能感兴趣的:(面试集锦,redis,java,缓存,数据库,面试题)