redis面试

发布时间:2026/9/15 18:42:12
redis面试
等级使用经历基础掌握场景设计原理理解描述入门曾接触或使用过该技术完成过基础任务能进行基础操作和配置解决简单问题仅能处理非常简单的任务或场景对技术原理了解有限仅知核心概念能完成简单任务理解技术作用但缺乏深度熟练有一定项目经验多个任务或模块使用过该技术能熟练使用常用功能解决常见问题能独立设计和实现常见任务或模块对技术原理有基本理解能解释核心机制能独立完成工作对常见问题有解决方案高级多个复杂项目经验技术使用广泛掌握高级操作、优化和调优方法能处理复杂场景综合考虑性能、容错和扩展对内部机制深入理解能分析瓶颈和优化策略能设计和优化复杂系统或任务解决技术难题专家企业级或大规模系统经验技术使用全面精通所有功能、最佳实践和优化方法能设计高可用、高性能、可扩展的系统架构对内部原理、架构、设计思路全面掌握能主导系统设计提供技术方案和优化策略解决极复杂问题1、Redis有哪几种基本数据类型Redis有5种基本数据类型分别是1、String(字符串)普通的key、value可以归为此类2、List链表可以用作消息队列利用List的push操作将任务放在List中元素可以重复3、Set集合交集可以看共同好友4、Zset有序集合用在排行榜取TopN操作4、Hash哈希存储对象比如用户姓名、性别、爱好、文章标题、作者、内容2、Redis底层数据结构是哪几个2.1 Sring字符串底层数据结构-SDSString字符串的底层结构就是SDS简单动态字符串其结构如下struct sdshdr { //记录buf数组中已使用字节的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用字节的数量表示声音可用空间 int free; //字节数组用于存放字符串 char buf[]; };2.2 List链表底层数据结构List链表的底层数据结构是双向链表和压缩列表ziplist双向链表的结构如下图所示有什么特点呢1每个链表节点都有一个指向前置节点和后置节点的指针所以是双向链表2因为链表表头节点的前置节点和表尾节点的后置节点都指向NULL所以Redis的链表实现是无环链表。压缩列表是Redis为了节约内存而开发的是由一系列特殊编码的连续内存块组成的顺序性sequential数据结构。一个压缩列表可以包含任意多个节点entry每个节点可以保存一个字节数组或者一个整数值下图是压缩列表的各个组成部分为什么List链表要使用双向链表和压缩列表这两种数据结构什么时候使用双向链表什么时候使用压缩列表ziplist作为底层实现呢压缩列表ziplist是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项并且每个列表项要么就是小整数值要么就是长度比较短的字符串那么Redis就会使用压缩列表来做列表键的底层实现。压缩列表比双端链表更节约内存并且在元素数量较少时在内存中以连续块方式保存的压缩列表比起双端链表可以更快被载入到缓存中随着列表对象包含的元素越来越多使用压缩列表来保存元素的优势逐渐消失。所以双端链表适合保存大量元素。更精准的条件是1列表对象保存的所有字符串元素的长度都小于64字节2列表对象保存的元素数量小于512个同时满足这两个条件才会使用压缩列表ziplist否则就使用双端链表2.3 Set集合底层数据结构set底层是由哈希表hashtable或整数集合intset来实现的当元素是整数时采用整数集合intset数据结构。当元素不是整数或者元素个数大于512个时则使用哈希表的数据结构HashTable哈希表很好理解就是java中的HashTable整数集合intset可以保存类型为int16_t、int32_t、int64_t的整数值并且保证集合中不会出现重复元素。整数集合有序、无重复当集合对象同时满足以下两个条件时对象使用整数数组intset编码1集合对象保存的所有元素都是整数值2集合对象保存的元素数量不超过512个。注意第二个条件的上限值可以改2.4 Zset有序集合底层数据结构zset底层是由压缩列表ziplist和跳表skiplist来实现的当有序集合中的元素小于128个或者有序集合中所有元素的长度小于64个字节时采用压缩列表否则采用跳表。2.5 Hash哈希底层数据结构Hash底层是由哈希表hashtable和压缩列表ziplist来实现的当哈希对象可以同时满足以下两个条件时哈希对象使用压缩列表ziplist编码1哈希对象保存的所有键值对的键和值的字符串长度都小于64字节2哈希对象保存的键值对数量小于512个不能满足这2个条件的哈希对象需要使用hashtable编码注意这两个条件中的上限值是可以修改的3、RDB和AOF有什么区别1. 基本概念持久化方式定义RDB将 Redis 在某个时间点的内存快照保存到磁盘文件中文件默认是dump.rdbAOF将 Redis 执行的写命令日志追加到文件中默认appendonly.aof可以通过重放日志恢复数据使用建议仅 RDB数据可以容忍丢失追求性能仅 AOF数据重要需要最小化丢失可接受文件增长和恢复稍慢RDB AOF常用方案RDB 快照 AOF 增量日志兼顾性能和数据安全Redis 启动时优先加载AOF文件如果存在4、redis有哪些部署方式有什么区别侧重点是什么1. 单机部署Standalone结构单个 Redis 实例所有数据存储在一台服务器上。特点最简单安装和运维成本低。无高可用机制节点挂掉数据可能丢失。适用场景测试环境、小规模缓存。侧重点性能优化内存、持久化。简单的监控和备份。2. 主从复制Master-Slave结构一个主节点Master负责写操作。一个或多个从节点Slave负责读操作和数据备份。特点读写分离可以提高读吞吐量。从节点可以用于数据冗余和故障恢复。主节点挂掉需要手动或使用哨兵切换。适用场景提升读性能。对数据有备份需求但可容忍短暂主节点不可用。侧重点主从同步机制全量同步 / 增量同步。数据一致性问题异步复制可能有短暂延迟。3. 哨兵模式Sentinel结构多个 Redis 节点组成主从结构。Sentinel 节点负责监控、故障自动切换和通知客户端。特点高可用主节点挂掉时自动选举新的主节点。Sentinel 节点可以水平扩展。保证 Redis 集群在单节点故障情况下仍可服务。适用场景对高可用要求高的生产环境。容忍部分节点失败但保证服务可用。侧重点故障自动检测与切换。配置 Sentinel 数量和 quorum 策略。4. 集群模式Cluster结构Redis Cluster 将数据分片存储在多个节点上。支持主从复制部分节点故障可自动恢复。默认使用16384 个槽slots来分布数据。特点水平扩展增加节点可以线性扩展容量和性能。自动分片和高可用。客户端需要支持 Cluster 模式。适用场景大规模 Redis 系统数据量超单机内存。对高可用、高扩展性要求高。侧重点数据分片策略和槽分配。节点故障自动迁移和复制。客户端的 slot 路由能力。部署对比总结部署方式高可用扩展性运维复杂度数据安全性读性能写性能单机××简单低单机单机主从△△中等中等高可扩展读单主限制哨兵✔△中等高高可扩展读单主限制集群✔✔高高高高多主分片云服务✔✔简化高高高5、内存淘汰策略有几种1、noeviction不会驱逐任何key2、allkeys-lru对所有key使用LRU算法进行删除3、volatile-lru对所有设置了过期时间的key使用LRU算法进行删除4、allkeys-random对所有key随机删除5、volatile-random对所有设置了过期时间的key随机删除6、volatile-ttl删除马上要过期的key7、allkeys-lfu对所有key使用LFU算法进行删除8、volatile-lfy对所有设置了过期时间的key使用LFU算法进行删除一般采用第2种LRU算法思想删除最久的那些没有被使用到的key注意强调的是时间上最久LFU删除使用次数最少得key注意强调的是使用次数最少6、 Redis为什么这么快1Redis是完全基于内存操作2采用单线程减少了上下文切换和竞争条件不存在多进程或多线程的切换而消耗CPU3采用多路复用模型非阻塞IO。7、redis除了做缓存还能做什么分布式锁、消息队列、延时队列8、场景题设计一个分布式锁系统提供两个方法lock(String key)获取锁unlock(String key)释放锁要求同一个锁由线程或客户端独占A线程获取的锁必须由 A 线程释放其他线程调用unlock无效。要求锁可重入在不配置锁超时时间的情况如果系统挂掉或崩溃时不会导致锁永久占用答案设计思路给每个锁绑定一个唯一标识UUID 或线程 ID。获取锁时把这个标识写入 Redis。释放锁时检查标识是否匹配如果不匹配不释放。用 Lua 脚本保证“检查 删除”原子性。key - { owner: UUID, count: 2 }独立线程看门狗续期