Redis入门指南

数据结构、缓存策略、发布订阅与高可用架构

📅 2026年4月6日 · 阅读约10分钟 · Redis缓存后端开发

Redis(Remote Dictionary Server)是全球最流行的内存数据结构存储系统,被广泛用作数据库缓存、消息队列和实时数据处理引擎。凭借其卓越的性能(单线程每秒10万+操作)、丰富的数据结构和灵活的持久化机制,Redis已成为现代Web应用不可或缺的基础设施组件。本指南将全面介绍Redis的核心概念和实战技巧。

一、Redis核心数据结构

1.1 String(字符串)

最基本的数据类型,可以存储文本、数字、二进制数据(最大512MB)。常用于缓存、计数器、分布式锁。

SET user:1001:name "张三"
GET user:1001:name
INCR page:views          # 原子递增
SETEX session:abc 3600 "token"  # 设置带过期时间的键
MGET key1 key2 key3      # 批量获取

1.2 Hash(哈希)

键值对集合,适合存储对象。比如用户信息。

HSET user:1001 name "张三" age 28 email "zhangsan@example.com"
HGET user:1001 name
HGETALL user:1001          # 获取所有字段
HKEYS user:1001            # 获取所有键
HDEL user:1001 age         # 删除字段

1.3 List(列表)

有序字符串列表,支持两端推入弹出。常用于消息队列、最新消息列表。

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秒超时)

1.4 Set(集合)

无序不重复字符串集合,支持集合运算。常用于标签系统、共同好友。

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            # 差集

1.5 ZSet / Sorted Set(有序集合)

每个元素关联一个分数(score),按分数排序。常用于排行榜、延迟队列。

ZADD leaderboard 1000 "张三" 2000 "李四" 1500 "王五"
ZREVRANGE leaderboard 0 9 WITHSCORES  # 排行榜Top10
ZRANK leaderboard "李四"               # 查看排名
ZINCRBY leaderboard 500 "张三"         # 加分
ZRANGEBYSCORE leaderboard 1000 2000    # 分数范围查询

二、缓存策略

2.1 Cache Aside(旁路缓存)

最常用的缓存模式:先查缓存,缓存未命中再查数据库并回填缓存。

# 读取流程
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")

2.2 常见缓存问题与解决方案

问题原因解决方案
缓存穿透查询不存在的数据布隆过滤器 / 缓存空值
缓存击穿热点Key过期互斥锁 / 永不过期+异步更新
缓存雪崩大量Key同时过期随机过期时间 / 多级缓存

2.3 过期策略

三、发布订阅(Pub/Sub)

Redis的发布订阅模式实现消息的实时广播。

# 订阅频道
SUBSCRIBE news
SUBSCRIBE news sports weather

# 发布消息
PUBLISH news "今天发布了Redis 8.0版本"
PUBLISH sports "比赛结果:3:1"

# 订阅者收到:
# 1) "message"
# 2) "news"
# 3) "今天发布了Redis 8.0版本"
💡 注意:Redis Pub/Sub是Fire-and-Forget模式,消息发布后如果没有订阅者,消息会丢失。对于需要持久化和可靠投递的场景,推荐使用Redis Stream或消息队列(如RabbitMQ、Kafka)。

四、Redis持久化

方式原理优点缺点
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格式化、编码转换等在线工具,提升开发效率。

常见问题(FAQ)

Redis支持哪些数据结构?

Redis支持5种基础数据结构:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、ZSet/Sorted Set(有序集合)。此外还有Bitmaps、HyperLogLog、Geospatial、Stream等高级数据结构。

Redis缓存有哪些常见问题?

三大经典问题:缓存穿透(查询不存在的数据)、缓存击穿(热点Key过期)、缓存雪崩(大量Key同时过期)。分别通过布隆过滤器、互斥锁、随机过期时间解决。

Redis和Memcached有什么区别?

Redis支持更丰富的数据结构、持久化和发布订阅;Memcached只支持String类型,不支持持久化,但多线程模型在纯缓存场景下吞吐量更高。

Redis如何保证高可用?

Redis通过主从复制实现数据冗余,通过Sentinel实现自动故障转移,通过Cluster实现水平分片。生产环境推荐至少一主两从加Sentinel的部署方案。