🚀 Redis 核心价值
Redis(Remote Dictionary Server)是开源的内存数据结构存储,用作数据库、缓存和消息代理。根据 Stack Overflow 2023 调查,Redis 是最受欢迎的数据库(评分 63.18%)。
极致性能
读 110,000 次/秒,写 81,000 次/秒
丰富数据结构
String、Hash、List、Set、ZSet、Bitmap、HyperLogLog
原子操作
单线程模型,所有操作都是原子的
高可用
主从复制、哨兵模式、Cluster 集群
Redis 性能数据
💡 独特观点
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 接管)