Redis

Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息中间件。掌握 Redis 是后端工程师的必备技能。

学习路径

1. 数据结构与编码(⭐⭐⭐⭐⭐)
   ├─ String、List、Hash、Set、ZSet 底层实现
   ├─ SDS、ZipList、QuickList、SkipList 等数据结构
   └─ 对象编码与优化策略

2. 持久化机制(⭐⭐⭐⭐⭐)
   ├─ RDB 快照持久化
   ├─ AOF 日志持久化
   ├─ 混合持久化(Redis 4.0+)
   └─ 持久化配置与性能优化

3. 高可用方案(⭐⭐⭐⭐⭐)
   ├─ 主从复制(Replication)
   ├─ 哨兵模式(Sentinel)
   ├─ 集群模式(Cluster)
   └─ 故障转移与数据同步

4. 应用场景(⭐⭐⭐⭐⭐)
   ├─ 缓存设计(缓存穿透、击穿、雪崩)
   ├─ 分布式锁(Redlock)
   ├─ 排行榜、计数器
   ├─ 消息队列
   └─ 布隆过滤器、HyperLogLog

核心要点

为什么 Redis 快?

  1. 纯内存操作:数据存储在内存中,读写速度极快

  2. 单线程模型:避免了线程切换和锁竞争(Redis 6.0 引入 I/O 多线程)

  3. 高效的数据结构:SDS、跳表、压缩列表等优化的数据结构

  4. I/O 多路复用:使用 epoll/kqueue 处理并发连接

  5. 简单的协议:RESP 协议简单高效

Redis vs Memcached

特性
Redis
Memcached

数据类型

5种基本类型 + 高级类型

只支持字符串

持久化

支持(RDB + AOF)

不支持

分布式

原生支持 Cluster

需要客户端实现

事务

支持(MULTI/EXEC)

不支持

Lua 脚本

支持

不支持

高可用

主从、哨兵、集群

线程模型

单线程(6.0+ I/O 多线程)

多线程

内存淘汰

8种策略

LRU

主要内容

数据结构与编码

深入理解 Redis 底层数据结构是掌握其性能优化的关键:

  • String: SDS(Simple Dynamic String)

  • List: QuickList(ZipList + LinkedList)

  • Hash: ZipList / HashTable

  • Set: IntSet / HashTable

  • ZSet: ZipList / SkipList + HashTable

持久化机制

Redis 提供两种持久化方式,确保数据不丢失:

  • RDB:快照持久化,适合备份和灾难恢复

  • AOF:日志持久化,更高的数据安全性

  • 混合持久化:结合 RDB 和 AOF 的优点

高可用方案

生产环境必须考虑的高可用架构:

  • 主从复制:读写分离,数据备份

  • 哨兵模式:自动故障转移

  • 集群模式:水平扩展,支持分片

应用场景

Redis 在实际项目中的典型应用:

  • 缓存:热点数据缓存,缓存问题解决方案

  • 分布式锁:保证分布式环境下的互斥性

  • 计数器:访问量统计、限流

  • 排行榜:利用 ZSet 实现

  • 消息队列:发布订阅、Stream

性能优化建议

  1. 合理选择数据类型:根据场景选择最合适的数据结构

  2. 避免大 key:单个 key 不要存储过大的数据

  3. 设置合理的过期时间:避免内存溢出

  4. 使用 Pipeline:批量操作减少网络往返

  5. 监控慢查询:通过 SLOWLOG 分析慢查询

  6. 合理配置持久化:根据业务需求平衡性能和安全

面试高频考点

  1. Redis 为什么这么快?

  2. Redis 的数据类型有哪些?底层实现是什么?

  3. RDB 和 AOF 的区别?如何选择?

  4. Redis 如何实现高可用?主从复制的原理?

  5. 缓存穿透、击穿、雪崩的区别和解决方案?

  6. 如何实现分布式锁?Redlock 算法?

  7. Redis 的过期策略和内存淘汰策略?

  8. Redis 的事务机制?与关系型数据库事务的区别?

学习建议

  1. 先理解基础:从数据类型和基本命令开始

  2. 深入底层:理解各数据类型的底层实现

  3. 掌握持久化:了解 RDB 和 AOF 的原理和配置

  4. 实践高可用:搭建主从、哨兵、集群环境

  5. 解决实际问题:学习缓存设计、分布式锁等应用场景

  6. 性能调优:通过实际项目积累优化经验

主题进度

Last updated