【笔记】Redis基础面试题

159 阅读4分钟

Memcache和Redis的区别

  • Memcache代码层次类似Hash

    • 支持简单数据类型
    • 不支持数据持久化存储
    • 不支持主从
    • 不支持分片
  • Redis

    • 数据类型丰富
    • 支持数据磁盘持久化存储
    • 支持主从
    • 支持分片

为什么Redis能这么快(100000+QPS(每秒内查询次数))

  • 完全基于内存,绝大部份请求是纯粹的内存操作,执行效率高
  • 数据结构简单,对数据操作也简单
  • 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例
  • 使用多路I/O复用模型,非阻塞IO

Redis采用的I/O多路复用函数:epoll/kqueue/evport/select

  • 根据不同操作系统选择采用不同的I/O多路复用函数
  • 优先选择时间复杂度为O(1)的I/O多路复用函数作为底层实现
  • 以时间复杂度为O(n)的select作为保底
  • 基于react设计模式监听I/O事件

Redis数据类型

  • String
  • Hash,适合存储对象
  • List,列表,按插入顺序排序
  • Set,无序不重复集合
  • Sorted Set,通过分数从小到大排序
  • 用于计数的HyperLogLog,用于支持存储地理位置信息的Geo

Redis数据类型底层数据类型基础

  • 字符串
  • 链表
  • 字典
  • 跳跃表
  • 整数集合
  • 压缩列表
  • 对象

Redis从海量Key里查询出某一固定前缀的Key

语法:SCAN cursor [MATCH pattern] [COUNT count]

示例:scan 0 match key1 count 10*

  • 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
  • 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
  • 不保证每次执行都返回某个给定数量的元素,支持模糊查询
  • 一次返回的数量不可控,只能是大概率符合count参数

如何通过Redis实现分布式锁

  1. 分布式锁需要解决的问题

    • 互斥性
    • 安全性
    • 死锁
    • 容错
  2. 使用 setnx key value

    • 如果key不存在,则创建并赋值
    • 时间复杂度为O(1),设置成功返回1,失败返回0
  3. 如何解决setnx长期有效的问题

    • 设置key的生存时间,当key过期时,会被自动删除
    • expire key seconds,缺点:原子性得不到满足
  4. 使用 set key value [EX seconds] [PX milliseconds] [NX|XX]

    • 示例:example:set key1 123456 ex 10 nx
    • EX seconds:设置键的过期时间为second(秒)
    • PX milliseconds:设置键的过期时间为milliseconds(毫秒)
    • NX:只在键不存在时,才对键进行设置操作
    • XX:只在键已经存在时,才对键进行设置操作
    • set操作成功完成时,返回OK,否则返回nil

Redis中大量的key同时过期的注意事项

  • 集中过期时,由于清除大量的key很耗时,会出现短暂的卡顿现象
  • 解决方案: 在设置key的过期时间的时候,给每个key加上随机值

如何使用Redis做异步队列

  1. 使用List作为队列,rpush生产消息,lpop消费消息

    • 缺点:没有等待队列里有值就直接消费
    • 弥补:可以通过在应用层面引入sleep机制去调用lpop重试
  2. 使用blpop,阻塞直到队列有消息或者超时

    • 缺点:只能供一个消费者消费
  3. pub/sub:主题订阅者模式

    • 缺点:消息的发布是无状态的,无法保证可达

Redis如何持久化

  1. RDB(快照)持久化:保存某个时间点的全量数据快照

    • 优点:全量数据快照,文件小,恢复快
    • 缺点:
      • 内存数据的全量同步,数据量大会由于I/O而严重影响性能
      • 可能会因为Redis挂掉而丢失从当前至最近一次快照期间的数据
  2. AOF(Append-Only-File)持久化:保存写状态

    • 记录下除了查询以外的所有变更数据库状态的指令,以append的形式追加保存到AOF文件中(增量)
      • 优点:可读性高,适合保存增量数据,数据不易丢失
      • 缺点:文件体积大,恢复时间长

AOF日志重写流程:

  • 调用fork(),创建一个子进程
  • 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
  • 主进程持续将新的变动同时写到内存和原来的AOF里
  • 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
  • 使用新的AOF文件替换掉旧的AOF文件
  1. RDB-AOF混合持久化方式

Redis主从复制

一般为主服务提供写操作,从服务提供读操作

  • 主从复制的好处

    • 数据冗余,实现数据的热备份
    • 故障恢复,避免单点故障带来的服务不可用
    • 读写分离,负载均衡。主节点负载读写,从节点负责读,提高服务器并发量
    • 高可用基础,是哨兵机制和集群实现的基础
  • 主从复制的实现原理 www.cnblogs.com/kismetv/p/9…

Redis哨兵

Redis集群