Redis 深度实战:缓存、队列、会话管理

深入 Redis 核心原理与应用场景,掌握缓存策略、持久化机制、集群部署、Lua 脚本等高级特性,构建高性能系统架构。

作者
资源变现技术团队后端工程师

🚀 Redis 核心价值

Redis(Remote Dictionary Server)是开源的内存数据结构存储,用作数据库、缓存和消息代理。根据 Stack Overflow 2023 调查,Redis 是最受欢迎的数据库(评分 63.18%)。

⚡

极致性能

读 110,000 次/秒,写 81,000 次/秒

📦

丰富数据结构

String、Hash、List、Set、ZSet、Bitmap、HyperLogLog

🔄

原子操作

单线程模型,所有操作都是原子的

🌐

高可用

主从复制、哨兵模式、Cluster 集群

📊

Redis 性能数据

GET 操作(单线程)110,000 QPS
SET 操作(单线程)81,000 QPS
管道(Pipeline)批量操作500,000+ QPS
集群模式(分片)10M+ QPS
平均延迟< 1ms

💡 独特观点

Redis 的真正价值不是"缓存",而是内存计算平台。它提供了丰富的数据结构和原子操作,让你可以在 Redis 中直接完成复杂计算,减少网络往返。

📦 数据结构详解

Redis 的核心优势在于其丰富的数据结构。选择正确的数据结构能让性能提升 10-100倍。

1. String(字符串)

📝

String

最基础类型

底层实现:简单动态字符串(SDS)

最大值:512MB

常用命令:SET、GET、INCR、DECR、APPEND

📝 实战示例

## 缓存用户信息(JSON 序列化)
SET user:1001 '{"id":1001,"name":"Alice","age":25}'
GET user:1001

## 计数器(原子递增)
SET page:view:1001 0
INCR page:view:1001  # 1
INCRBY page:view:1001 5  # 6

## 分布式锁(SET NX EX)
SET lock:order:1001 "unique_value" NX EX 30

## 位图(Bitmap)统计活跃用户
SETBIT active:2024-01-01 1001 1  # 用户 1001 活跃
GETBIT active:2024-01-01 1001  # 1
BITCOUNT active:2024-01-01  # 统计当日活跃用户数
适用场景
  • 缓存对象(序列化 JSON)
  • 计数器(文章浏览量、点赞数)
  • 分布式锁
  • 位图统计(活跃用户、签到)

2. Hash(哈希)

🗂️

Hash

对象存储最佳选择

底层实现:ziplist(小哈希)或 hashtable(大哈希)

字段数量:最多 2^32 - 1 个字段

常用命令:HSET、HGET、HMSET、HGETALL、HINCRBY

📝 实战示例

## 存储用户对象(推荐!比 String + JSON 更灵活)
HSET user:1001 name "Alice" age 25 email "[email protected]"
HGET user:1001 name  # "Alice"
HGETALL user:1001  # 获取所有字段
HINCRBY user:1001 age 1  # 原子递增年龄

## 购物车(用户 ID → 商品 ID: 数量)
HSET cart:1001 product:2001 2  # 商品 2001 买 2 件
HINCRBY cart:1001 product:2001 1  # 增加 1 件
HGETALL cart:1001  # 查看购物车所有商品

## 对象部分更新(无需读取整个对象)
HSET article:3001 title "新标题" views 1000
HINCRBY article:3001 views 1  # 浏览量 +1
适用场景
  • 存储对象(用户、商品、文章)
  • 购物车
  • 对象部分字段更新
  • 避免序列化和反序列化开销

3. List(列表)

📋

List

有序可重复

底层实现:quicklist(双向链表 + ziplist)

最大长度:2^32 - 1 个元素

常用命令:LPUSH、RPUSH、LPOP、RPOP、LRANGE、BLPOP

📝 实战示例

## 消息队列(LPUSH + RPOP)
LPUSH queue:tasks "task1"  # 生产者:左侧入队
RPOP queue:tasks  # 消费者:右侧出队(非阻塞)

## 阻塞队列(BLPOP/BRPOP)
BLPOP queue:tasks 30  # 阻塞 30 秒等待任务

## 时间线(最新消息在前)
LPUSH timeline:1001 "post:5001"  # 推送新帖子
LTRIM timeline:1001 0 99  # 只保留最新 100 条
LRANGE timeline:1001 0 9  # 获取最新 10 条

## 栈(LPUSH + LPOP)和队列(LPUSH + RPOP)
LPUSH stack:undo "action1"  # 入栈
LPOP stack:undo  # 出栈(撤销操作)
适用场景
  • 消息队列(简单场景)
  • 时间线(朋友圈、微博)
  • 栈和队列
  • 分页查询(LRANGE)

4. Set(集合)

📊

Set

无序唯一

底层实现:intset(整数集合)或 hashtable

最大成员数:2^32 - 1 个

常用命令:SADD、SREM、SMEMBERS、SISMEMBER、SINTER、SUNION、SDIFF

📝 实战示例

## 标签系统(文章标签)
SADD article:3001:tags "Redis" "数据库" "缓存"
SADD article:3002:tags "Redis" "集群"
SINTER article:3001:tags article:3002:tags  # 共同标签:{"Redis"}

## 点赞/收藏(用户集合)
SADD post:5001:likes 1001 1002 1003  # 用户 1001/1002/1003 点赞
SISMEMBER post:5001:likes 1001  # 检查用户是否点赞(返回 1)
SCARD post:5001:likes  # 点赞总数

## 共同好友(交集)
SADD user:1001:friends 1002 1003 1004
SADD user:1002:friends 1001 1003 1005
SINTER user:1001:friends user:1002:friends  # 共同好友:{1003}

## 抽奖(随机获取)
SRANDMEMBER lottery:2024 1  # 随机抽取 1 个中奖者(不删除)
SPOP lottery:2024 1  # 随机抽取并删除(真正抽奖)
适用场景
  • 标签系统
  • 点赞/收藏/投票
  • 共同好友/兴趣
  • 抽奖系统

5. ZSet(有序集合)

🏆

ZSet(Sorted Set)

有序唯一(按 score 排序)

底层实现:ziplist(小集合)或 skiplist + hashtable(大集合)

最大成员数:2^32 - 1 个

常用命令:ZADD、ZREM、ZRANGE、ZREVRANGE、ZRANK、ZSCORE

📝 实战示例

## 排行榜(按分数排序)
ZADD leaderboard 3850 "player1"  # 添加/更新分数
ZADD leaderboard 4200 "player2"
ZREVRANGE leaderboard 0 9 WITHSCORES  # 前 10 名(降序)
ZRANK leaderboard "player1"  # 获取排名(从 0 开始)
ZINCRBY leaderboard 100 "player1"  # 增加分数

## 延迟队列(按执行时间排序)
ZADD delay_queue 1705363200 "task:1001"  # score = 执行时间戳
## 消费者:获取到期任务
ZRANGEBYSCORE delay_queue 0 1705363200 LIMIT 0 10

## 范围查询(成绩区间)
ZADD scores 85 "Alice" 92 "Bob" 78 "Charlie"
ZRANGEBYSCORE scores 80 90  # 获取 80-90 分的学生

## 热门排行榜(时间衰减)
## score = 点赞数 * 衰减因子 + 时间因子
ZADD hot_posts (likes * 0.8 + time_factor) "post:5001"
适用场景
  • 排行榜(游戏、电商销量)
  • 延迟队列
  • 范围查询(成绩、价格)
  • 热门排行榜(时间衰减)

6. Bitmap 和 HyperLogLog

📊 Bitmap(位图)

原理:使用 String 类型存储位(bit)

优势:极度节省空间(1 亿用户只需 12MB)

📝 实战:日活统计

## 记录用户 1001 在 2024-01-01 活跃
SETBIT active:2024-01-01 1001 1

## 统计当日活跃用户数
BITCOUNT active:2024-01-01

## 统计连续 7 天活跃的用户
BITOP AND 7day_active active:2024-01-01 active:2024-01-02 ... active:2024-01-07
BITCOUNT 7day_active

📈 HyperLogLog

原理:概率算法,估算基数(不重复元素数)

优势:固定 12KB 空间,误差率 0.81%

📝 实战:UV 统计

## 记录页面访问(自动去重)
PFADD page:uv:1001 192.168.1.1 10.0.0.1 192.168.1.1  # 只计入 2 个 IP
PFCOUNT page:uv:1001  # 估算 UV:2

## 合并多天 UV
PFMERGE week_uv page:uv:day1 page:uv:day2 ... page:uv:day7
PFCOUNT week_uv  # 估算本周 UV

📝 总结与展望

Redis 是现代系统架构的核心组件。通过本文的学习,你应该掌握了:

🎯 核心要点

  • 数据结构:String、Hash、List、Set、ZSet、Bitmap、HyperLogLog
  • 缓存策略:Cache-Aside、Read/Write Through、Write Back、防雪崩/击穿/穿透
  • 持久化:RDB(快照)、AOF(日志)、混合持久化
  • Lua 脚本:原子执行、减少网络往返、实现复杂逻辑
  • 高可用:主从复制、哨兵模式、Cluster 集群
  • 消息队列:List、Pub/Sub、Stream(推荐)
  • 会话管理:存储 Session、Token 续期、分布式 Session
  • 性能优化:Pipeline、批量化、内存优化、淘汰策略

🚀 未来展望

Redis 生态正在快速演进,值得关注的方向:

  • Redis 7.0+:Function(替代 Lua)、ACL(细粒度权限)、Sharded Pub/Sub
  • Redis Stack:集成 JSON、Search、Time Series、Graph 模块
  • Redis on Flash:冷热数据分离,降低内存成本
  • Dragonfly:多线程 Redis 替代方案,性能提升 25 倍
  • Valkey:Redis 开源替代(Linux Foundation 接管)