Redis 在业务中的典型用法汇总

 更新时间:2026年04月15日 09:51:30   作者:晴天sir  
文章主要介绍了Redis在业务中的六种常见应用场景,包括缓存access_token、存储业务状态、计数器、分布式锁、消息队列、标签和排行榜等,通过SpringBoot+RedisTemplate的方式进行实现,感兴趣的朋友跟随小编一起看看吧

最近在做小程序后端时,用 Redis 解决了几个典型问题:缓存 access_token、记录用户订阅状态、分布式锁防止并发。借此机会,我总结了 Redis 在业务中最常用的几种模式,希望对大家有帮助。相关代码,可以参考  wx小程序实战

一、为什么选择 Redis?

首先 Redis 是一款基于内存的键值存储系统,速度快、数据结构丰富、支持持久化。在需要高性能缓存分布式锁计数器消息队列等场景下,Redis 几乎是首选。

我将以 Spring Boot + RedisTemplate 为例,展示几种常见用法。

二、用法一:缓存(String 类型 + 过期时间)

场景

微信小程序的 access_token 有效期为 2 小时(7200 秒),且每日获取次数有限(2000 次)。必须缓存起来,避免频繁调用。

实现

// 获取 token
String token = redisTemplate.opsForValue().get("WECHAT_ACCESS_TOKEN");
if (token == null) {
    token = fetchFromWechat();
    redisTemplate.opsForValue().set("WECHAT_ACCESS_TOKEN", token, 7000, TimeUnit.SECONDS);
}

关键点

  • 设置 过期时间(略小于微信的有效期,提前刷新)
  • 配合 分布式锁 防止缓存击穿(见用法四)

三、用法二:存储业务状态(String 类型 + 过期时间)

场景

用户订阅消息后,需要在后端记录订阅关系,30 天后自动失效(与微信授权有效期对齐)。

实现

String key = "SUBSCRIBE:" + templateId + ":" + openId;
redisTemplate.opsForValue().set(key, "1", 30, TimeUnit.DAYS);
// 检查是否订阅
Boolean exists = redisTemplate.hasKey(key);

扩展

可以用 Hash 存储一个用户订阅的多个模板:hset user:openId templateId 1

但简单场景下 String 更直观

四、用法三:计数器(自增/自减)

场景

限制用户每天发送意见的次数(防刷)。例如每个村民每天最多提交 3 条意见。

实现

String key = "OPINION:LIMIT:" + openId + ":" + LocalDate.now();
Long count = redisTemplate.opsForValue().increment(key);
if (count == 1) {
 // 设置过期时间为当天结束
    redisTemplate.expire(key, 1, TimeUnit.DAYS);
}
if (count > 3) {
    return Result.error("今日提交次数已达上限");
}

其他应用

  • 统计点赞数、阅读数
  • 接口限流(滑动窗口)

五、用法四:分布式锁(String + setIfAbsent + Lua)

场景

多实例部署时,缓存失效瞬间多个线程同时请求微信 access_token,导致 token 被覆盖或超限。需要分布式锁保证只有一个线程去刷新。

实现

String lockKey = "WECHAT:ACCESS_TOKEN_LOCK";
String lockValue = UUID.randomUUID().toString();
Boolean locked = redisTemplate.opsForValue()
        .setIfAbsent(lockKey, lockValue, 5, TimeUnit.SECONDS);
if (locked) {
    try {
        // 双重检查
        String token = redisTemplate.opsForValue().get("WECHAT_ACCESS_TOKEN");
        if (token == null) {
            token = fetchFromWechat();
            redisTemplate.opsForValue().set("WECHAT_ACCESS_TOKEN", token, 7000, TimeUnit.SECONDS);
        }
        return token;
    } finally {
        // 释放锁:Lua 脚本保证原子性,只释放自己加的锁
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), 
                Collections.singletonList(lockKey), lockValue);
    }
} else {
    // 睡 100ms 后重试
    Thread.sleep(100);
    return getAccessToken();
}

注意

  • 锁必须有过期时间,防止死锁
  • 释放锁时必须验证 value,防止误删他人的锁
  • 使用 Lua 脚本保证 get + del 的原子性

六、用法五:消息队列(List / PubSub)

场景

异步处理耗时任务,例如发送订阅消息后需要记录日志,但不影响主流程响应。

用 List 实现简单队列

// 生产者:入队
redisTemplate.opsForList().rightPush("MSG:QUEUE", message);
// 消费者:阻塞弹出(配合 while 循环或定时任务)
String message = redisTemplate.opsForList().leftPop("MSG:QUEUE", 10, TimeUnit.SECONDS);

用 Pub/Sub 实现广播

// 发布
redisTemplate.convertAndSend("CHANNEL:OPINION", "新意见");
// 订阅(需实现 MessageListener)
@Bean
public MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
    return new MessageListenerAdapter(receiver, "onMessage");
}

对比

方式特点适用场景
List点对点,支持阻塞等待简单任务队列
Pub/Sub广播,消息即发即失(不持久化)实时通知、聊天
Stream(5.0+)持久化、消费组可靠消息队列

七、用法六:Set / SortedSet 实现标签和排行榜

Set 应用:用户标签系统

// 给用户打标签
redisTemplate.opsForSet().add("TAG:GRID_MEMEBER", openId1, openId2);
// 判断是否网格员
Boolean isGrid = redisTemplate.opsForSet().isMember("TAG:GRID_MEMEBER", openId);

SortedSet 应用:排行榜

// 增加积分
redisTemplate.opsForZSet().incrementScore("RANK:OPINION", openId, 1);
// 获取前三名
Set<String> top3 = redisTemplate.opsForZSet().reverseRange("RANK:OPINION", 0, 2);

八、总结

数据结构典型用法你的项目中的应用
String缓存、计数器、分布式锁access_token、订阅状态、限流
Hash存储对象字段(可扩展)用户配置
List消息队列异步任务
Set标签、去重用户角色标识
SortedSet排行榜、延迟队列积分排行
Pub/Sub实时广播通知推送

ok,结束。

到此这篇关于Redis 在业务中的几种典型用法的文章就介绍到这了,更多相关Redis 业务中用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis 键值设计使用总结

    Redis 键值设计使用总结

    这篇文章主要介绍了Redis键值设计的使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Redis3.2.6配置文件详细中文说明

    Redis3.2.6配置文件详细中文说明

    本文为大家分享了Redis3.2.6配置文件详细中文说明,非常详细收藏起来以后工作有用
    2018-10-10
  • antd为Tree组件标题附加操作按钮功能

    antd为Tree组件标题附加操作按钮功能

    这篇文章主要介绍了antd为Tree组件标题附加操作按钮功能,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Redis主从架构和高可用性实现过程

    Redis主从架构和高可用性实现过程

    本文详细介绍了使用Redis主从架构和Linux虚拟服务器(LVS)实现高可用性的方法,并回顾了最近完成的Redis集群迁移部署过程,主从架构通过复制数据来提高性能和数据冗余,而LVS用于实现负载均衡和故障切换,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 基于Redis实现附近商铺查询功能

    基于Redis实现附近商铺查询功能

    这篇文章主要介绍了基于Redis实现-附近商铺查询功能,这个功能将使用到Redis中的GEO这种数据结构来实现,需要的朋友可以参考下
    2025-05-05
  • 玩转Redis搭建集群之Sentinel详解

    玩转Redis搭建集群之Sentinel详解

    这篇文章主要给大家介绍了关于Redis搭建集群之Sentinel的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Redis常用的数据结构及实际应用场景

    Redis常用的数据结构及实际应用场景

    本文介绍了Redis中常用的数据结构,包括字符串、列表、集合、哈希表、有序集合和Bitmap,并详细说明了它们在各种场景下的使用,需要的朋友可以参考下
    2024-05-05
  • Redis生成全局唯一ID的实现方法

    Redis生成全局唯一ID的实现方法

    全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具,本文主要介绍了Redis生成全局唯一ID的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2022-06-06
  • 详解如何清理redis集群的所有数据

    详解如何清理redis集群的所有数据

    这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 基于Redis的List实现特价商品列表功能

    基于Redis的List实现特价商品列表功能

    本文通过场景分析给大家介绍了基于Redis的List实现特价商品列表,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08

最新评论