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

相关推荐
oradh20 分钟前
Oracle enq: TX - index contention 锁等待事件问题排查总结
数据库·oracle·oracle enq tx·enq tx index
CDN36035 分钟前
爬虫把价格库扒光、SQL注入打穿数据库?360CDN WAF规则引擎深度定制,把防护精度拉到逐字段级
数据库·爬虫·sql
数据库小学妹2 小时前
MySQL长事务复盘:Sleep连接、MDL排队与undo滞留
运维·数据库·mysql
吃饱了得干活2 小时前
Redis 从单机到集群:持久化、主从复制、哨兵与集群完全指南
redis·后端
半摆烂日常3 小时前
自建WMS和买成品:三年成本对比
大数据·服务器·数据库·python·深度学习·低代码·numpy
风123456789~3 小时前
【架构专栏】第6章 数据库设计基础知识 1/4
数据库·架构
Nturmoils3 小时前
异构数据同步不只追延迟:用 KFS 守住不停机迁移的每一笔账
数据库
星星落进兜里3 小时前
Redis 内存缓存,面试补充
数据库·redis·面试
小程故事多_804 小时前
企业AI对话记忆架构实战,告别单一Redis存储,搭建长短效协同的记忆体系
人工智能·redis·架构
宿6744 小时前
vue3-时间戳防缓存
缓存