Redis 除了作为高性能缓存外,还因其丰富的数据结构和功能,广泛应用于多种场景。以下是 Redis 的十大核心用途及具体示例:
1. 分布式会话存储
- 用途:存储用户会话信息(如登录状态),实现多服务间共享会话。
- 优势:避免传统 Session 存储在单点故障或扩展性问题。
- 数据结构:Hash(存储会话字段)、String(简单键值)。
- 示例:
# 存储用户会话 HSET user:session:1234 username "john" role "admin" expires 3600 # 获取会话信息 HGETALL user:session:1234
2. 分布式锁
- 用途:实现跨服务的互斥锁,防止并发操作导致的数据不一致。
- 核心命令:
SET key value NX PX 30000
(原子操作 + 超时)。 - 示例(防止重复下单):
# 尝试获取锁(存在则失败) SET order_lock:1001 "locked" NX PX 10000 # 释放锁(需结合Lua脚本保证原子性) if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end
3. 消息队列
- 用途:实现轻量级消息队列,支持异步任务处理。
- 数据结构:List(LPUSH/RPOP)、Stream(支持消费者组)。
- 示例(使用 List):
# 生产者推送任务 LPUSH task_queue "send_email:user1@example.com" # 消费者获取任务 RPOP task_queue
4. 实时排行榜
- 用途:实时更新和查询排行榜(如游戏积分、商品销量)。
- 数据结构:Sorted Set(按分数排序)。
- 示例(游戏积分排行榜):
# 添加玩家积分 ZADD game_leaderboard 1500 "player1" 2000 "player2" 1800 "player3" # 获取前10名 ZREVRANGE game_leaderboard 0 9 WITHSCORES
5. 计数器与限流
- 用途:统计访问量、点赞数,或限制接口请求频率。
- 核心命令:
INCR
、INCRBY
、EXPIRE
。 - 示例(接口限流:每分钟最多100次请求):
# 每次请求递增计数器 INCR api_rate_limit:user123 # 设置过期时间(首次设置时) EXPIRE api_rate_limit:user123 60 # 检查是否超限 GET api_rate_limit:user123 # 超过100则拒绝
6. 发布/订阅(Pub/Sub)
- 用途:实现消息广播,支持实时通知(如聊天室、实时数据推送)。
- 核心命令:
PUBLISH
、SUBSCRIBE
。 - 示例(实时新闻推送):
# 订阅频道 SUBSCRIBE news_channel # 发布消息 PUBLISH news_channel "Breaking: Redis 7.0 released!"
7. 地理位置服务
- 用途:存储和查询地理位置(如附近的人、商家)。
- 数据结构:GEO(基于 Sorted Set 实现)。
- 示例(查找附近的餐厅):
# 添加地理位置 GEOADD restaurants 116.404269 39.913818 "restaurant_A" GEOADD restaurants 116.407531 39.915264 "restaurant_B" # 查找2公里内的餐厅 GEORADIUS restaurants 116.405285 39.912987 2 km WITHDIST
8. 布隆过滤器(Bloom Filter)
- 用途:高效判断元素是否存在(如防止缓存穿透、去重)。
- 原理:基于概率的数据结构,占用空间极小。
- 示例(校验新用户是否已注册):
# 添加元素 BF.ADD users "user123" # 检查是否存在 BF.EXISTS users "user123" # 返回1(可能存在)或0(一定不存在)
9. 实时数据分析
- 用途:统计在线用户数、实时点击量等。
- 数据结构:HyperLogLog(去重计数)、Bitmap(位操作)。
- 示例(统计每日活跃用户):
# 记录用户访问(用户ID为整型) SETBIT daily_active:20231001 1001 1 # 统计总活跃用户数 BITCOUNT daily_active:20231001
10. 数据库与缓存的二级存储
- 用途:作为 MySQL 的二级存储,缓存复杂查询结果。
- 模式:先查 Redis,未命中则查数据库并回填。
- 示例(缓存商品详情):
# 查询商品信息 GET product:detail:1001 # 未命中时从数据库加载并写入Redis SET product:detail:1001 '{"id":1001,"name":"Phone"}' EX 3600
总结
Redis 的多样化应用得益于其 高性能、丰富的数据结构 和 原子操作。合理使用 Redis 可以显著提升系统性能,解决分布式场景下的复杂问题。根据具体需求选择合适的数据结构和功能,是最大化 Redis 价值的关键。