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 能显著提升系统性能和扩展性。

相关推荐
小冷coding4 小时前
【MySQL】MySQL 插入一条数据的完整流程(InnoDB 引擎)
数据库·mysql
鲨莎分不晴5 小时前
Redis 基本指令与命令详解
数据库·redis·缓存
专注echarts研发20年5 小时前
工业级 Qt 业务窗体标杆实现・ResearchForm 类深度解析
数据库·qt·系统架构
周杰伦的稻香7 小时前
MySQL中常见的慢查询与优化
android·数据库·mysql
冉冰学姐7 小时前
SSM学生社团管理系统jcjyw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·学生社团管理系统·多角色管理
nvd118 小时前
深入分析:Pytest异步测试中的数据库会话事件循环问题
数据库·pytest
appearappear8 小时前
如何安全批量更新数据库某个字段
数据库
·云扬·9 小时前
MySQL 常见存储引擎详解及面试高频考点
数据库·mysql·面试
羊小猪~~9 小时前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
coding-fun10 小时前
电子发票批量提取导出合并助手
大数据·数据库