第一章:Redis 简介
了解 Redis 的发展历程、核心特性、数据结构和使用场景。
最后更新: 2024-01-15
页面目录
Redis 简介
Redis(Remote Dictionary Server)是一个开源的基于内存的数据结构存储系统,广泛用于缓存、消息队列、实时分析等场景。
什么是 Redis?
Redis 是一个用 C 语言编写的 键值对(Key-Value)存储数据库,它支持多种数据结构,可以作为数据库、缓存、消息队列和流处理引擎使用。
核心特性
| 特性 | 说明 |
|---|---|
| 内存存储 | 数据存储在内存中,读写性能极高 |
| 多种数据结构 | 支持 String、Hash、List、Set、Zset、Stream 等 |
| 持久化 | 支持 RDB 和 AOF 两种持久化方式 |
| 高可用 | 支持主从复制、哨兵和集群模式 |
| 原子操作 | 所有操作都是原子性的 |
| 客户端分片 | 支持客户端分片集群 |
| 发布/订阅 | 支持消息发布和订阅功能 |
| Lua 脚本 | 支持执行 Lua 脚本 |
Redis 的发展历史
| 年份 | 版本 | 主要特性 |
|---|---|---|
| 2009 | Redis 诞生 | 由 Salvatore Sanfilippo 开发 |
| 2010 | Redis 2.0 | 发布订阅、Lua 脚本 |
| 2013 | Redis 2.8 | 哨兵模式 |
| 2015 | Redis 3.0 | Cluster 集群模式 |
| 2017 | Redis 4.0 | 模块系统、混合持久化 |
| 2018 | Redis 5.0 | Stream 数据类型 |
| 2020 | Redis 6.0 | 多线程 I/O、ACL |
| 2022 | Redis 7.0 | 函数(Functions)、Radix Tree 优化 |
数据结构
Redis 支持多种丰富的数据结构,这是它区别于其他 KV 存储的核心优势:
┌─────────────────────────────────────────────────────────────────┐
│ Redis 数据结构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ String (字符串) ──► 计数器、缓存、Session │
│ │ │
│ Hash (哈希) ──► 对象存储、配置信息 │
│ │ │
│ List (列表) ──► 消息队列、文章列表 │
│ │ │
│ Set (集合) ──► 标签系统、去重 │
│ │ │
│ Zset (有序集合) ──► 排行榜、优先级队列 │
│ │ │
│ Stream (流) ──► 消息队列、事件流 │
│ │
└─────────────────────────────────────────────────────────────────┘
各数据结构对比
| 类型 | 特点 | 时间复杂度 | 典型应用 |
|---|---|---|---|
| String | 最基本类型 | O(1) | 缓存、计数器 |
| Hash | 字段值对 | O(1) | 对象存储 |
| List | 有序列表 | O(1)-O(N) | 消息队列 |
| Set | 无序去重 | O(1)-O(N) | 标签、好友 |
| Zset | 有序去重 | O(log N) | 排行榜 |
| Stream | 日志流 | O(1)-O(N) | 消息队列 |
Redis vs 其他数据库
| 对比项 | Redis | Memcached | MySQL | MongoDB |
|---|---|---|---|---|
| 数据存储 | 内存 | 内存 | 磁盘 | 磁盘 |
| 数据结构 | 多种 | 简单KV | 关系型 | 文档型 |
| 持久化 | ✅ | ❌ | ✅ | ✅ |
| 集群支持 | ✅ | ❌ | ✅ | ✅ |
| 主从复制 | ✅ | ❌ | ✅ | ✅ |
| 事务支持 | 有限 | ❌ | ✅ | ✅ |
| 内存效率 | 高 | 高 | 低 | 中 |
使用场景
1. 缓存系统
# 设置缓存,过期时间 1 小时
SET cache:user:1001 "{\"name\":\"张三\",\"age\":25}" EX 3600
# 获取缓存
GET cache:user:1001
2. 会话存储
# 存储用户 Session
HSET session:abc123 user_id 1001 username "zhangsan" login_at 1705312800
# 获取 Session 数据
HGETALL session:abc123
3. 实时排行榜
# 添加用户分数
ZADD leaderboard 1500 "user:1001"
ZADD leaderboard 2000 "user:1002"
ZADD leaderboard 1800 "user:1003"
# 获取 Top 3
ZREVRANGE leaderboard 0 2 WITHSCORES
4. 消息队列
# 生产消息
LPUSH queue:tasks "{\"task\":\"send_email\",\"to\":\"user@example.com\"}"
# 消费消息
BRPOP queue:tasks 0
5. 分布式锁
# 获取锁(SET NX EX 原子操作)
SET lock:order:12345 "unique_value" NX EX 30
# 释放锁(Lua 脚本保证原子性)
EVAL "if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 lock:order:12345 "unique_value"
Redis 应用架构
┌─────────────────────────────────────────────────────────────────┐
│ Redis 应用架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ Client │ ←── 应用服务器(Nginx/Tomcat) │
│ └──────┬──────┘ │
│ │ Redis CLI / Client │
│ ┌──────▼──────┐ │
│ │ Redis │ │
│ │ Server │ ┌─────────────────────────────────────┐ │
│ │ │ │ In-Memory Data Store │ │
│ │ ┌────────┐ │ │ • String / Hash / List │ │
│ │ │ Memory │ │ │ • Set / Zset / Stream │ │
│ │ └────────┘ │ └─────────────────────────────────────┘ │
│ │ ↓ │ │
│ │ ┌────────┐ │ ┌─────────────────────────────────────┐ │
│ │ │ RDB │ │ │ Persistence │ │
│ │ │ AOF │ │ │ • RDB: Point-in-time snapshot │ │
│ │ └────────┘ │ │ • AOF: Append-only file │ │
│ └─────────────┘ └─────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
为什么选择 Redis?
优势
- ✅ 极高的性能:每秒可处理百万级请求
- ✅ 丰富的数据结构:满足各种业务需求
- ✅ 丰富的客户端:支持几乎所有编程语言
- ✅ 完善的生态:Redis Stack、Redis Enterprise、Redis Cloud
- ✅ 活跃的社区:持续更新,文档完善
- ✅ 灵活的部署:单机、主从、哨兵、集群多种模式
适用场景
| 场景 | 推荐配置 |
|---|---|
| 缓存 | 单机或主从 + 哨兵 |
| 会话存储 | 主从 + 哨兵 |
| 实时排行榜 | Redis Cluster |
| 消息队列 | Stream 或 List |
| 分布式锁 | 单机或 RedLock 算法 |
常用术语表
| 术语 | 说明 |
|---|---|
| Key | 键,唯一标识一个值 |
| Value | 值,可以是各种数据类型 |
| TTL | Time To Live,键的过期时间 |
| Pipeline | 管道,批量执行命令 |
| Pub/Sub | 发布/订阅模式 |
| Lua | Lua 脚本语言 |
| Cluster | 分布式集群 |
| Sentinel | 哨兵,监控和故障转移 |
下一步
接下来让我们学习如何安装和配置 Redis。
👉 安装与配置