Redis 在具体项目中的应用非常广泛,主要通过其高性能的内存存储和灵活的数据结构解决多种场景的问题。以下是典型使用场景及示例:
一、缓存加速(最常用)
场景 :缓解数据库压力,提升读取速度。
实现:
- 查询时优先读缓存,无数据则查数据库并回填缓存。
- 设置过期时间(如
EXPIRE key 60)避免数据长期不一致。
python
import redis
r = redis.Redis(host='localhost', port=6379)
def get_user(user_id):
cache_key = f"user:{user_id}"
user_data = r.get(cache_key)
if user_data:
return user_data # 缓存命中
else:
user_data = db.query("SELECT * FROM users WHERE id = %s", user_id) # 查数据库
r.setex(cache_key, 60, user_data) # 写入缓存,60秒过期
return user_data
二、会话管理(Session Storage)
场景 :分布式系统中存储用户会话状态。
优势 :避免多服务器间会话同步问题。
实现:
python
from flask import Flask, session
from flask_session import RedisSessionInterface
app = Flask(__name__)
app.session_interface = RedisSessionInterface(redis=r, key_prefix='sess:')
三、实时排行榜(Sorted Set)
场景 :游戏积分榜、热点文章排名等。
操作:
- 用
ZADD添加分数(如ZADD leaderboard 100 "user1") - 用
ZREVRANGE获取排名(如ZREVRANGE leaderboard 0 9 WITHSCORES)
python
# 更新用户积分
r.zadd('game_rank', {'user1': 150, 'user2': 200})
# 获取前10名
top_users = r.zrevrange('game_rank', 0, 9, withscores=True)
四、分布式锁
场景 :控制多进程/服务对共享资源的互斥访问。
实现 :通过 SET key value NX EX 实现原子操作。
python
def acquire_lock(lock_key, expire=10):
if r.set(lock_key, 1, nx=True, ex=expire):
return True # 获取锁成功
return False
def release_lock(lock_key):
r.delete(lock_key)
五、消息队列(Pub/Sub 或 Stream)
场景 :异步任务处理、事件通知。
示例(Pub/Sub):
python
# 发布者
r.publish('order_channel', 'order_id_123')
# 订阅者
pubsub = r.pubsub()
pubsub.subscribe('order_channel')
for message in pubsub.listen():
if message['type'] == 'message':
process_order(message['data'])
六、计数器(如阅读量)
场景 :高频更新的计数场景。
操作:
python
# 增加阅读量
r.incr('article:123:views')
# 获取当前值
views = r.get('article:123:views')
注意事项:
- 持久化 :根据需求选择
RDB(快照)或AOF(日志)避免数据丢失。 - 内存管理 :监控内存使用,设置
maxmemory策略(如allkeys-lru)。 - 集群部署:数据量较大时使用 Redis Cluster 分片存储。
通过结合具体业务需求选择数据结构(如 Hash 存储对象、Set 去重),Redis 能显著提升系统性能和扩展性。