*Redis 简介
Redis(Remote Dictionary Server)是一个开源的高性能键值对存储系统,通常被称为数据结构服务器。它不仅支持简单的字符串,还支持哈希、列表、集合、有序集合、流、位图、HyperLogLog、地理空间等复杂数据类型。
Redis 使用 C 语言开发,遵守 BSD 协议,是互联网技术中使用最为广泛的中间件之一。随着它在新浪微博等大型互联网公司的使用而逐渐风靡国内,也是中高级后端技术开发工程师技术面试过程中最常问到的知识点。
*Redis 的核心定位
| 角色 | 说明 |
|---|---|
| 内存数据库 | 数据存储在内存中,读写速度极快(微秒级延迟) |
| 缓存 | 最常用的场景,缓解数据库压力,提升应用性能 |
| 消息代理 | Pub/Sub 发布订阅、Stream 流式消息队列 |
| 数据结构服务器 | 9 种核心数据类型,每种都有丰富的原子操作命令 |
*为什么叫 Redis?
Redis 的全称是 REmote DIctionary Server(远程字典服务器),由意大利开发者 Salvatore Sanfilippo(网名 antirez)于 2009 年创建。antirez 的博客地址是 antirez.com。
*Redis 的主要特点
*1. 极致性能
- 单机 10万+ QPS,内存操作微秒级延迟
- 采用单线程事件循环模型,避免了多线程上下文切换和锁竞争
- Redis 6.0+ 引入多线程 IO,网络读写可并行,进一步提升吞吐量
*2. 丰富的数据类型
Redis 支持 9 种核心数据类型,远超传统 key-value 存储:
| 数据类型 | 说明 | 典型场景 |
|---|---|---|
| String | 字符串、整数、浮点数 | 缓存、计数器、分布式锁、Session |
| Hash | 键值对集合 | 对象存储、购物车、用户属性 |
| List | 双向链表 | 消息队列、时间线、最新消息 |
| Set | 无序唯一集合 | 标签、共同好友、去重、抽奖 |
| Sorted Set | 有序唯一集合 | 排行榜、延时队列、范围查询 |
| Stream | 日志型消息流 | 消息队列、消费者组、事件溯源 |
| Bitmap | 位数组 | 用户签到、在线状态、布隆过滤器 |
| HyperLogLog | 基数估算 | UV 统计、大规模去重计数 |
| Geo | 地理坐标 | 附近的人、距离计算、地理位置服务 |
*3. 持久化支持
Redis 提供了三种持久化方式,确保数据安全:
| 方式 | 说明 | 特点 |
|---|---|---|
| RDB | 定时快照 | 紧凑的二进制文件,适合备份和恢复 |
| AOF | 日志追加 | 记录每条写命令,数据安全性更高 |
| 混合持久化(4.0+) | RDB + AOF | 重写时先用 RDB 存储全量数据,再追加增量 AOF,兼顾速度和安全性 |
*4. 高可用与分布式
- 主从复制:数据复制到多个从节点,实现读写分离和备份
- Sentinel 哨兵:自动监控、故障检测和主从切换
- Cluster 集群:16384 个哈希槽分片,支持横向扩展和自动故障转移
*5. 原子操作与脚本
- 所有命令都是原子执行的
- 支持 Lua 脚本(原子执行复杂逻辑)
- Redis Functions(7.0+):持久化的服务器端脚本,类似于存储过程
*6. 发布/订阅与消息队列
- Pub/Sub:实时消息推送,支持模式匹配订阅
- Stream:可靠的消息流,支持消费者组和消息确认(类似 Kafka)
- Sharded Pub/Sub(7.0+):集群模式下频道绑定到哈希槽,减少节点间消息传递
*Redis 版本演进
| 版本 | 发布时间 | 重大特性 |
|---|---|---|
| 1.0 | 2009 | 初始发布,支持 String、List、Set |
| 2.0 | 2010 | 引入 Sorted Set、Pub/Sub、Lua 脚本 |
| 2.6 | 2012 | Lua 脚本执行、内置集群支持雏形 |
| 2.8 | 2013 | Sentinel 哨兵、Scan 命令、HyperLogLog |
| 3.0 | 2015 | Redis Cluster 正式发布 |
| 3.2 | 2016 | Geo 地理空间、Lua 脚本调试器 |
| 4.0 | 2017 | 混合持久化、模块系统、异步删除 |
| 5.0 | 2018 | Stream 数据类型、新的集群总线协议 |
| 6.0 | 2020 | 多线程 IO、ACL 权限控制、SSL/TLS |
| 6.2 | 2021 | RESP3 协议、新增数十个命令 |
| 7.0 | 2022 | Redis Functions、改进 ACL、Sharded Pub/Sub、多部分 AOF |
| 7.2 | 2023 | 性能优化、新命令、改进集群稳定性 |
| 7.4 | 2024 | 哈希表内存优化、新模块 API |
*Redis 与其他存储的对比
*vs Memcached
| 特性 | Redis | Memcached |
|---|---|---|
| 数据类型 | 9 种复杂类型 | 仅字符串 |
| 持久化 | RDB + AOF | 不支持 |
| 集群 | 原生 Cluster | 客户端分片 |
| 内存管理 | LRU/LFU 淘汰策略 | LRU |
| 事务 | 支持 | 不支持 |
| 发布订阅 | 支持 | 不支持 |
| 性能 | 相当 | 相当 |
结论:除非极端简单的纯缓存场景,否则优先选择 Redis。
*vs MongoDB
| 特性 | Redis | MongoDB |
|---|---|---|
| 存储介质 | 内存为主 | 磁盘为主 |
| 数据结构 | 键值 + 数据结构 | 文档(BSON) |
| 查询能力 | 按 Key 和范围查询 | 复杂查询、聚合、索引 |
| 适用场景 | 缓存、实时计算、消息队列 | 文档存储、复杂查询、大数据 |
结论:两者互补。Redis 做缓存和实时层,MongoDB 做持久化文档存储。
*vs Kafka
| 特性 | Redis Stream | Kafka |
|---|---|---|
| 定位 | 内存消息流 | 分布式日志系统 |
| 持久化 | AOF/RDB | 磁盘日志 |
| 吞吐量 | 高(单机) | 极高(分布式) |
| 消息保留 | 受内存限制 | 可长期保留 |
| 消费者组 | 支持 | 支持 |
| 适用场景 | 实时消息、小队列 | 大数据流处理、事件溯源 |
结论:小规模实时消息用 Redis Stream,大规模日志处理用 Kafka。
*Redis 架构
Redis 主要由两个程序组成:
- Redis 客户端
redis-cli— 命令行工具,用于连接服务器并执行命令 - Redis 服务器
redis-server— 服务端程序,提供 Redis 服务
客户端和服务器可以位于同一台计算机,也可以分布在两台不同的计算机中,通过网络通信。
*典型部署架构
┌─────────────────────────────────────────┐
│ 应用层 (Application) │
│ ┌─────────┐ ┌─────────┐ │
│ │ App 1 │ │ App 2 │ │
│ └────┬────┘ └────┬────┘ │
└──────────────┼────────────┼─────────────┘
│ │
┌─────┴────────────┴─────┐
│ Redis Cluster │
│ ┌─────┐ ┌─────┐ │
│ │ M1 │ │ M2 │ │ ← 主节点
│ └──┬──┘ └──┬──┘ │
│ │ │ │
│ ┌──┴──┐ ┌──┴──┐ │
│ │ S1 │ │ S2 │ │ ← 从节点
│ └─────┘ └─────┘ │
└────────────────────────┘
*核心应用场景
| 场景 | 数据类型 | 说明 |
|---|---|---|
| 缓存 | String | 热点数据缓存,减轻数据库压力 |
| 会话存储 | Hash / String | 分布式 Session,支持过期自动清理 |
| 排行榜 | Sorted Set | 实时排名,支持范围查询和排序 |
| 计数器 | String | 原子 incr/decr,如点赞数、阅读数 |
| 分布式锁 | String | SET key value NX EX seconds |
| 消息队列 | List / Stream | 异步任务处理、事件驱动架构 |
| 实时系统 | Pub/Sub | 实时推送、在线聊天、股票行情 |
| 地理位置 | Geo | 附近的人、距离计算、地理位置服务 |
| 布隆过滤器 | Bitmap | 海量数据去重判断 |
| 限流器 | Sorted Set | 滑动窗口限流 |
*快速上手
*安装 Redis
# Ubuntu/Debian
sudo apt-get install redis-server
# macOS
brew install redis
# Docker
docker run -d --name redis -p 6379:6379 redis:latest
*启动服务
redis-server
*连接客户端
redis-cli
127.0.0.1:6379> PING
PONG
*基本操作
# String
127.0.0.1:6379> SET name "Redis"
OK
127.0.0.1:6379> GET name
"Redis"
# Hash
127.0.0.1:6379> HSET user:1 name "Alice" age 25
(integer) 2
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "25"
# List
127.0.0.1:6379> LPUSH queue "task1"
(integer) 1
127.0.0.1:6379> RPOP queue
"task1"
*谁在使用 Redis?
Redis 被全球数以万计的公司使用,包括:
- Twitter — 时间线缓存、实时分析
- GitHub — 作业队列、会话存储
- Stack Overflow — 缓存、计数器
- 新浪微博 — 国内早期大规模采用 Redis 的公司
- 阿里巴巴 — 电商缓存、秒杀系统
- 美团 — 地理位置服务、实时推送
*相关资源
- Redis 中文教程 — 完整学习路径
- 为什么要选择 Redis — 十大核心使用场景
- Redis 命令手册 — 265+ 命令中文参考
- Redis 数据类型 — 五种基础数据类型详解
- 在 Windows 上安装 Redis — Windows 平台安装指南
- Redis 7.0 新特性 — Redis 7.x 新功能介绍