1. Redis 的特点及与 Memcached 的区别
特点:
基于内存的键值数据库,支持持久化(RDB/AOF)。
单线程模型,通过 IO 多路复用实现高并发。
支持多种数据结构:字符串、哈希、列表、集合、有序集合等。
提供事务、发布订阅、Lua 脚本等功能。
与 Memcached 区别:
数据持久化:Redis 支持数据落盘,Memcached 纯内存。
数据类型:Memcached 仅支持字符串,Redis 支持复杂数据结构。
内存管理:Redis 采用虚拟内存机制,Memcached 使用预分配内存池。
2. Redis 的持久化机制(RDB vs AOF)
RDB(快照):
定时生成内存快照(
dump.rdb
),恢复速度快。缺点:可能丢失最后一次快照后的数据。
触发方式:
SAVE
(阻塞)/BGSAVE
(后台异步)。
AOF(追加日志):
记录所有写操作命令(
appendonly.aof
),数据安全性高。支持三种同步策略:
always
(每次写同步)、everysec
(每秒同步,默认)、no
(由系统决定)。缺点:文件体积大,恢复速度慢。
混合持久化(Redis 4.0+):
结合 RDB 和 AOF,重启时先加载 RDB 快照,再重放 AOF 增量命令。
3. Redis 的内存淘汰策略
Redis 提供 6 种策略,通过 maxmemory-policy
配置:
volatile-lru:从已设置过期的数据中淘汰最近最少使用的。
volatile-ttl:淘汰即将过期的数据。
volatile-random:随机淘汰已过期的数据。
allkeys-lru:全局淘汰最近最少使用的数据(推荐)。
allkeys-random:全局随机淘汰。
noeviction:禁止淘汰,新写入操作报错。
4. Redis 事务与 CAS 乐观锁
事务流程:
MULTI
开启事务 → 命令入队 →EXEC
执行或DISCARD
取消。事务中的命令按顺序执行,但不保证原子性(单条命令失败不影响后续执行)。
CAS 实现:
使用
WATCH
监控键,若事务执行前键被修改,则事务回滚。示例:
WATCH key val = GET key val = val + 1 MULTI SET key val EXEC
5. Redis 单线程模型为何高效
核心原因:
纯内存操作,无磁盘 I/O 瓶颈。
基于 Reactor 模式的非阻塞 IO 多路复用(epoll/kqueue)。
单线程避免多线程上下文切换和竞争问题。
C 语言实现,底层优化充分。
6. 缓存穿透、击穿、雪崩的解决方案
穿透(查询不存在的数据):
布隆过滤器拦截非法请求。
缓存空值并设置短过期时间。
击穿(热点 key 失效后高并发访问数据库):
使用互斥锁(如 Redis 的
SETNX
),保证单线程重建缓存。
雪崩(大量 key 同时过期):
分散过期时间(如基础时间 + 随机偏移)。
永不过期策略 + 异步更新。
7. Redis 分布式锁的实现
核心命令:
SET lock_key unique_value NX EX 30 # 原子性加锁并设置超时
注意事项:
锁需设置超时时间,防止死锁。
释放锁时需验证值(避免误删其他线程的锁)。
可结合 Redlock 算法实现多节点锁。
8. Redis 集群方案
主从复制:
主节点(Master)写,从节点(Slave)读,支持数据同步。
缺点:主节点单点故障。
哨兵模式(Sentinel):
监控主从节点,自动故障转移。
Cluster 模式:
数据分片(16384 个哈希槽),支持水平扩展。
节点间通过 Gossip 协议通信,自动故障恢复。
9. Redis 的 Pipeline 与 Pub/Sub
Pipeline:
将多个命令打包发送,减少网络往返时间(RTT),提升吞吐量。
适用场景:批量操作(如批量写入数据)。
Pub/Sub:
发布订阅模式,支持消息广播。
缺点:消息不持久化,消费者离线时消息丢失。
10. Redis 性能优化建议
内存优化:
使用
ziplist
、intset
等紧凑数据结构。避免存储大 Key(如单个 Value 超过 1MB)。
持久化配置:
主节点关闭 RDB/AOF,从节点开启 AOF。
集群部署:
分片避免数据倾斜,分散热点 Key。