本期是【大厂面试 】系列文章的第6 期,模仿 Redis 基础知识 高频面试题目。
面试开始
面试官 : 明天聊聊 Redis 吧
面试官 : 都说 Redis 速度快,那 Redis 为什么这么快呢?
大彬:次要是因为以下几点起因:
- 基于内存:Redis 是应用内存存储,没有磁盘 IO 上的开销。数据存在内存中,读写速度快。
- 单线程实现(Redis 6.0 以前):Redis 应用单个线程解决申请,防止了多个线程之间线程切换和锁资源争用的开销。
- IO 多路复用模型:Redis 采纳 IO 多路复用技术。Redis 应用单线程来轮询描述符,将数据库的操作都转换成了事件,不在网络 I / O 上节约过多的工夫。
- 高效的数据结构:Redis 每种数据类型底层都做了优化,目标就是为了谋求更快的速度。
面试官 : 嗯,刚说到 Redis 是单线程实现的,你认为 Redis 为何抉择单线程呢?
独白:emm,这得问问 Redis 作者了 …
大彬 :1、单线程实现能够防止过多的 上下文切换开销。程序始终运行在过程中单个线程内,没有多线程切换的场景。
大彬 :2、 防止同步机制的开销:如果 Redis 抉择多线程模型,须要思考数据同步的问题,则必然会引入某些同步机制,会导致在操作数据过程中带来更多的开销,减少程序复杂度的同时还会升高性能。
大彬 :3、 实现简略,不便保护:如果 Redis 应用多线程模式,那么所有的底层数据结构的设计都必须思考线程平安问题,那么 Redis 的实现将会变得更加简单。
面试官:Redis 利用场景有哪些?
大彬 : 缓存热点数据,缓解数据库的压力。
大彬 :利用 Redis 原子性的自增操作,能够实现 计数器 的性能,比方统计用户点赞数、用户拜访数等。
大彬 : 作为简略的音讯队列,实现异步操作。
大彬 : 限速器,可用于限度某个用户拜访某个接口的频率,比方秒杀场景用于避免用户疾速点击带来不必要的压力。
大彬 : 好友关系,利用汇合的一些命令,比方交加、并集、差集等,实现独特好友、共同爱好之类的性能。
面试官 : 哦,Redis 怎么实现音讯队列?
独白:卧槽,给本人挖坑了 …
大彬:1、应用列表,让生产者将工作应用 LPUSH 命令放进列表,消费者一直用 RPOP 从列表取出工作。
大彬:2、公布订阅模式。相似于 MQ 的主题模式。只能生产订阅之后公布的音讯,一个音讯能够被多个订阅者生产。
大彬 :3、延时队列。应用 sortedset,拿工夫戳作为 score,音讯内容作为 key,调用 zadd 来生产音讯,消费者用zrangebyscore
指令获取 N 秒之前的数据轮询进行解决。
面试官 : 来讲讲 Redis 主从复制的原理?
大彬:嗯,Redis 的复制性能是反对多个数据库之间的数据同步。主数据库能够进行读写操作,当主数据库的数据发生变化时会主动将数据同步到从数据库。从数据库个别是只读的,它会接管主数据库同步过去的数据。
大彬:上面是主从复制的原理:
- 当启动一个从节点时,它会发送一个
PSYNC
命令给主节点; - 如果是从节点首次连贯到主节点,那么会触发一次全量复制。此时主节点会启动一个后盾线程,开始生成一份
RDB
快照文件; - 同时还会将从客户端 client 新收到的所有写命令缓存在内存中。
RDB
文件生成结束后,主节点会将RDB
文件发送给从节点,从节点会先将RDB
文件 写入本地磁盘,而后再从本地磁盘加载到内存中; - 接着主节点会将内存中缓存的写命令发送到从节点,从节点同步这些数据;
- 如果从节点跟主节点之间网络呈现故障,连贯断开了,会主动重连,连贯之后主节点仅会将局部缺失的数据同步给从节点。
面试官 : 不错,理解过期键的删除策略吗?
大彬 :1、 被动删除。在拜访 key 时,如果发现 key 曾经过期,那么会将 key 删除。
大彬 :2、 被动删除。定时清理 key,每次清理会顺次遍历所有 DB,从 db 随机取出 20 个 key,如果过期就删除,如果其中有 5 个 key 过期,那么就持续对这个 db 进行清理,否则开始清理下一个 db。
大彬 :3、 内存不够时清理。Redis 有最大内存的限度,通过 maxmemory 参数能够设置最大内存,当应用的内存超过了设置的最大内存,就要进行内存开释,在进行内存开释的时候,会依照配置的淘汰策略清理内存。
面试官:很好,明天就到这吧