Redis 在真实项目中的 10 个经典应用场景(Java 后端必会)

4 阅读3分钟

很多人学习 Redis 时,会去背一堆命令:

set
get
zadd
hset
lpush

但真正到项目中,往往不知道 Redis 能解决什么业务问题

其实 Redis 在企业项目中的核心价值只有一句话:

用内存解决高并发问题

本文整理 10 个 Java 后端开发最常见的 Redis 场景,基本覆盖 90% 企业项目使用 Redis 的方式


一、缓存热点数据(最常见)

场景

比如:

  • 用户信息
  • 商品详情
  • 首页数据
  • 系统配置
  • 权限菜单

这些数据:

  • 查询频繁
  • 更新较少

非常适合放 Redis。


使用结构

String

示例

查询用户信息:

String key = "user:info:" + userId;

Object cache = redisTemplate.opsForValue().get(key);
if(cache != null){
    return cache;
}

User user = userMapper.selectById(userId);

redisTemplate.opsForValue().set(key,user,30,TimeUnit.MINUTES);

return user;

Key 设计建议

推荐格式:

业务:模块:标识

例如:

user:info:1001
product:detail:888
config:system

二、登录态 / Token 存储

场景

用户登录后,需要保存登录信息:

例如:

token -> 用户信息

Redis 非常适合做 登录态存储


使用结构

Hash

示例

String key = "login:token:" + token;

redisTemplate.opsForHash().put(key,"userId",user.getId());
redisTemplate.opsForHash().put(key,"username",user.getUsername());

redisTemplate.expire(key,7,TimeUnit.DAYS);

好处

相比 Session:

  • 支持分布式
  • 支持多服务
  • 读取速度快

三、短信验证码 / 邮箱验证码

场景

例如:

  • 登录验证码
  • 注册验证码
  • 修改手机号验证码

使用结构

String

示例

String code = "123456";

redisTemplate.opsForValue().set(
        "sms:code:13800000000",
        code,
        5,
        TimeUnit.MINUTES
);

注意

需要同时做 发送频率限制

sms:send:phone

避免恶意刷验证码。


四、分布式锁

场景

防止多服务器同时执行同一任务,例如:

  • 防止重复下单
  • 防止重复生成账单
  • 防止重复退款
  • 防止定时任务重复执行

Redis实现

Boolean lock = redisTemplate.opsForValue()
        .setIfAbsent("lock:order:123","1",30,TimeUnit.SECONDS);

if(lock){
    try{
        //业务逻辑
    }finally{
        redisTemplate.delete("lock:order:123");
    }
}

推荐方案

生产环境更推荐:

Redisson

因为:

  • 自动续期
  • 防死锁
  • 可重入锁

五、排行榜(ZSet)

场景

例如:

  • 用户积分排行榜
  • 销售排行榜
  • 热门文章
  • 职位热度榜

使用结构

ZSet

示例

ZADD rank:user 100 user1
ZADD rank:user 90 user2
ZADD rank:user 120 user3

获取前10名:

ZREVRANGE rank:user 0 9 WITHSCORES

六、延迟任务 / 超时关闭订单

场景

例如:

  • 30分钟未支付关闭订单
  • 面试预约超时
  • 电子签约超时

实现方式

score 存时间戳:

ZADD order:delay 1710000000 order123

扫描到期任务:

ZRANGEBYSCORE order:delay -inf 当前时间

执行后删除:

ZREM order:delay order123

七、接口限流 / 防刷

场景

例如:

  • 登录接口限制
  • API访问限制
  • 短信接口防刷

实现

String key = "limit:login:"+ip;

Long count = redisTemplate.opsForValue().increment(key);

if(count == 1){
    redisTemplate.expire(key,1,TimeUnit.MINUTES);
}

if(count > 5){
    throw new RuntimeException("请求过于频繁");
}

八、消息队列 / 异步任务

场景

例如:

  • 发送短信
  • 发送邮件
  • 生成通知

使用结构

List

生产者:

LPUSH msg:queue task1

消费者:

BRPOP msg:queue 0

九、购物车 / 临时数据

场景

例如:

  • 电商购物车
  • 临时表单
  • 草稿数据

使用结构

Hash

示例:

HSET cart:user:1001 sku100 2
HSET cart:user:1001 sku101 1

十、签到 / 去重 / 标签系统

场景

例如:

  • 今日签到用户
  • 文章点赞用户
  • 活动参与用户

使用结构

Set

示例:

SADD sign:20260318 user1
SADD sign:20260318 user2

判断是否签到:

SISMEMBER sign:20260318 user1

总结

Redis 常见结构与场景:

数据结构使用场景
String缓存、验证码、锁
Hash用户会话、购物车
Set去重、标签
ZSet排行榜、延迟任务
List消息队列

掌握这些场景,Redis 在项目中基本就 够用了