Redis 在项目中的常见使用场景

Redis 在具体项目中的应用非常广泛,主要通过其高性能的内存存储和灵活的数据结构解决多种场景的问题。以下是典型使用场景及示例:


一、缓存加速(最常用)

场景 :缓解数据库压力,提升读取速度。
实现

  1. 查询时优先读缓存,无数据则查数据库并回填缓存。
  2. 设置过期时间(如 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')

注意事项:

  1. 持久化 :根据需求选择 RDB(快照)或 AOF(日志)避免数据丢失。
  2. 内存管理 :监控内存使用,设置 maxmemory 策略(如 allkeys-lru)。
  3. 集群部署:数据量较大时使用 Redis Cluster 分片存储。

通过结合具体业务需求选择数据结构(如 Hash 存储对象、Set 去重),Redis 能显著提升系统性能和扩展性。

相关推荐
wang6021252181 分钟前
FastAPI框架为什么在启动时建表
数据库
男孩李3 分钟前
linux下如何执行postgres数据库的sql文件
数据库·sql·postgresql
zwjapple7 分钟前
MySQL SQL 面试核心考点与注意事项总结
数据库·sql·mysql
乐韵天城8 分钟前
SpringBoot中如何手动开启数据库事务
数据库·spring boot
05大叔13 分钟前
Spring Day02
数据库·sql·spring
jmxwzy17 分钟前
点赞系统问题
java·redis·tidb·pulsar
默默前行的虫虫19 分钟前
nicegui中多次调用数据库操作总结
数据库·python
鸽鸽程序猿26 分钟前
【Redis】事务
数据库·redis·缓存
Knight_AL1 小时前
MySQL 分区表应用案例:优化数据管理与性能
数据库·mysql
东东的脑洞1 小时前
【面试突击】Redis 主从复制核心面试知识点
redis·面试·职场和发展