一、Redis基础概念
-
Redis的核心特点及与Memcached的区别
-
特点:基于内存、单线程模型、支持丰富数据结构(5种基础+4种扩展)、持久化、高可用集群、高性能(10万+ QPS)17。
-
与Memcached区别:Redis支持更复杂的数据结构(如Hash、ZSet)、提供持久化、支持主从复制和集群,而Memcached仅支持简单字符串类型29。
-
-
Redis的单线程模型为何高效?
-
原因:基于内存操作避免磁盘I/O瓶颈;单线程避免多线程上下文切换和锁竞争;采用I/O多路复用(epoll)处理网络请求79。
-
二、数据结构与底层实现
-
5种基础数据类型及使用场景
-
String:缓存对象、计数器(如点赞数)、分布式锁(SETNX)67。
-
Hash:存储结构化对象(如用户信息),底层使用压缩列表(元素少时)或哈希表67。
-
List:消息队列(LPUSH/RPOP)、文章列表,底层为双向链表或QuickList(3.2+版本)67。
-
Set:去重集合(如共同好友)、抽奖,底层为哈希表或整数集合[intset]67。
-
ZSet:排行榜(ZRANGE)、延迟队列,底层为跳表(SkipList)+哈希表67。
-
-
SDS(简单动态字符串)的优势
-
O(1)获取长度、避免缓冲区溢出、支持二进制数据存储、预分配内存减少频繁分配67。
-
-
压缩列表(ziplist)与跳表的转换条件
-
List:元素数量≤512且每个元素长度≤64字节时使用ziplist,否则转为双向链表67。
-
ZSet:元素数量≤128且长度≤64字节时使用ziplist,否则转为跳表67。
-
三、持久化与高可用
-
RDB与AOF的对比
-
RDB:全量快照,通过
bgsave
生成二进制文件,恢复快但可能丢失最后一次快照后的数据37。 -
AOF:记录写命令,支持三种刷盘策略(always/everysec/no),数据安全性高但文件体积大37。
-
混合持久化(Redis 4.0+):结合RDB快照和增量AOF,重启时先加载RDB再重放AOF17。
-
-
主从复制与哨兵模式
-
全量复制:从节点首次连接主节点时,主节点生成RDB文件并传输,后续通过缓冲区同步增量命令27。
-
哨兵功能:监控、自动故障转移(选举新主节点)、通知客户端79。
-
脑裂问题:网络分区导致多个主节点,可通过
min-slaves-to-write
配置避免数据丢失7。
-
-
Redis Cluster分片原理
-
使用16384个哈希槽(slot)分片,每个节点负责部分槽位;节点间通过Gossip协议通信,支持动态扩缩容26。
-
四、缓存问题与解决方案
-
缓存穿透、击穿、雪崩的应对策略
-
穿透(查询不存在数据):布隆过滤器拦截非法请求、缓存空值(设置短过期时间)3410。
-
击穿(热点Key失效):互斥锁(Redis的SETNX)、逻辑过期(不设置TTL,异步更新)34。
-
雪崩(大量Key同时失效):随机化过期时间、多级缓存(本地缓存+Redis)、服务降级3410。
-
-
缓存与数据库双写一致性方案
-
强一致:Redisson读写锁(读共享锁、写排他锁)37。
-
最终一致:先更新数据库再删除缓存(延迟双删)、基于MySQL Binlog的异步同步(如Canal)347。
-
五、分布式与高级特性
-
Redis分布式锁的实现与问题
-
SETNX+EXPIRE:需保证原子性(Redis 2.8+的
SET key value EX seconds NX
)18。 -
RedLock算法:需至少5个独立节点,半数以上加锁成功;需解决时钟漂移和锁续期问题89。
-
误释放锁:使用唯一标识(如UUID)验证锁归属8。
-
-
Redis事务与Lua脚本
-
事务:通过
MULTI/EXEC
打包命令,不支持回滚(仅语法错误中断)27。 -
Lua脚本:原子执行、减少网络开销,适用于复杂逻辑(如秒杀库存扣减)79。
-
六、性能优化与运维
-
内存管理与淘汰策略
-
8种淘汰策略:包括volatile-lru(最近最少使用)、allkeys-lfu(最不经常使用)、noeviction(禁止写入)27。
-
大Key处理:拆分(如Hash分片)、异步删除(UNLINK)、压缩值(序列化优化)47。
-
-
Pipeline与批量命令的区别
-
Pipeline:非原子性,一次性发送多个命令减少网络往返,适用于任意命令组合910。
-
MSET/MGET:原子性批量操作,仅限键值对的读写910。
-
七、场景设计题
-
如何实现延迟队列?
-
方案:使用ZSet,以时间戳为Score,消费者轮询获取到期任务(ZRANGEBYSCORE)18。
-
优化:结合Pub/Sub通知减少轮询开销1。
-
-
社交网络关注系统设计
-
数据结构:使用Set存储用户关注列表(SADD/SMEMBERS),ZSet存储粉丝列表(按关注时间排序)67。
-
八、故障排查与源码原理
-
Redis慢查询排查
-
步骤:通过
slowlog get
获取慢日志,分析命令复杂度;优化大Key、避免KEYS操作79。
-
-
渐进式Rehash过程
-
原理:哈希表扩容时,分多次将旧表数据迁移到新表,避免单次迁移阻塞服务79。
-
九、版本特性与生态工具
-
Redis 6.0多线程模型
-
改进:网络I/O处理多线程化(Worker线程),命令执行仍为单线程,提升高并发场景性能79。
-
-
Redis 7.0核心更新
-
Function特性:支持自定义函数(替代Lua脚本),提升代码复用性7。
-