咱们一起来看看 redis 常问罕用的面试题

Redis 是个啥?

http://www.redis.cn/ redis 中文网给了很明确且清晰的定义

  • Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统
  • Redis 能够用作数据库、缓存和消息中间件
  • 反对的数据结构有 8

    字符串(strings), 散列(hashes), 列表(lists), 汇合(sets), 有序汇合(sorted sets), bitmaps, hyperloglogs 和 geospatial

应用 redis 有什么好处?

  • 存取的数据都十分快,redis 的数据是间接在内存中操作的
  • 个性丰盛:可用于缓存,音讯队列,等等
  • 反对 8 种 数据类型

Redis 为什么这么快嘞?

首先 redis 是单线程的,很多人认为单线程就肯定慢,多线程就肯定快,这是一个误会

  • redis 应用多路 I/O 复用模型,非阻塞 的 IO
  • 采纳单线程,就不会有上下文切换的耗费,不必去思考加锁和解锁的事件,没有竞争资源呈现的性能耗费
  • 数据结构很简略,上述 8 种 数据类型,一学就会
  • 操作 redis 的数据,根本是在妥妥的操作内存,必须快

Redis 能够长久化吗?能够的话,长久化的形式有哪些?

能够长久化,有 2 种形式, RDB 和 AOF , redis 默认是反对 RDB 长久化

  • RDB 长久化形式

在指定工夫距离内将内存中的数据集快照写入到磁盘中,这就是快照 snapshot ,复原快照的时候,是把快照文件读入到内存中。

redis 通过 fork 的形式创立一个子过程来专门做长久化的动作

劣势

  • 适宜大规模的数据恢复
  • 对数据的完整性要求不高

劣势

  • 须要在肯定的工夫距离进行操作,如果 redis 意外宕机,最初一次写入的数据就会失落
  • fork 子过程的时候须要占用肯定的空间
  • AOF 长久化形式

AOF 是 redis 的另外一种长久化形式,以日志的模式记录每一个写操作,将 redis 执行过的写操作全副记录下来,只容许追加文件,不容许改写文件

劣势

  • 每一次操作 reids 都会被记录,文件的完整性好
  • 每秒同步一次,可能会失落一秒的数据
  • 从不同步,这个效率是最高的

劣势

  • 绝对于数据文件来说,aof 文件会远大于 rdb 文件,修复的速度也比 rdb 文件慢
  • aof 运行的效率比 rdb 慢,所以 redis 默认的配置是 rdb 长久化

Redis 利用场景有哪些嘞?

  • 简略的音讯队列

简略的音讯队列做公布订阅的性能,应用到 redis 中 List 数据结构,能够通过 lpush 和 rpop 写入和读取音讯,这个仅仅实用于简略的音讯队列,如果数据量大,要求数据一致性,性能要好等等,当然首选业余的音讯队列组件

  • 用于缓存

将常常须要拜访的数据拜访 redis 中,并且要设置好 redis 的内存最大限度和删除 key 的策略

  • 用于计数器

例如网页访问量,点赞量等等,redis 反对自增和自减操作,数据都是在内存中,很适宜做计数

  • 做分布式锁

redis 自带的命令 SETNX ,人造能够做分布式锁,用于管控多个节点的有序运行,当然 redis 本人也提供了 RedLock 给大家应用

RedLock 是个啥

Redis 官网站提供的基于 Redis 实现分布式锁的形式,它有如下个性:

  • 容错性

只有大部分 Redis 节点存活就能够失常提供服务

  • 平安个性

RedLock 是互斥拜访的,永远只有一个 redis 客户端能拿到锁,执行操作

  • 防止死锁

最终 redis 客户端都可能拿到锁,不会呈现死锁的状况

  • 做排行榜

应用 zset 做排行榜,top xx 等利用

  • 做独特关注,做发现身边的好友

redis 提供汇合 set ,能够计算出独特的好友,独特的趣味,等等利用

Redis 的删除过期的 key 是如何解决的?

有 3 种形式:

  • 定时过期

定时过期,就是每当设置一个 key 的时候,都给这个 key 设置对应的定时器,当这个 key ttl 到期时,就将这个 key 删除掉

每个 key 都设置了过期工夫就要弄一个定时器,这样十分耗费 cpu 资源,进而影响 redis 性能

  • 定期过期

定期过期,就是设置每隔一段时间,扫描 redis 中设置过期工夫的 key,并且删除掉其中曾经过期的 key。

  • 惰性过期

惰性过期,就是每当拜访这个 key 的时候,才去判断这个 key 是否生效,生效就删掉,若不拜访,则这个 key 就始终存在内存中,会占用大量的内存

Redis 事务的实质是什么?

就是一组命令的汇合,一个事务中所有的命令都会被序列化,在事务执行的过程,是依照程序执行命令的,他们领有

  • 一次性
  • 程序性
  • 排他性

redis 的事务没有隔离级别的概念

redis 事务中,命令是这样执行的

命令放在事务中,并没有马上执行,而是发动执行命令的时候才会执行,通过 exec 触发

redis 是单条指令保障原子性,然而事务不保障原子性

执行一个事务的流程是这个样子的:

  • multi 开启事务
  • 各种命令入队
  • exec 执行事务

事务的 ACID 别离指的是什么?

  • Atomicity 原子性

原子性指的是,事务是一个不可分割的整体,要么一起胜利,要么一起失败

  • Consistency 一致性

执行事务前和执行事务后,数据的完整性都必须保持一致

  • Isolation 隔离性

多个事务同时在解决的时候,互不烦扰,互补影响,各玩各的

  • Durability 持久性

指的是,事务一旦被提交,那么影响的数据是持久性的

Redis 主从复制的原理是什么?

Slave 启动胜利连贯到 master 后会发送一个 sync 命令

master 收到命令后,启动后盾存盘过程,同时收集所有接管到用于批改数据库集命令,在后盾过程执行结束后,master 过程将传送整个数据文件给到 slave ,并实现一次同步

全量复制

slave 服务接管到 master 传过来的数据后,将其存盘并加载到内存

增量复制

master 将新的收集到的所有批改的命令顺次传递给 slave ,并实现同步

一旦从新连贯 master 节点,一次齐全的全量同步就会被执行

哨兵模式是干啥的?

哨兵模式,次要是用于实现 redis 集群的高可用

因为应用主从复制的形式,当 redis 主机宕机时,没有方法选举出一个主机进去,哨兵模式能够

哨兵的作用

  • 通过发送命令,Redis 服务器返回监控状态信息,包含主服务器和从服务器的
  • 若哨兵检测到主服务器宕机,会主动将slave 切换 master,而后通过公布订阅告诉其余从服务器,批改配置文件,让他成为主机

主观下线

如果 master 服务器宕机了,那么其中一个哨兵就会检测到,零碎并不会马上执行 failover 的过程,仅仅是以后这个哨兵,判断 master 不可用,这个就是主观下线

主观下线

集群中个别哨兵也是集群的,若部署了 3 个哨兵

当其余两个哨兵也发现 master 服务器不可用的时候,那么哨兵之间就会产生投票,具体的投票算法咱们后续再写,投票的构造由一个哨兵发动,进行 failover 故障转移的操作,切换胜利之后,就会通过公布订阅模式,让每一个监控的哨兵把本人监控的服务器切换到这个 master 服务器上, 这个就是 主观下线

redis 的 穿透,击穿,雪崩问题能够查看上一篇文章:【Redis 系列】redis 学习十二,redis 缓存穿透,缓存击穿,缓存雪崩

参考资料:

redis_doc

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是小魔童哪吒,欢送点赞关注珍藏,下次见~