Redis 缓存策略实战:高性能缓存设计完全指南
Redis 是高性能的内存数据库,广泛用于缓存、会话管理、排行榜等场景。本文深入讲解 Redis 缓存策略和设计模式。
🚀 核心数据结构
1. String:最基础的类型
SET user:1001 "{'name': 'John', 'age': 25}"
GET user:1001
INCR page:views # 计数器
SETEX session:abc123 3600 "data" # 设置过期时间
2. Hash:对象存储
HSET user:1001 name "John" age 25
HGET user:1001 name
HGETALL user:1001
3. List:消息队列
LPUSH tasks "task1"
RPUSH tasks "task2"
LPOP tasks # 阻塞版本:BLPOP
4. Set:标签、共同好友
SADD user:1001:tags "redis" "database"
SINTER user:1001:tags user:1002:tags # 交集
5. Sorted Set:排行榜
ZADD leaderboard 95 "player1"
ZADD leaderboard 87 "player2"
ZREVRANGE leaderboard 0 9 # 前 10 名
🔄 缓存策略
1. Cache-Aside(旁路缓存)
def get_user(user_id):
# 先查缓存
user = redis.get(f"user:{user_id}")
if user:
return user
# 缓存未命中,查数据库
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
# 写入缓存
redis.setex(f"user:{user_id}", 3600, json.dumps(user))
return user
2. Write-Through(同步写入)
每次写数据库同时写缓存,保证一致性。
3. Write-Behind(异步写入)
先写缓存,异步批量写数据库,提高写入性能。
⚡ 缓存失效策略
- TTTL(Time To Live):设置过期时间
- LRU(Least Recently Used):淘汰最久未使用的数据
- LFU(Least Frequently Used):淘汰使用频率最低的数据
# 配置 maxmemory 策略
maxmemory 2gb
maxmemory-policy allkeys-lru
🔧 实战:分布式锁
import redis
import uuid
import time
def acquire_lock(redis_client, lock_key, timeout=10):
identifier = str(uuid.uuid4())
end = time.time() + timeout
while time.time() < end:
if redis_client.set(lock_key, identifier, nx=True, ex=10):
return identifier
time.sleep(0.001)
return False
def release_lock(redis_client, lock_key, identifier):
# 使用 Lua 脚本保证原子性
lua_script = """
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
"""
redis_client.eval(lua_script, 1, lock_key, identifier)
📊 性能优化
- 使用 Pipeline:批量执行命令,减少网络往返
- 使用 Lua 脚本:保证多个命令的原子性
- 合理设计 Key:避免大 Key(>10KB)
- 避免热 Key:使用本地缓存 + Redis 多级缓存
- 启用内存淘汰策略:防止内存溢出
总结:Redis 是高性能应用的核心组件。掌握数据结构、缓存策略、分布式锁等实战技巧,能设计出高效可靠的缓存系统。
本文整理自 Redis 官方文档及缓存实战社区经验