redis面试试题

1.说说什么是Redis?

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

2.Redis可以用来干什么?

在这里插入图片描述

项目中的应用

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

3.Redis 有哪些数据结构?

在这里插入图片描述

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

  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的性能。)
在这里插入图片描述

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

在这里插入图片描述RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。

RDB⽂件是⼀个压缩的⼆进制⽂件,通过它可以还原某个时刻数据库的状态。由于RDB⽂件是保存在硬盘上的,所以即使Redis崩溃或者退出,只要RDB⽂件存在,就可以⽤它来恢复还原数据库的状态。
手动触发分别对应save和bgsave命令:
save和bgsave
AOF(append only file)持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。
在这里插入图片描述

流程如下:

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 启动时加载数据的流程:

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 重启的时候,可以先加载 rdb 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。

高可用

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

13.主从复制了解吗?

在这里插入图片描述
主从复制,是指将一台 Redis 服务器的数据**(主节点master),复制到其他的 Redis 服务器(从节点slave)**。
Redis 主从复制支持 主从同步 和 从从同步 两种,后者是 Redis 后续版本新增的功能,以减轻主节点的同步负担。

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

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

根据拓扑复杂性可以分为以下三种:一主一从、一主多从、树状主从结构。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

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

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

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

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

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

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

Redis Sentinel ,它由两部分组成,哨兵节点和数据节点:
在这里插入图片描述
下面是官方对于哨兵功能的描述:

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、什么是 Redis? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些方案? 11、Redis 集群方案什么情况下会导致整个集群不可用? 12、MySQL 里有 2000w 数据,Redis 中只存 20w 的数据, 如何保证 Redis 中的数据都是热点数据? 13、Redis 有哪些适合的场景? 14、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 15、RedisRedisson 有什么关系? 16、Jedis 与 Redisson 对比有什么优缺点? 17、Redis 如何设置密码及验证密码? 18、说说 Redis 哈希槽的概念? 19、Redis 集群的主从复制模型是怎样的? 20、Redis 集群会有写操作丢失吗?为什么? 21、Redis 集群之间是如何复制的? 22、Redis 集群最大节点个数是多少? 23、Redis 集群如何选择数据库? 24、怎么测试 Redis 的连通性? 25、Redis 中的管道有什么用? 26、怎么理解 Redis 事务? 27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的? 31、Redis 回收使用的是什么算法? 32、Redis 如何做大量数据插入? 33、为什么要做 Redis 分区? 34、你知道有哪些 Redis 分区实现方案? 35、Redis 分区有什么缺点? 36、Redis 持久化数据和缓存怎么做扩容? 37、分布式 Redis 是前期做还是后期规模上来了再做好?为 什么? 38、Twemproxy 是什么? 39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同? 41、Redis 的内存占用情况怎么样? 42、都有哪些办法可以降低 Redis 的内存使用情况呢? 43、查看 Redis 使用情况及状态信息用什么命令? 44、Redis 的内存用完了会发生什么? 45、Redis 是单线程的,如何提高多核 CPU 的利用率? 46、一个 Redis 实例最多能存放多少的 keys?List、Set、 Sorted Set 他们最多能存放多少元素? 47、Redis 常见性能问题和解决方案? 48、Redis 提供了哪几种持久化方式? 49、如何选择合适的持久化方式? 50、修改配置不重启 Redis 会实时生效吗?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值