数据结构、缓存策略、发布订阅与高可用架构
Redis(Remote Dictionary Server)是全球最流行的内存数据结构存储系统,被广泛用作数据库缓存、消息队列和实时数据处理引擎。凭借其卓越的性能(单线程每秒10万+操作)、丰富的数据结构和灵活的持久化机制,Redis已成为现代Web应用不可或缺的基础设施组件。本指南将全面介绍Redis的核心概念和实战技巧。
最基本的数据类型,可以存储文本、数字、二进制数据(最大512MB)。常用于缓存、计数器、分布式锁。
SET user:1001:name "张三"
GET user:1001:name
INCR page:views # 原子递增
SETEX session:abc 3600 "token" # 设置带过期时间的键
MGET key1 key2 key3 # 批量获取
键值对集合,适合存储对象。比如用户信息。
HSET user:1001 name "张三" age 28 email "zhangsan@example.com"
HGET user:1001 name
HGETALL user:1001 # 获取所有字段
HKEYS user:1001 # 获取所有键
HDEL user:1001 age # 删除字段
有序字符串列表,支持两端推入弹出。常用于消息队列、最新消息列表。
LPUSH queue:orders "order_001"
RPUSH queue:orders "order_002"
LPOP queue:orders # 从左边弹出
LRANGE queue:orders 0 -1 # 获取全部元素
LLEN queue:orders # 获取长度
BLPOP queue:orders 5 # 阻塞弹出(5秒超时)
无序不重复字符串集合,支持集合运算。常用于标签系统、共同好友。
SADD tags:article:100 "redis" "数据库" "缓存"
SMEMBERS tags:article:100
SISMEMBER tags:article:100 "redis" # 判断元素是否存在
SINTER tags:article:100 tags:article:200 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集
每个元素关联一个分数(score),按分数排序。常用于排行榜、延迟队列。
ZADD leaderboard 1000 "张三" 2000 "李四" 1500 "王五"
ZREVRANGE leaderboard 0 9 WITHSCORES # 排行榜Top10
ZRANK leaderboard "李四" # 查看排名
ZINCRBY leaderboard 500 "张三" # 加分
ZRANGEBYSCORE leaderboard 1000 2000 # 分数范围查询
最常用的缓存模式:先查缓存,缓存未命中再查数据库并回填缓存。
# 读取流程
data = redis.get("user:1001")
if data is null:
data = db.query("SELECT * FROM users WHERE id = 1001")
redis.setex("user:1001", 3600, json.dumps(data))
return data
# 写入流程(先更新DB,再删除缓存)
db.update("UPDATE users SET name = ? WHERE id = 1001", new_name)
redis.delete("user:1001")
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询不存在的数据 | 布隆过滤器 / 缓存空值 |
| 缓存击穿 | 热点Key过期 | 互斥锁 / 永不过期+异步更新 |
| 缓存雪崩 | 大量Key同时过期 | 随机过期时间 / 多级缓存 |
Redis的发布订阅模式实现消息的实时广播。
# 订阅频道
SUBSCRIBE news
SUBSCRIBE news sports weather
# 发布消息
PUBLISH news "今天发布了Redis 8.0版本"
PUBLISH sports "比赛结果:3:1"
# 订阅者收到:
# 1) "message"
# 2) "news"
# 3) "今天发布了Redis 8.0版本"
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| RDB | 定时快照 | 文件小、恢复快 | 可能丢失数据 |
| AOF | 记录写操作日志 | 数据更安全 | 文件大、恢复慢 |
| 混合 | RDB + AOF增量 | 兼顾两者 | 配置稍复杂 |
# RDB配置
save 900 1 # 900秒内至少1次修改则触发
save 300 10 # 300秒内至少10次修改
save 60 10000 # 60秒内至少10000次修改
# AOF配置
appendonly yes
appendfsync everysec # 每秒同步,平衡性能和安全
访问 ToolSnap 获取JSON格式化、编码转换等在线工具,提升开发效率。
Redis支持5种基础数据结构:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、ZSet/Sorted Set(有序集合)。此外还有Bitmaps、HyperLogLog、Geospatial、Stream等高级数据结构。
三大经典问题:缓存穿透(查询不存在的数据)、缓存击穿(热点Key过期)、缓存雪崩(大量Key同时过期)。分别通过布隆过滤器、互斥锁、随机过期时间解决。
Redis支持更丰富的数据结构、持久化和发布订阅;Memcached只支持String类型,不支持持久化,但多线程模型在纯缓存场景下吞吐量更高。
Redis通过主从复制实现数据冗余,通过Sentinel实现自动故障转移,通过Cluster实现水平分片。生产环境推荐至少一主两从加Sentinel的部署方案。