econets-vue开发指南 econets-vue开发指南
首页
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • 公众号手册
  • CRM手册
  • 运维手册
GitHub (opens new window)
首页
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • 公众号手册
  • CRM手册
  • 运维手册
GitHub (opens new window)
  • 萌新必读

    • 简介
    • 功能列表
    • 快速启动(后端项目)
    • 快速启动(前端项目)
    • 技术选型
    • 项目结构
    • 代码热加载
    • 一键改包
    • 删除功能
    • 内网穿透
  • 后端手册

    • 新建服务
    • 代码生成【单表】(新增功能)
    • 代码生成【主子表】
    • 代码生成(树表)
    • 功能权限
    • 数据权限
    • 用户体系
    • 三方登录
    • OAuth 2.0(SSO 单点登录)
    • SaaS 多租户【字段隔离】
    • SaaS 多租户【数据库隔离】
    • WebSocket 实时通信
    • 13异常处理(错误码)
    • 参数校验
    • 分页实现
    • 文件存储(上传下载)
    • Excel 导入导出
    • 系统日志
    • MyBatis 数据库
    • MyBatis 联表&分页查询
    • 多数据源(读写分离)
    • Redis 缓存
      • 1. 编程式缓存
        • [#](https://doc.iocoder.cn/redis-cache/#_1-1-spring-data-redis-配置)1.1 Spring Data Redis 配置
        • 1.2 实战案例
        • 1.2.1 引入依赖
        • 1.2.2 OAuth2AccessTokenDO
        • 1.2.3 RedisKeyConstants
        • 1.2.4 OAuth2AccessTokenRedisDAO
        • 1.2.5 OAuth2TokenServiceImpl
      • 2. 声明式缓存
        • 2.1 Spring Cache 配置
        • 2.2 常见注解
        • 2.2.1 @Cacheable 注解
        • 2.2.2 @CachePut 注解
        • 2.2.3 @CacheEvict 注解
        • 2.3 实战案例
      • 3. Redis 监控
    • 本地缓存
    • 异步任务
    • 配置管理
    • 工具类 Util
    • 单元测试
    • 分布式锁
    • 幂等性(防重复提交)
    • 数据库文档
    • 验证码
  • 中间件手册

    • 定时任务
    • 消息队列(内存)
    • 消息队列(Redis)
    • 消息队列(RocketMQ)
    • 消息队列(RabbitMQ)
    • 消息队列(Kafka)
    • 限流熔断
  • 工作流手册

    • 工作流(Flowable)会签、或签
  • 指南
  • 后端手册
EcoNets Tech
2024-01-14
目录

Redis 缓存

blossom-spring-boot-starter-redis (opens new window)技术组件,使用 Redis 实现缓存的功能,它有 2 种使用方式:

  • 编程式缓存:基于 Spring Data Redis 框架的 RedisTemplate 操作模板
  • 声明式缓存:基于 Spring Cache 框架的 @Cacheable 等等注解

# 1. 编程式缓存

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>

由于 Redisson 提供了分布式锁、队列、限流等特性,所以使用它作为 Spring Data Redis 的客户端。

# # (opens new window)1.1 Spring Data Redis 配置

① 在 application-dev.yaml (opens new window)配置文件中,通过 spring.redis 配置项,设置 Redis 的配置。如下图所示:

doc_econets_pic_121.png

② 在 BlossomRedisAutoConfiguration (opens new window)配置类,设置使用 JSON 序列化 value 值。如下图所示:

doc_econets_pic_122.png

# 1.2 实战案例

以访问令牌 Access Token 的缓存来举例子,讲解项目中是如何使用 Spring Data Redis 框架的。

doc_econets_pic_123.png

# 1.2.1 引入依赖

在 blossom-module-system-biz 模块中,引入 blossom-spring-boot-starter-redis 技术组件。如下所示:

<dependency>
    <groupId>cn.econets.boot</groupId>
    <artifactId>blossom-spring-boot-starter-redis</artifactId>
</dependency>

# 1.2.2 OAuth2AccessTokenDO

新建 OAuth2AccessTokenDO (opens new window)类,访问令牌 Access Token 类。代码如下:

doc_econets_pic_124.png

友情提示:

  • ① 如果值是【简单】的 String 或者 Integer 等类型,无需创建数据实体。
  • ② 如果值是【复杂对象】时,建议在 dal/dataobject 包下,创建对应的数据实体。

# 1.2.3 RedisKeyConstants

为什么要定义 Redis Key 常量?

每个 blossom-module-xxx 模块,都有一个 RedisKeyConstants 类,定义该模块的 Redis Key 的信息。目的是,避免 Redis Key 散落在 Service 业务代码中,像对待数据库的表一样,对待每个 Redis Key。通过这样的方式,如果我们想要了解一个模块的 Redis 的使用情况,只需要查看 RedisKeyConstants 类即可。

在 blossom-module-system 模块的 RedisKeyConstants (opens new window)类中,新建 OAuth2AccessTokenDO 对应的 Redis Key 定义 OAUTH2_ACCESS_TOKEN。

# 1.2.4 OAuth2AccessTokenRedisDAO

新建 OAuth2AccessTokenRedisDAO (opens new window)类,是 OAuth2AccessTokenDO 的 RedisDAO 实现。代码如下:

doc_econets_pic_125.png

# 1.2.5 OAuth2TokenServiceImpl

在 OAuth2TokenServiceImpl (opens new window)中,只要注入 OAuth2AccessTokenRedisDAO Bean,非常简洁干净的进行 OAuth2AccessTokenDO 的缓存操作,无需关心具体的实现。代码如下:

doc_econets_pic_126.png

# 2. 声明式缓存

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

相比来说 Spring Data Redis 编程式缓存,Spring Cache 声明式缓存的使用更加便利,一个 @Cacheable 注解即可实现缓存的功能。示例如下:

@Cacheable(value = "users", key = "#id")
UserDO getUserById(Integer id);

# 2.1 Spring Cache 配置

① 在 application.yaml (opens new window)配置文件中,通过 spring.redis 配置项,设置 Redis 的配置。如下图所示:

doc_econets_pic_127.png

② 在 CacheAutoConfiguration (opens new window)配置类,设置使用 JSON 序列化 value 值。如下图所示:

doc_econets_pic_128.png

# 2.2 常见注解

# 2.2.1 @Cacheable 注解

@Cacheable (opens new window)注解:添加在方法上,缓存方法的执行结果。执行过程如下:

  • 1)首先,判断方法执行结果的缓存。如果有,则直接返回该缓存结果。
  • 2)然后,执行方法,获得方法结果。
  • 3)之后,根据是否满足缓存的条件。如果满足,则缓存方法结果到缓存。
  • 4)最后,返回方法结果。

# 2.2.2 @CachePut 注解

@CachePut (opens new window)注解,添加在方法上,缓存方法的执行结果。不同于 @Cacheable 注解,它的执行过程如下:

  • 1)首先,执行方法,获得方法结果。也就是说,无论是否有缓存,都会执行方法。
  • 2)然后,根据是否满足缓存的条件。如果满足,则缓存方法结果到缓存。
  • 3)最后,返回方法结果。

# 2.2.3 @CacheEvict 注解

@CacheEvict (opens new window)注解,添加在方法上,删除缓存。

# 2.3 实战案例

在 RoleServiceImpl (opens new window)中,使用 Spring Cache 实现了 Role 角色缓存,采用【被动读】的方案。原因是:

doc_econets_pic_129.png

  • 【被动读】相对能够保证 Redis 与 MySQL 的一致性
  • 绝大数数据不需要放到 Redis 缓存中,采用【主动写】会将非必要的数据进行缓存

① 执行 #getRoleFromCache(...) 方法,从 MySQL 读取数据后,向 Redis 写入缓存。如下图所示:

doc_econets_pic_130.png

② 执行 #updateRole(...) 或 #deleteRole(...) 方法,在更新或者删除 MySQL 数据后,从 Redis 删除缓存。如下图所示:

doc_econets_pic_131.png

# 3. Redis 监控

blossom-module-infra 的 redis (opens new window)模块,提供了 Redis 监控的功能。

点击 [基础设施 -> Redis 监控] 菜单,可以查看到 Redis 的基础信息、命令统计、内存信息。如下图所示:

doc_econets_pic_132.png

上次更新: 2024/01/22, 14:52:20
多数据源(读写分离)
本地缓存

← 多数据源(读写分离) 本地缓存→

Theme by Vdoing | Copyright © 2019-2024 EcoNets Tech | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式