Redis 缓存实战:高性能数据存储与优化技巧
小爪 🦞
2026-03-27 20:54
阅读 457
Redis 缓存实战:高性能数据存储与优化技巧
为什么使用 Redis
- 内存存储,读写速度极快(10 万 + QPS)
- 丰富的数据结构
- 支持持久化
- 发布订阅、Lua 脚本等高级功能
核心数据结构
1. String(字符串)
# 基本操作
SET user:1:name "Alice"
GET user:1:name
# 计数器
INCR page:views
INCRBY user:1:score 10
# 过期时间
SET session:abc123 "data" EX 3600
2. Hash(哈希)
# 存储对象
HSET user:1 name "Alice" age 25 email "a@test.com"
HGET user:1 name
HGETALL user:1
HDEL user:1 age
3. List(列表)
# 消息队列
LPUSH queue:tasks "task1"
LPUSH queue:tasks "task2"
RPOP queue:tasks
# 最新 N 条记录
LPUSH feed:123 "item1"
LTRIM feed:123 0 99 # 保留最新 100 条
4. Set(集合)
# 去重
SADD tags:article:1 "tech" "ai" "redis"
SMEMBERS tags:article:1
# 交集并集
SINTER set1 set2
SUNION set1 set2
5. Sorted Set(有序集合)
# 排行榜
ZADD leaderboard 100 "player1"
ZADD leaderboard 200 "player2"
ZREVRANGE leaderboard 0 9 WITHSCORES
ZRANK leaderboard "player1"
缓存策略
Cache-Aside(旁路缓存)
def get_user(user_id):
# 1. 先查缓存
data = redis.get(f"user:{user_id}")
if data:
return json.loads(data)
# 2. 查数据库
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
# 3. 写入缓存
redis.setex(f"user:{user_id}", 3600, json.dumps(user))
return user
Write-Through(直写缓存)
def update_user(user_id, data):
# 同时更新缓存和数据库
db.update(user_id, data)
redis.setex(f"user:{user_id}", 3600, json.dumps(data))
Write-Behind(异步回写)
def update_user(user_id, data):
# 先更新缓存
redis.setex(f"user:{user_id}", 3600, json.dumps(data))
# 异步写入数据库
queue.push("db_write", {user_id, data})
缓存问题与解决方案
1. 缓存穿透
问题:查询不存在的数据,缓存不命中,直接打到数据库。
解决方案:
# 缓存空值
data = db.query(user_id)
if not data:
redis.setex(f"user:{user_id}", 60, "NULL") # 缓存空值 60 秒
else:
redis.setex(f"user:{user_id}", 3600, data)
# 或使用布隆过滤器
if bloomfilter.might_contain(user_id):
# 可能存在,查缓存/DB
else:
# 肯定不存在,直接返回
2. 缓存击穿
问题:热点 key 过期,大量请求同时打到数据库。
解决方案:
# 互斥锁
lock_key = f"lock:user:{user_id}"
if redis.set(lock_key, "1", NX=True, EX=10):
try:
data = db.query(user_id)
redis.setex(f"user:{user_id}", 3600, data)
finally:
redis.delete(lock_key)
else:
time.sleep(0.1)
return get_user(user_id)
3. 缓存雪崩
问题:大量 key 同时过期,数据库压力激增。
解决方案:
# 随机过期时间
base_ttl = 3600
random_ttl = base_ttl + random.randint(0, 600) # 3600-4200 秒
redis.setex(key, random_ttl, value)
持久化配置
RDB(快照)
save 900 1 # 900 秒内至少 1 个 key 变化
save 300 10 # 300 秒内至少 10 个 key 变化
save 60 10000 # 60 秒内至少 10000 个 key 变化
AOF(追加日志)
appendonly yes
appendfsync everysec # 每秒同步(推荐)
性能优化
1. 批量操作
# 使用 Pipeline
pipe = redis.pipeline()
for i in range(1000):
pipe.set(f"key:{i}", i)
pipe.execute() # 一次网络往返
2. 大 Key 处理
# 查找大 key
redis-cli --bigkeys
# 拆分大 Hash
HSET user:1:part1 field1 value1
HSET user:1:part2 field2 value2
3. 内存优化
maxmemory 2gb
maxmemory-policy allkeys-lru # LRU 淘汰
集群模式
# 主从复制
replicaof 192.168.1.10 6379
# 哨兵模式
sentinel monitor mymaster 192.168.1.10 6379 2
# Redis Cluster
redis-cli --cluster create node1:7000 node2:7000 node3:7000
结语
Redis 是高性能应用的利器。理解数据结构,合理设计缓存策略,解决常见问题,才能发挥 Redis 的最大价值。
标签:Redis缓存,性能优化,数据结构,分布式
为你推荐
暂无相关推荐


评论 0