Redis简介 #
一、什么是Redis #
1.1 Redis定义 #
Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,可以用作:
- 数据库
- 缓存
- 消息队列
- 会话存储
text
┌─────────────────────────────────────────┐
│ Redis 架构 │
├─────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 客户端1 │ │ 客户端2 │ │ 客户端N │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └────────────┼────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Redis Server │ │
│ │ (内存存储) │ │
│ └─────────────────────┘ │
│ │ │
│ ┌────────────┴────────────┐ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ RDB文件 │ │ AOF文件 │ │
│ │ (快照) │ │ (日志) │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
1.2 发展历史 #
| 时间 | 事件 |
|---|---|
| 2009年 | Salvatore Sanfilippo(antirez)开发Redis |
| 2010年 | VMware赞助Redis开发 |
| 2013年 | Redis 2.6发布,引入Lua脚本 |
| 2015年 | Redis 3.0发布,支持集群 |
| 2017年 | Redis 4.0发布,引入模块系统 |
| 2020年 | Redis 6.0发布,多线程IO |
| 2022年 | Redis 7.0发布,大幅性能提升 |
1.3 为什么选择Redis #
text
传统数据库 vs Redis
传统数据库:
┌─────────────────────────────────────┐
│ 应用 → 网络 → 数据库 → 磁盘读取 │
│ 延迟:10-100ms │
└─────────────────────────────────────┘
Redis:
┌─────────────────────────────────────┐
│ 应用 → 网络 → Redis → 内存读取 │
│ 延迟:0.1-1ms │
└─────────────────────────────────────┘
二、Redis核心特点 #
2.1 性能极高 #
text
Redis性能指标:
读操作:110,000次/秒
写操作:81,000次/秒
原因:
1. 纯内存操作
2. 单线程避免上下文切换
3. IO多路复用
4. 高效的数据结构
2.2 丰富的数据类型 #
| 数据类型 | 说明 | 典型场景 |
|---|---|---|
| String | 字符串 | 缓存、计数器、分布式锁 |
| List | 列表 | 消息队列、最新列表 |
| Set | 集合 | 标签、社交关系 |
| Hash | 哈希表 | 对象存储、购物车 |
| ZSet | 有序集合 | 排行榜、延时队列 |
| Stream | 流 | 消息队列 |
| Geo | 地理位置 | 附近的人、打车 |
| HyperLogLog | 基数统计 | UV统计 |
| Bitmap | 位图 | 签到、在线状态 |
2.3 原子操作 #
text
所有Redis命令都是原子性的:
示例:INCR命令
┌─────────────────────────────────────┐
│ 客户端A: INCR counter │
│ 客户端B: INCR counter │
│ │
│ 结果:counter = 2(不会出现竞争) │
└─────────────────────────────────────┘
2.4 持久化支持 #
text
Redis提供两种持久化方式:
1. RDB(快照)
┌─────────────────────────────────┐
│ 定时将内存数据保存到磁盘 │
│ 文件小,恢复快 │
│ 可能丢失部分数据 │
└─────────────────────────────────┘
2. AOF(日志)
┌─────────────────────────────────┐
│ 记录每个写操作 │
│ 数据更安全 │
│ 文件较大 │
└─────────────────────────────────┘
2.5 支持过期时间 #
bash
# 设置键的过期时间
SET session:123 "user_data" EX 3600
# 10秒后自动删除
EXPIRE key 10
# 查看剩余时间
TTL key
三、应用场景 #
3.1 缓存 #
text
缓存架构:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 客户端 │────▶│ Redis │────▶│ 数据库 │
└──────────┘ └──────────┘ └──────────┘
│
▼
缓存命中直接返回
缓存未命中查数据库
并写入缓存
bash
# 缓存示例
SET user:1001 '{"name":"John","age":25}' EX 3600
GET user:1001
3.2 会话存储 #
text
分布式会话:
┌──────────┐ ┌──────────┐
│ 服务器A │ │ 服务器B │
└────┬─────┘ └────┬─────┘
│ │
└────────┬───────┘
▼
┌──────────┐
│ Redis │
│ 会话存储 │
└──────────┘
3.3 排行榜 #
bash
# 使用ZSet实现排行榜
ZADD leaderboard 100 user:1
ZADD leaderboard 200 user:2
ZADD leaderboard 150 user:3
# 获取前10名
ZREVRANGE leaderboard 0 9 WITHSCORES
3.4 计数器 #
bash
# 文章阅读量
INCR article:1001:views
# 点赞数
INCR article:1001:likes
# 分布式ID生成
INCR global:next_id
3.5 消息队列 #
bash
# 使用List实现简单队列
LPUSH queue:email "email_data"
RPOP queue:email
# 使用Stream实现消息队列
XADD mystream * field1 value1
XREAD COUNT 2 STREAMS mystream 0
3.6 分布式锁 #
bash
# 简单分布式锁
SET lock:resource "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:resource "unique_value"
四、Redis与其他数据库对比 #
4.1 Redis vs Memcached #
| 特性 | Redis | Memcached |
|---|---|---|
| 数据类型 | 丰富 | 仅字符串 |
| 持久化 | 支持 | 不支持 |
| 集群 | 原生支持 | 需要客户端分片 |
| 线程模型 | 单线程 | 多线程 |
| 内存管理 | 更高效 | 简单 |
| 事务 | 支持 | 不支持 |
4.2 Redis vs MySQL #
| 特性 | Redis | MySQL |
|---|---|---|
| 存储位置 | 内存 | 磁盘 |
| 速度 | 极快 | 较慢 |
| 数据类型 | NoSQL | 关系型 |
| 事务 | 简单事务 | 完整ACID |
| 查询 | 键值查询 | SQL查询 |
| 持久化 | 可选 | 必须 |
五、Redis适用场景总结 #
5.1 适合使用Redis的场景 #
text
✓ 高性能缓存
✓ 会话存储
✓ 排行榜/计数器
✓ 消息队列
✓ 实时系统
✓ 社交网络
✓ 地理位置应用
5.2 不适合使用Redis的场景 #
text
✗ 数据量超过内存容量
✗ 需要复杂SQL查询
✗ 需要完整ACID事务
✗ 数据安全性要求极高
六、总结 #
Redis核心特点:
| 特点 | 说明 |
|---|---|
| 高性能 | 内存存储,QPS可达10万+ |
| 丰富类型 | 5种基础类型+多种高级类型 |
| 原子性 | 所有操作原子执行 |
| 持久化 | RDB/AOF两种方式 |
| 高可用 | 主从复制、哨兵、集群 |
下一步,让我们学习Redis的安装与配置!
最后更新:2026-03-27