Redis绝不仅仅是个“缓存”。它凭借**内存级速度、丰富的数据结构和原子操作**,已成为解决高并发、实时性问题的瑞士军刀。对于Java程序员,理解这些场景能让你在设计系统时游刃有余。
下面,我将结合具体实例,详解上图中每一个核心应用场景。
🗂️ 1. 缓存:这是Redis的“主场”
这是最经典的应用,核心是**提升读性能、降低后端压力**。
- 场景:博客文章详情、电商商品信息、用户基础数据。
- 使用:
// 伪代码示例:经典的“缓存-读取”模式
public Article getArticle(Long id) {
// 1. 先查缓存
String key = "article:" + id;
Article article = redis.get(key);
if (article != null) {
return article; // 缓存命中
}
// 2. 缓存未命中,查数据库
article = db.selectById(id);
// 3. 写入缓存,并设置过期时间(如5分钟)
redis.setex(key, 300, article);
return article;
}- 注意点:需处理 缓存穿透(查不存在的数据)、缓存击穿(热点key过期瞬间)、缓存雪崩(大量key同时过期)等问题。
👥 2. 会话管理:分布式系统的关键
在微服务/分布式架构中,替换Tomcat的HttpSession。
- 场景:用户登录状态、购物车信息。
- 使用:用户登录后,生成一个全局唯一sessionId作为Key,将用户会话对象(序列化为JSON或二进制)存入Redis,并设置过期时间。所有应用服务器都从Redis读写此会话。
- 优势:无状态化应用服务器,便于水平扩展;集中管理会话。
🏆 3. 排行榜与计数器:利用Sorted Set
利用ZSET(有序集合)的天然排序特性。
- 场景:游戏积分榜、博客阅读量排行、热搜列表。
- 使用:
# 用户得分增加
ZINCRBY game_rank 100 "user:123"
# 获取前三名
ZREVRANGE game_rank 0 2 WITHSCORES- 延伸:HASH可用于存储文章阅读数、点赞数,通HINCRBY实现原子递增,性能极高。
⏱️ 4. 频率控制与限流:保护系统
利用INCREXPIRE的原子性实现简单高效的限流。
- 场景:短信验证码接口防刷、API调用频率限制。
- 使用:
// 伪代码:限制一个IP每分钟只能请求5次
public boolean isAllowed(String ip) {
String key = "limit:" + ip;
// 原子操作:计数并设置过期时间
Long count = redis.incr(key);
if (count == 1) {
redis.expire(key, 60); // 首次设置过期时间
}
return count <= 5;
}📨 5. 消息队列与发布订阅
虽然不如专业MQ,但在轻量级场景下很方便。
- 场景:系统间异步通知、轻量级任务队列。
- 使用:
- List作队列:用 LPUSHBRPOP 实现简单的生产者-消费者。
- 发布订阅:用 PUBLISH 和 SUBSCRIBE 实现事件广播,如“订单完成通知”。
🗺️ 6. 实时系统与复杂统计
利用Redis丰富的结构解决特殊问题。
- 场景:
- 地理空间GEO类型可存储地理位置,计算附近的人/商家。
- 位图统计BITMAP可极大节省空间,用于记录用户签到(每日1bit)、判断活跃用户等。