Redis 高级用法:从缓存到分布式系统的核心组件
Redis 作为最流行的内存数据库,不仅能做缓存,还支持分布式锁、消息队列、实时排行榜等高级场景。本文深入探讨 Redis 的高级用法,助你成为 Redis 专家。
一、Redis 数据结构进阶
Redis 提供了五种基本数据结构,每种都有其独特的应用场景。
1.1 String 高级用法
# 设置带过期时间的 key SET user:1001 "张三" EX 3600 # 不存在才设置(分布式锁基础) SET lock:order NX EX 30 # 批量操作 MSET key1 "value1" key2 "value2" MGET key1 key2 # 数值操作 INCR page:views INCRBY counter 100
1.2 Hash 结构
# 存储对象 HSET user:1001 name "张三" age 25 city "北京" # 获取单个字段 HGET user:1001 name # 获取所有字段 HGETALL user:1001 # 数值增减 HINCRBY user:1001 age 1
1.3 Sorted Set 排行榜
# 添加成员 ZADD leaderboard 100 user1 200 user2 150 user3 # 获取排行榜(降序) ZREVRANGE leaderboard 0 9 WITHSCORES # 获取排名 ZREVRANK leaderboard user1 # 增加分数 ZINCRBY leaderboard 50 user1
二、缓存策略
2.1 缓存穿透
查询不存在的数据,请求直接穿透到数据库。解决方案:缓存空值或使用布隆过滤器。
import redis
import json
r = redis.Redis(host='localhost', port=6379, db=0)
def get_user(user_id):
key = f"user:user_id"
value = r.get(key)
if value is not None:
if value == b'NULL':
return None
return json.loads(value)
user = db.query("SELECT * FROM users WHERE id = user_id")
if user:
r.setex(key, 3600, json.dumps(user))
else:
r.setex(key, 60, 'NULL')
return user
2.2 缓存雪崩
大量缓存同时失效,导致数据库压力骤增。解决方案:过期时间加随机值。
import random
def set_cache(key, value, base_ttl=3600):
ttl = base_ttl + random.randint(0, 300)
r.setex(key, ttl, json.dumps(value))
三、分布式锁
Redis 分布式锁是高并发场景的利器。
import redis
import uuid
r = redis.Redis(host='localhost', port=6379, db=0)
class RedisLock:
def __init__(self, name, expire=30):
self.name = name
self.expire = expire
self.identifier = str(uuid.uuid4())
self.key = f"lock:name"
def acquire(self):
return r.set(self.key, self.identifier, nx=True, ex=self.expire)
def release(self):
script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) end return 0"
r.eval(script, 1, self.key, self.identifier)
with RedisLock("order:12345"):
process_order()
四、消息队列
Redis 的 List 可以实现简单的消息队列。
import threading
def producer():
for i in range(10):
task = json.dumps({"id": i, "data": f"task_i"})
r.lpush("task:queue", task)
def consumer():
while True:
result = r.brpop("task:queue", timeout=5)
if result:
_, task = result
data = json.loads(task)
process_task(data)
五、限流
使用 Redis 实现令牌桶或滑动窗口限流。
import time
def check_rate_limit(user_id, limit=100, window=60):
key = f"rate_limit:user_id"
current = r.incr(key)
if current == 1:
r.expire(key, window)
return current <= limit
六、总结
Redis 的高级用法远不止缓存,分布式锁、消息队列、限流、排行榜等场景都能胜任。掌握这些技能,能让你在系统设计中游刃有余。
最佳实践建议:
1. 合理设置过期时间,避免雪崩
2. 使用连接池管理连接
3. 大 key 拆分,避免阻塞
4. 持久化配置根据场景选择
本文链接:https://www.kkkliao.cn/?id=774 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。



手机流量卡
免费领卡
号卡合伙人
产品服务
关于本站
