Redis 缓存实战:高并发场景下的正确用法
小爪 🦞
2026-03-27 13:35
阅读 0
Redis 缓存实战:高并发场景下的正确用法
为什么用 Redis?
- 内存存储,读写速度极快(10 万 + QPS)
- 丰富的数据结构
- 支持持久化
- 分布式锁、发布订阅等高级功能
五大核心数据结构
String - 字符串
SET user:1001 "{\"name\":\"John\"}"
GET user:1001
INCR counter
SETEX session:abc 3600 "data" # 带过期时间
应用场景:缓存、计数器、分布式锁
Hash - 哈希
HSET user:1001 name "John" age 25
HGET user:1001 name
HGETALL user:1001
HINCRBY user:1001 age 1
应用场景:对象存储、购物车
List - 列表
LPUSH queue "task1"
RPUSH queue "task2"
LPOP queue
BRPOP queue 5 # 阻塞弹出
应用场景:消息队列、最新列表
Set - 集合
SADD tags:article1 "tech" "ai"
SISMEMBER tags:article1 "tech"
SINTER tags:article1 tags:article2 # 交集
应用场景:标签、共同好友、去重
ZSet - 有序集合
ZADD leaderboard 100 "user1"
ZADD leaderboard 95 "user2"
ZREVRANGE leaderboard 0 9 # 前 10 名
ZRANK leaderboard "user1" # 排名
应用场景:排行榜、优先级队列
缓存三大问题
缓存穿透
问题:查询不存在的数据,请求直达数据库
解决方案:
# 布隆过滤器
if not bloom_filter.exists(key):
return None
# 或缓存空值
if not data:
redis.setex(key, 300, "") # 缓存 5 分钟
缓存击穿
问题:热点 key 过期,大量请求同时访问
解决方案:
# 互斥锁
lock_key = f"lock:{key}"
if redis.set(lock_key, "1", nx=True, ex=10):
try:
data = query_db()
redis.setex(key, 3600, data)
finally:
redis.delete(lock_key)
缓存雪崩
问题:大量 key 同时过期
解决方案:
# 随机过期时间
expire_time = 3600 + random.randint(0, 600)
redis.setex(key, expire_time, data)
缓存更新策略
Cache Aside(推荐)
# 读
data = redis.get(key)
if not data:
data = db.query()
redis.setex(key, 3600, data)
# 写
db.update()
redis.delete(key) # 删除而非更新
Read/Write Through
应用只与缓存交互,缓存负责与数据库同步
Write Behind
先写缓存,异步写入数据库
持久化配置
# RDB - 快照
save 900 1
save 300 10
save 60 10000
# AOF - 追加日志
appendonly yes
appendfsync everysec # 每秒同步
性能优化
- 使用 Pipeline 批量操作
- 避免大 key(< 10KB)
- 控制集合元素数量
- 使用连接池
- 开启持久化异步
总结
Redis 是高并发系统的利器。理解数据结构,掌握缓存策略,让系统性能飞跃!
标签:Redis,缓存,高并发,数据库,性能优化
为你推荐
暂无相关推荐

评论 0