admin管理员组文章数量:1794759
5000字,redis面试题附带答案
前言
大家好,我是台州光头佳,
2021年一夜暴富的梦没有梦到,指尖逝去的头发那都是青春,
希望新的一年变的更强,我将自己遇到和网上关于redis的面试题收集,
以便搞定越来越卷的面试,期待你们能找到更好的工作,获得更高的薪资。
如果出现错误的地方,欢迎各位大佬指正。
目录- 前言
- 面试题
- redis认知题
- 数据类型题
- 分布式锁与key题
- 集群部署题
Q:我看到你们项目有使用redis,那么为什么要使用redis? A: 是这样的,因为redis的高性能,高可用的特性,非常适合我们的业务需求。
Q:那么redis是如何实现高性能,为什么有高可用的说法? A: 高性能实现: 1.基于内存读写 2.高效的数据结构,合理的数据编码 3.采用多路复用IO模型
高可用说法: 1.多样的数据类型 2.完善的持久化方案 3.成熟的集群化部署
Q:既然你说到多路复用IO,什么是多路复用IO模型? A:IO多路复用其实就是一种同步IO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,导致缓慢。
Q:我们知道redis是单线程,为什么处理请求还是这么快? A:另类的高性能问法 1.基于内存读写 2.高效的数据结构,合理的数据编码 3.采用多路复用IO模型
Q:Lettuce,Redisson,Jedis 三种客户端有什么区别? A: Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持, Redisson:实现了分布式和可扩展的Java数据结构。 Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。
Q:如何保证缓存与数据库双写时的数据一致性? A:可以将读请求和写请求串行化,但是一般不建议这么操作, 因为为了保证一致性会影响高性能。
Q:如果需要往redis中写入大量指令,怎么操作更合适? A:redis支持pipe 管道传输
Q:如果需要往redis中写入大批量数据,怎么操作更合适? A:redis支持开启pipe mode模式大批量插入数据。
Q:redis中雪崩,穿透,击穿三种现象? A: 雪崩:瞬间大量key失效,大量请求到数据库,造成数据库奔溃。 穿透:数据库表id主键自增,用-1请求穿过redis,重复去数据库请求。 击穿:特殊的key需要频繁获取,失效时会有大量请求到数据库。
Q:对于这三种现象有什么较好的处理方式? 雪崩:设置有效期时添加一点浮动时间 穿透:设置拦截器或者使用布尔拦截器 击穿:对热点key设置永久有效期
Q:MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 A: 开始吹LRU算法,具体可以看看这篇LRU算法
Q:使用redis时候,我们知道一个服务器是有内存上限,如果到达上限时,你知道那几个回收策略? A:Redis的内存淘汰策略: 1.当内存不足以容纳新写入数据时,新写入操作会报错。 2.当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。 3.当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
Q:redis 如何开启事务? A: MULTI指令开始事务 ,写入多条命令入队,EXEC指令事务执行 或者不好意思,我们不使用redis的事务,因为事务不保证原子性。 我们一般使用lua脚本,一次性执行。
Q:redis如何实现数据持久化? A:redis持久化分为两种模式:
优:性能好,因为采用fork子进程完成的操作,不影响redis的读写效率 | 优:安全性高 |
缺:快照存储是间隔行的,会遗失数据 | 缺:日志文件比rdb文件大,写入较慢且在还原的时候也慢 |
Q:你们是选择那种模式的? A:我们两种都有使用,双方的优缺点可以互补。
Q:使用RBD时候频繁写入快照rdb文件,会不会对服务器有影响? A:不会的,Redis 调用forks的子进程将数据集写入到一个临时 RDB 文件中。 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
Q:如果使用AOF日志持久的时候AOF文件损坏了怎么办? A:Redis 附带的 redis-check-aof 程序,可以对原来的 AOF 文件进行修复, 然后重启服务器载入修复好的文件即可。
Q:持久化大致执行过程是? 1.客户端向数据库发送写命令(数据在客户端的内存中) 2.数据库接受到客户端写请求(数据在服务器的内存中) 3.数据库调用系统api将数据写入磁盘(数据在内核缓存去中) 4.操作系统将写缓冲区传输到磁盘控制器(数据在磁盘缓存中) 5.操作系统的磁盘控制器将数据写入实际的物理媒介中(数据在磁盘中)
数据类型题Q:你开发中使用过那些数据类型? A: 1.String:字符串 2.List:集合 3.Set:不重复集合 4.Hash:哈希 5.ZSet:不重复有序集合
Q:除了这五种基础数据类型,你还知道别的吗? A: 1.HyperLogLog:基数统计算法,可以用于大数据统计,例如用户每个页面访问量 2.Bitmaps:以0或者1单元的位数组 3.Geospatial:地理空间,高效存储地图信
Q:你有更进一步了解过例如String的底层数据结构吗? A:是SDS动态字符串
Q:SDS动态字符串相比一般字符串有什么优势? A: 1.更简单获取字符串长度 2.杜绝缓冲区溢出 3.减少修改字符串带来的内存分配次数 4.二进制安全
Q:那么SDS动态字符串的存储方式是? A:因为redis在存储String的数据并不是全部是SDS, 存储字符串长度小于21且能够转化为整数的字符串是int储存 存储字符串长度小于44的字符串是embstr存储 存储字符串长度大于44的字符串是raw存储
这里有文档里查询,一般面试底层问String,其他的知道使用场景即可: Redis 数据类型介绍
分布式锁与key题Q:redis中如何实现分布式锁? A:使用setnx指令来争抢锁,然后expire添加一个过期时间。
Q:假设你的过期时间是10s,但是程序执行需要20s,这个时候分布式锁已经失效,怎么办? A: 一般我们使用redisson中的看门狗守护机制来解决这个问题。
Q:redis是如何判断某个key失效的? A: redis的过期键删除策略: 1.定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除 2.惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。 3.定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
Q:假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? A:使用keys指令可以扫出指定模式的key列表。
Q:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题? A:keys指令会导致线程阻塞一段时间,线上服务会停顿。
Q:是否有更好的方式? A:可以使用scan指令但是比起keys会更慢且有重复概率,看当时的情况决定。
集群部署题Q:你们redis是集群化部署的吧? A:是的,我们使用主从模式部署
Q:主从模式有什么优势? A: 1.读写分离,降低服务器压力 2.增加容错率,slave单一节点宏机,无影响
Q:那么主从模式下master和slave之间数据是如何同步的? A: 一:全同步(启动时候全同步) 1.在slave启动时,会向master发送一条sunc命令 2.master收到命令后,启动一个备份进程将所有的数据写到rdb文件 3.更新master状态,然后将rdb文件内容发送给slave。 二:部分同步(运行过程中同步) 1.master收到一个操作,然后判断是否同步slave 2.如果需要同步,记录到aof文件中 3.遍历所有的slave,将操作和参数写入到slave的回复缓存中 4.slave对应的socket发送缓存写入数据,
Q:如果master节点挂了会怎么样? A:额,这个时候将无法往redis中写入数据,但是如果slave正常的话还是能够读取的。
Q:你有了解过哨兵模式吗? A:有的,哨兵模式相比主从模式,优势的地方 1.节点监控:监控各节点运行状态 2.故障转移:主节点发生故障后,可以通过再次选举产生主节点,实现故障恢复
Q:比如故障转移,有A,B,C三台机器,那一台机器升级为master? A:故障转移使用的是一种叫选举算法,或者有些类型美国选总统, 候选人A,B,C,三台机器即是选举人也是被选举人, 假如A发现总统挂了,他想当总统那么他就会向B,C去拉票,并且将自己的属性更改为选举人 如果B,C都支持他,那么他就会升级为总统, 假如B也发现总统挂了,他也想当总统那么他就会向A,C去拉票,但是A已经是选举人身份 且C服务已经将自己的选票给了A,因此A就是总统
当然也可以选择那个节点小,那个就直接升级为master方式。
Q:如果数据量太大,服务器支持不住,升级配置又太贵,你有了解过cluster模式吗? A:没有,快滚 cluster模式会将Redis的数据通过虚拟槽分区算法分配到多台机器。 Redis集群通过分片的方式来保存数据库中的键值对,集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。每一个节点负责维护一部分槽以及槽所映射的键值数据。 cluster基本是主从+哨兵+分区多个模式的聚合体,比较适用大数据高并发场景。
Q:分了这么多个分区,我怎么知道该请求那个节点获取数据? A:redis存储了一个二进制数组类似于布隆过滤器,上面存储着节点对应的槽数据
Q:在集群中你知道MOVED 重定向? A: 一个 Redis 客户端可以自由地向集群中的任意节点(包括从节点)发送查询。接收的节点会分析查询,如果这个命令是集群可以执行的(就是查询中只涉及一个键),那么节点会找这个键所属的哈希槽对应的节点。 如果刚好这个节点就是对应这个哈希槽,那么这个查询就直接被节点处理掉。否则这个节点会查看它内部的 哈希槽 -> 节点ID 映射,然后给客户端返回一个 MOVED 错误。
Q:知道为什么不能单纯地使用 MOVED 重定向? A: 当我们使用 MOVED 的时候,意味着我们认为哈希槽永久地被另一个不同的节点处理,并且希望接下来的所有查询都尝试发到这个指定的节点上去。
Q:很好,你知道ASK 重定向? A: Ask重定向发生于集群伸缩时,集群伸缩会导致槽迁移,当我们去源节点访问时,此时数据已经可能已经迁移到了目标节点,使用Ask重定向来解决此种情况。 发送 ASKING 命令实际在客户端设置了一个一次性标识(one-time flag),强制一个节点可以执行一次关于带有 IMPORTING 状态的槽的查询。
版权声明:本文标题:5000字,redis面试题附带答案 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686561823a82122.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论