1.说说什么是Redis?

Redis是一种基于键值对(key-value)的NoSQL数据库。
因为Redis会将所有数据都存放在内存中,所以它的读写性能非常出色。
总之,Redis是一款强大的性能利器。

2.Redis可以用来干什么?

redis如何保持token一致性 redis存token解决什么问题_redis

项目中的应用

  • Token存储:用户登录成功之后,使用Redis存储Token
  • 登录失败次数计数:使用Redis计数,登录失败超过一定次数,锁定账号
  • 地址缓存:对省市区数据的缓存
  • 分布式锁:分布式环境下登录、注册等操作加分布式锁

3.Redis 有哪些数据结构?

redis如何保持token一致性 redis存token解决什么问题_缓存_02

字符串主要有以下几个典型使用场景:

  1. 缓存功能
  2. 计数
  3. 共享Session
  4. 限速

哈希主要有以下典型应用场景:

  1. 缓存用户信息
  2. 缓存对象

列表主要有以下几种使用场景:

  1. 消息队列
  2. 文章列表

集合主要有如下使用场景:

  1. 标签(tag)
  2. 共同关注
    有序集合主要应用场景:
  3. 用户点赞统计
  4. 用户排序

4.Redis为什么快呢?

  1. 完全基于内存操作
  2. 使⽤单线程,避免了线程切换和竞态产生的消耗
  3. 基于⾮阻塞的IO多路复⽤机制
  4. C语⾔实现,优化过的数据结构,基于⼏种基础的数据结构,redis做了⼤量的优化,性能极⾼

5.说说I/O多路复用?

假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确:
1:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。(阻塞IO模型)
2:你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。(I/O复用模型。)

Linux系统有三种方式实现IO多路复用:select、poll和epoll。

6. Redis为什么早期选择单线程?

因为Redis是基于内存的操作,CPU成为Redis的瓶颈的情况很少见,Redis的瓶颈最有可能是内存的大小或者网络限制。
Redis 4.0 之后开始变成多线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大 Key 的删除等等。

7. Redis6.0使用多线程是怎么回事?

Redis6.0的多线程是用多线程来处理数据的读写和协议解析,但是Redis执行命令还是单线程的。(Redis的性能瓶颈在于⽹络IO⽽⾮CPU,使⽤多线程能提升IO读写的效率,从⽽整体提⾼Redis的性能。)

redis如何保持token一致性 redis存token解决什么问题_面试_03

8.Redis持久化⽅式有哪些?有什么区别?

redis如何保持token一致性 redis存token解决什么问题_面试_04

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。RDB⽂件是⼀个压缩的⼆进制⽂件,通过它可以还原某个时刻数据库的状态。由于RDB⽂件是保存在硬盘上的,所以即使Redis崩溃或者退出,只要RDB⽂件存在,就可以⽤它来恢复还原数据库的状态。

手动触发分别对应save和bgsave命令:

redis如何保持token一致性 redis存token解决什么问题_Redis_05


AOF(append only file)持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

redis如何保持token一致性 redis存token解决什么问题_面试_06

流程如下:

1)所有的写入命令会追加到aof_buf(缓冲区)中。

2)AOF缓冲区根据对应的策略向硬盘做同步操作。

3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩 的目的。

4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。

9.RDB 和 AOF 各自有什么优缺点?

RDB | 优点

1.只有一个紧凑的二进制文件 dump.rdb,非常适合备份、全量复制的场景。
2.容灾性好,可以把RDB文件拷贝道远程机器或者文件系统张,用于容灾恢复。
3.恢复速度快,RDB恢复数据的速度远远快于AOF的方式

RDB | 缺点

1.实时性低,RDB 是间隔一段时间进行持久化,没法做到实时持久化/秒级持久化。如果在这一间隔事件发生故障,数据会丢失。
2.存在兼容问题,存在老版本Redis无法兼容新版本RDB的问题。

AOF | 优点

1.实时性好,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。
2.通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

AOF | 缺点

AOF 文件比 RDB 文件大,且 恢复速度慢。
数据集大 的时候,比 RDB 启动效率低

10.RDB和AOF如何选择?

一般来说, 如果想达到足以媲美数据库的 数据安全性,应该 同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。
如果 可以接受数分钟以内的数据丢失,那么可以 只使用 RDB 持久化。

11.Redis的数据恢复?

把RDB或者AOF文件拷贝到Redis的数据目录下,如果使用AOF恢复,配置文件开启AOF,然后启动redis-server即可。

redis如何保持token一致性 redis存token解决什么问题_Redis_07


Redis 启动时加载数据的流程:

AOF持久化开启且存在AOF文件时,优先加载AOF文件。
AOF关闭或者AOF文件不存在时,加载RDB文件。
加载AOF/RDB文件成功后,Redis启动成功。
AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。

12.Redis 4.0 的混合持久化了解吗?

我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 RDB 来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。

Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。将 rdb 文件的内容和增量的 AOF 日志文件存在一起。这里的 AOF 日志不再是全量的日志,而是 自持久化开始到持久化结束 的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小:

redis如何保持token一致性 redis存token解决什么问题_Redis_08


于是在 Redis 重启的时候,可以先加载 rdb 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。

高可用

Redis保证高可用主要有三种方式:主从、哨兵、集群。

13.主从复制了解吗?

redis如何保持token一致性 redis存token解决什么问题_缓存_09


主从复制,是指将一台 Redis 服务器的数据**(主节点master),复制到其他的 Redis 服务器(从节点slave)**。

Redis 主从复制支持 主从同步 和 从从同步 两种,后者是 Redis 后续版本新增的功能,以减轻主节点的同步负担。

主从复制主要的作用?
  • 数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复
  • 负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务
  • 高可用基石: 除了上述作用以外,主从复制还是哨兵和集群能够实施的 基础,因此说主从复制是 Redis 高可用的基础。

14.Redis主从有几种常见的拓扑结构?

根据拓扑复杂性可以分为以下三种:一主一从、一主多从、树状主从结构。

redis如何保持token一致性 redis存token解决什么问题_redis如何保持token一致性_10


redis如何保持token一致性 redis存token解决什么问题_缓存_11


redis如何保持token一致性 redis存token解决什么问题_redis_12

15.Redis的主从复制原理了解吗?

  1. 保存主节点(master)信息 这一步只是保存主节点信息,保存主节点的ip和port。
  2. 主从建立连接 从节点(slave)发现新的主节点后,会尝试和主节点建立网络连接。
  3. 发送ping命令 连接建立成功后从节点发送ping请求进行首次通信,主要是检测主从之间网络套接字是否可用、主节点当前是否可接受处理命令。
  4. 权限验证 如果主节点要求密码验证,从节点必须正确的密码才能通过验证。
  5. 同步数据集 主从复制连接正常通信后,主节点会把持有的数据全部发送给从节点。
  6. 命令持续复制 接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。

16.说说主从数据同步的方式?

Redis在2.8及以上版本使用psync命令完成主从数据同步,同步过程分为:全量复制和部分复制。

redis如何保持token一致性 redis存token解决什么问题_缓存_13

17.主从复制存在哪些问题呢?

主从复制虽好,但也存在一些问题:

一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。
主节点的写能力受到单机的限制。
主节点的存储能力受到单机的限制。
第一个问题是Redis的高可用问题,第二、三个问题属于Redis的分布式问题。

18.Redis Sentinel(哨兵)了解吗?

主从复制存在一个问题,没法完成自动故障转移。所以我们需要一个方案来完成自动故障转移,它就是Redis Sentinel(哨兵)。

Redis Sentinel ,它由两部分组成,哨兵节点和数据节点:

redis如何保持token一致性 redis存token解决什么问题_缓存_14


下面是官方对于哨兵功能的描述:

  • 监控(Monitoring): 哨兵会不断地检查主节点和从节点是否运作正常。
  • 自动故障转移(Automatic failover): 当 主节点 不能正常工作时,哨兵会开始
    自动故障转移操作,它会将失效主节点的其中一个 从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
  • 配置提供者(Configuration provider): 客户端在初始化时,通过连接哨兵来获得当前 Redis 服务的主节点地址。
  • 通知(Notification): 哨兵可以将故障转移的结果发送给客户端。

其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移。而配置提供者和通知功能,则需要在与客户端的交互中才能体现。

19.Redis Sentinel(哨兵)实现原理知道吗?

哨兵模式是通过哨兵节点完成对数据节点的监控、下线、故障转移。