redis面试必备
2025-09-09 09:53:47 0 举报
AI智能生成
Redis,作为高性能的key-value数据库,其面试必备内容涵盖了数据结构、持久化策略、应用场景以及性能优化等关键知识点。掌握Redis核心原理,如它的单线程模型、内部数据结构类型(例如:String、List、Set、Sorted Set和Hash),以及这些数据结构所支持的原子操作,对于应聘者至关重要。同时,面试官也会期待应聘者对Redis的持久化机制有深入理解,包括RDB快照和AOF日志记录方式,并了解它们在实际应用中的权衡与选择。此外,对于Redis的分布式特性,比如哨兵模式(Sentinel)和集群模式(Cluster),以及高可用和扩展性的理解,也是面试时的重要考察点。能够结合具体场景谈论Redis的使用经验,如何根据实际需要选择合适的数据结构和调优技巧,将为面试者加分。对最新版本的新特性有跟踪和实践,如Redis 6的ACL(访问控制列表)功能,也是面试中的亮点。总之,一份扎实的Redis理论知识和实践经验,将使应聘者在面试中更加出色。
作者其他创作
大纲/内容
数据结构
字符串string
动态字符串SDS
结构
存储了字符串长度len,获取字符长度复杂的是O(1)
free,记录buf没有使用的空间
buf[],存储字符串,长度是len+free+1
特点
自动扩展和释放内存
可以直接存储二进制数据
支持动态调整大小
缓冲区溢出保护:会在最后加上\0作为结束标识,,可以防止缓冲区的溢出问题
惰性空间释放
当SDS缩短字符串时,并不会立即释放多余的空间,而是将多余的空间保留下来,以备后续的再利用。这种惰性空间释放的策略可以减少内存分配和释放的开销,提高内存利用率。
列表list
双端链表
结构
链表主属性
len:当前链表长度
head:头节点指针
tail:尾结点指针
节点的结构
prev指针
next指针
value
特点
顺序插入
LPUSH:头部插入一条记录
RPUSH:尾部插入一条记录
压缩链表:数据量少的时候会使用压缩列表
分配一块连续的内存,将元素紧挨着存放
因为链表需要prev和next指针,在数据量少的时候,更费空间
快速列表
结合压缩列表和双端列表的特点
结构
多个压缩列表用双端链表连接
每个快速列表的节点
当节点中的数据满足一定条件时,快速列表会启用压缩功能,对节点中的数据进行压缩,以进一步节省内存空间。
哈希表Hash
字典(hashtable)
当键值对的数量特别多,或者键值对的键和值特别长的时候会选择用hashtable
优点
高效的插入和删除
支持动态扩容
缺点
内存空间占用较大
不适合键值对比较少,且键值对的键和值都不长的情况,会比较浪费空间
压缩列表
哈希表中的键值对数量较小或者且每个键值的长度都比较短,这时候就会选择压缩列表
优点
节省空间
适合小型数据的存储和访问
缺点
插入和删除效率比较低
不支持动态扩容,当数据量达到一定量之后会重新分配内存空间并重键压缩列表,这时候有可能会重建位hashtable
集合Set
字典(hashtable)
集合是通过hashtable实现的
其中集合的元素存储在字典的键中,而字典的值则被设置为 NULL。
特点
无序:集合中的元素是无序的,即元素的存储顺序是不确定的。
唯一性:集合中不允许重复的元素,每个元素只能出现一次。
应用场景
存储唯一的用户 ID、标签、标识符等。
进行交集、并集、差集运算,用于数据分析、统计等。
有序集合Zset
压缩列表
元素较少或元素较小的时候会使用压缩列表
Zset 键值对数量少于 128 个
每个元素的长度小于 64 字节
跳表
元素较多或元素较大的时候会使用跳表
当开始的时候插入元素较少且元素较小,会使用压缩列表,但是出入的元素特别多,或者元素特别大的时候会重建位跳表,反过来不会
结构
跳表是基于链表加上多级索引实现的,可以理解为多级链表
跳表通过维护多级索引,每个级别的索引都是原始列表的子集
结构类似MySQL的B+树
B+ Tree的查询复杂度也是O(log n),但由于其实现较为复杂,所以在实际使用中通常用于数据库系统等需要高效读写的场景中。
平衡二叉树/红黑树
为什么不选择呢,因为插入和删除比较消耗性能,需要保持树的平衡
特点
高效的有序数据存储和检索功能。
时间复杂度方面:大部分情况下,跳跃表的效率和平衡树媲美;
数据淘汰策略:当内存不足时,redis会根据预先设定了淘汰策略删除键,redis内存到达配置的maxmemory限制时,会触发内存淘汰策略
LRU(Least Recently Used最近最少使用):LRU策略会删除最近最少被访问的键。
LFU(Least Frequently Used最不经常使用):LFU策略会删除最不经常被访问的键。
TTL(键的过期时间):TTL策略会删除已经过期的键。
随机删除:随机删除策略会随机选择一些键进行删除。
淘汰固定数量的键:淘汰固定数量的键策略会选择要删除的键的数量
过期键删除
惰性删除:调用的时候才删除
定期删除:默认10秒随机抽查一部分,删除过期的
内存碎片管理
遍历内存空间
合并相邻的空闲内存块
移动数据
如果有必要,Redis可能会将数据从一个内存块移动到另一个内存块,以便更好地组织内存空间。这个过程可能会比较耗时,因为需要将数据从一个位置复制到另一个位置。
释放不再使用的内存块
单线程模式
瓶颈:redis的瓶颈通常不是CPU,而是内存和网络带宽
优点
没有上下文切换
单线程模式保证了一次只有一个数据处理,不需要锁机制,,避免了多线程中的锁竞争和死锁问题
内存操作,更高的内存读写速度
非阻塞I/O多路复用技术(默认使用的epoll):因为是单线程的,无法充分利用多核处理器的性能优势,
在一个线程内监听多个socket连接,,当收到请求的时候再逐一处理
使得单线程实现高并发场景
0 条评论
下一页