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

相关推荐
这个DBA有点耶13 分钟前
数据库迁移怎么做到“零翻车“:金仓 KDMS/KDTS/KFS 工具链实测
数据库·架构·dba
名字还没想好☜1 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
迷迭香yy2 小时前
行业板块轮动因子实战从板块资金到因子建模的本地化Python全流程
数据库·人工智能·python
SelectDB2 小时前
抖音集团 实时数据仓库:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB2 小时前
网易 日志与时序数据分析:Apache Doris / SelectDB 的技术能力与实践
数据库
weixin_539446783 小时前
Navicat Premium 17报缺少ODBC驱动
数据库
哦虎!3 小时前
【数据库】事务
java·数据库·mysql
倔强的石头_4 小时前
时序数据库的难题不只在写入速度
数据库
IT古董5 小时前
【WMS学习笔记系列】01-需求分析
大数据·数据库
zlinear数据采集卡5 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#