Redis核心知识点的面试题集

一、Redis基础概念

  1. Redis的核心特点及与Memcached的区别

    • 特点:基于内存、单线程模型、支持丰富数据结构(5种基础+4种扩展)、持久化、高可用集群、高性能(10万+ QPS)17。

    • 与Memcached区别:Redis支持更复杂的数据结构(如Hash、ZSet)、提供持久化、支持主从复制和集群,而Memcached仅支持简单字符串类型29。

  2. Redis的单线程模型为何高效?

    • 原因:基于内存操作避免磁盘I/O瓶颈;单线程避免多线程上下文切换和锁竞争;采用I/O多路复用(epoll)处理网络请求79。


二、数据结构与底层实现

  1. 5种基础数据类型及使用场景

    • String:缓存对象、计数器(如点赞数)、分布式锁(SETNX)67。

    • Hash:存储结构化对象(如用户信息),底层使用压缩列表(元素少时)或哈希表67。

    • List:消息队列(LPUSH/RPOP)、文章列表,底层为双向链表或QuickList(3.2+版本)67。

    • Set:去重集合(如共同好友)、抽奖,底层为哈希表或整数集合[intset]67。

    • ZSet:排行榜(ZRANGE)、延迟队列,底层为跳表(SkipList)+哈希表67。

  2. SDS(简单动态字符串)的优势

    • O(1)获取长度、避免缓冲区溢出、支持二进制数据存储、预分配内存减少频繁分配67。

  3. 压缩列表(ziplist)与跳表的转换条件

    • List:元素数量≤512且每个元素长度≤64字节时使用ziplist,否则转为双向链表67。

    • ZSet:元素数量≤128且长度≤64字节时使用ziplist,否则转为跳表67。


三、持久化与高可用

  1. RDB与AOF的对比

    • RDB:全量快照,通过bgsave生成二进制文件,恢复快但可能丢失最后一次快照后的数据37。

    • AOF:记录写命令,支持三种刷盘策略(always/everysec/no),数据安全性高但文件体积大37。

    • 混合持久化(Redis 4.0+):结合RDB快照和增量AOF,重启时先加载RDB再重放AOF17。

  2. 主从复制与哨兵模式

    • 全量复制:从节点首次连接主节点时,主节点生成RDB文件并传输,后续通过缓冲区同步增量命令27。

    • 哨兵功能:监控、自动故障转移(选举新主节点)、通知客户端79。

    • 脑裂问题:网络分区导致多个主节点,可通过min-slaves-to-write配置避免数据丢失7。

  3. Redis Cluster分片原理

    • 使用16384个哈希槽(slot)分片,每个节点负责部分槽位;节点间通过Gossip协议通信,支持动态扩缩容26。


四、缓存问题与解决方案

  1. 缓存穿透、击穿、雪崩的应对策略

    • 穿透(查询不存在数据):布隆过滤器拦截非法请求、缓存空值(设置短过期时间)3410。

    • 击穿(热点Key失效):互斥锁(Redis的SETNX)、逻辑过期(不设置TTL,异步更新)34。

    • 雪崩(大量Key同时失效):随机化过期时间、多级缓存(本地缓存+Redis)、服务降级3410。

  2. 缓存与数据库双写一致性方案

    • 强一致:Redisson读写锁(读共享锁、写排他锁)37。

    • 最终一致:先更新数据库再删除缓存(延迟双删)、基于MySQL Binlog的异步同步(如Canal)347。


五、分布式与高级特性

  1. Redis分布式锁的实现与问题

    • SETNX+EXPIRE:需保证原子性(Redis 2.8+的SET key value EX seconds NX)18。

    • RedLock算法:需至少5个独立节点,半数以上加锁成功;需解决时钟漂移和锁续期问题89。

    • 误释放锁:使用唯一标识(如UUID)验证锁归属8。

  2. Redis事务与Lua脚本

    • 事务:通过MULTI/EXEC打包命令,不支持回滚(仅语法错误中断)27。

    • Lua脚本:原子执行、减少网络开销,适用于复杂逻辑(如秒杀库存扣减)79。


六、性能优化与运维

  1. 内存管理与淘汰策略

    • 8种淘汰策略:包括volatile-lru(最近最少使用)、allkeys-lfu(最不经常使用)、noeviction(禁止写入)27。

    • 大Key处理:拆分(如Hash分片)、异步删除(UNLINK)、压缩值(序列化优化)47。

  2. Pipeline与批量命令的区别

    • Pipeline:非原子性,一次性发送多个命令减少网络往返,适用于任意命令组合910。

    • MSET/MGET:原子性批量操作,仅限键值对的读写910。


七、场景设计题

  1. 如何实现延迟队列?

    • 方案:使用ZSet,以时间戳为Score,消费者轮询获取到期任务(ZRANGEBYSCORE)18。

    • 优化:结合Pub/Sub通知减少轮询开销1。

  2. 社交网络关注系统设计

    • 数据结构:使用Set存储用户关注列表(SADD/SMEMBERS),ZSet存储粉丝列表(按关注时间排序)67。


八、故障排查与源码原理

  1. Redis慢查询排查

    • 步骤:通过slowlog get获取慢日志,分析命令复杂度;优化大Key、避免KEYS操作79。

  2. 渐进式Rehash过程

    • 原理:哈希表扩容时,分多次将旧表数据迁移到新表,避免单次迁移阻塞服务79。


九、版本特性与生态工具

  1. Redis 6.0多线程模型

    • 改进:网络I/O处理多线程化(Worker线程),命令执行仍为单线程,提升高并发场景性能79。

  2. Redis 7.0核心更新

    • Function特性:支持自定义函数(替代Lua脚本),提升代码复用性7。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值