Redis综合面试题
2020-12-18 18:48:18 0 举报
AI智能生成
redis面试总结思维导图
作者其他创作
大纲/内容
数据结构篇
String
SDS
简单动态字符串
与C语言实现的字符串有什么不一样?
Zset
底层数据结构是什么?
skiplist
为什么使用跳表而不是B树等数据结构
1.算法实现相对简单
2.占用内存相对较少,平均指针数少
3.范围查找
跳表根据数据的顺序性查找相对简单,树查找需要找到范围然后继续遍历相对困难
4.插入和删除
平衡树的插入和删除操作可能引发子树的调整,逻辑复杂
skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速
5.跳表相对灵活
时间/空间复杂度分析
平均时间复杂度为O(logN)
ziplist
Hash
List
Stream
Set
HyperLogLog
BitMaps
GEO
Redis的渐进式rehash的过程和原理
性能优化篇
内存碎片
产生内存碎片的原因
1.redis自身的内存分配器。
解决方案
1.config get activedefrag 命令查看处理内存碎片的开关是否开启
2.memory purge命令手动清理内存碎片
大Key/Value
链接池
Jedis
热点Key
定义
解决方案
热点发现
预估热点key
redis4.0 特性支持发现
热点统计
客户端统计
代理统计
热点处理
阿里云读写分离方案解决热读
缓存击穿
定义
解决方案
方法1
方法2
缓存雪崩
定义
解决方案
缓存穿透
定义
解决方案
1.对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
2. 对于在数据库中查询是空的情况,仍然进行缓存。只是时间设置短一点
数据淘汰策略
惰性删除
某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除,惰性删除的缺点很明显是浪费内存。
定时删除
每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。
volatile-lru
allkey-lru
volatile-random
olatile-random
allkey-random
volatile-ttl
立即删除
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。
有哪些因素可能导致Redis性能降低?
运维&配置
redis-trib.rb
常用运维配置项
与Encache比较
高可用篇
版本迭代
Redis3.0
Redis4.0
Redis5.0
Redis6.0
集群模式redis-cluster
优点
缺点
redis key选择槽的过程
1.通过key映射到一个0-16384的整数
2.计算key字符串对应的映射值,redis采用了crc16函数然后与0x3FFF取低16位的方法。crc16以及md5都是比较常用的根据key均匀的分配的函数,就这样,用户传入的一个key我们就映射到一个槽上,然后经过gossip协议,周期性的和集群中的其他节点交换信息,最终整个集群都会知道key在哪一个槽上。
背景:
部署介绍
Redis Cluster 集群节点最小配置 6 个节点以上(3 主 3 从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
Redis Cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 0~16383 个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。
客户端分片/代理redis-proxy
部署模式
客户端代理+master/slave
客户端代理+redis Cluster
客户端代理产品
codis
单机部署
主从部署(多副本)
优点
缺点
主从复制的过程?
主节点挂了之后主从复制的过程?
redis集群中的ping/pong
使用的协议是什么?
cluster bus
作用是什么?
集群之间相互探活
发现新的节点、发送PING包、特定情况下发送集群消息,集群连接能够发布与订阅消息。
ping/pong的过程?
哨兵模式redis Sentinel
优点
Redis Sentinel 集群部署简单;
能够解决 Redis 主从模式下的高可用切换问题;
很方便实现 Redis 数据节点的线形扩展,轻松突破 Redis 自身单线程瓶颈,可极大满足 Redis 大容量或高性能的业务需求;
缺点
1.部署相对 Redis 主从模式要复杂一些,原理理解更繁琐;
2.资源浪费,Redis 数据节点中 slave 节点作为备份节点不提供服务;
3.对于数据节点下线的情况下只做主观下线和客观下线的过程,并不执行故障转移
监控节点下线的过程
主观下线
客观下线
故障转移通过集群选举的方式从slave选出master
主要功能
1.集群监控:负责监控reidis master 和slave 进程是否正常工作;
2.消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员;
3.故障转移:如果master node挂掉了,会自动转移到slave node上;
4.配置中心:如果故障转移发生了,通知client 客户端新的master 地址;
核心说明
1.哨兵至少需要3个实例,来保证自己的健壮性;
2.哨兵+redis 主从的部署架构,是不会保证数据0丢失的,只能保证redis 集群的高可用性;
3.对于哨兵+redis主从这种负责的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练;
redis集群选举过程
raft协议过程?
数据同步&持久化
全同步
部分同步
AOF
相关配置
1.appendonly yes
2.appendfilename "appendonly.aof"
3.# appendfsync always
appendfsync everysec
# appendfsync no
appendfsync everysec
# appendfsync no
4.auto-aof-rewrite-percentage 100
5.auto-aof-rewrite-min-size 64mb
优点
1.数据的完整性和一致性更高
缺点
2.因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
解决方案
1.AOF重写,写一个新的AOF文件,然后替换旧的AOF文件
Append only File缩写
核心函数
flushAppendOnlyFile定期执行
条件
write
将AOF buffer中的缓存写入AOF文件
save
调用fsync或者fdatasync函数,将AOF文件保存到磁盘中
RDB
相关配置
优点
1.适合大规模的数据恢复
2.如果业务对数据完整性和一致性要求不高,RDB则是很好的选择
缺点
1.无法实现秒级或者实时的数据持久化
2.RDB文件通过fork子进程完成数据备份,数据量比较大的情况下会导致服务端性能降低
AOF和RDB的区别
1.RDB可以备份多次,有多个数据文件,AOF只有一个文件
2.RDB文件存储的是Redis数据,AOF则是一个个指令数据(RESP通讯协议格式)
3.RDB数据恢复比AOF快
4.AOF文件更新频率相对较高
Redis混合持久化
Redis混合持久化是怎么实现的?
Redis4.0支持混合持久化,但是默认关闭
Redis混合持久化之后是一个文件还是多个文件?
一个aof文件
容量评估
扩容
扩容过程
1.准备新节点
2.加入集群
3.迁移槽和数据
索容
应用场景篇
排行榜
缓存
数据淘汰策略
序列化
分布式锁
优点和缺点
lua脚本
redisson
原理
利用redis命令执行是单线程和原子性的操作模型实现
redis锁超时的问题如何解决?
1.使用守护线程的方式去定时为锁续航,但是要注意当前持有锁的对象是否相同
2.在lua脚本中设置当前线程的id
3.redlock
消息的发布订阅
高可用性
布隆过滤
限流
实现原理
事务
与Mysq事务的比较
特点
消息队列
高可用性
实现原理
分布式ID生成器
内核架构
单线程架构
是真的单线程吗?
1.不是单线程,只是执行命令的时候是单线程执行
2.redis的多线程部分只是用来处理网络数据的读写和协议解析
单线程的优点
1.避免多线程切换带来的性能损耗
2.性能瓶颈主要是在IO和网络上面,因此单线程在CPU上执行是最佳的方法
事件驱动机制
时间事件
IO事件
IO多路复用模型
数据一致性
Cache Aside 更新策略
情况1:先更新数据库,后更新缓存
情况2:先删除缓存,后更新数据库
情况3:先更新数据库,后删除缓存
Read/Write Through 更新策略
策略1:Read Through:在查询的过程中更新缓存;
策略2:在写操作的过程中如果命中缓存,则直接更新缓存,数据库则由缓存自己同步去更新;
Write Behind Caching 更新策略
与memcached比较
1.redis支持更多更复杂的数据结构
2.redis原生支持集群模式,memcached需要借助客户端实现集群功能
3.redis只适用单核,memcached可以使用多核
收藏
收藏
0 条评论
下一页