Spring Cache 集成 Redis 缓存

Last Modified: 2022/11/28

概述

本文介绍 spring cache 使用 redis 缓存的极简配置方法,你只要复制粘贴相关内容即可完成配置。另外 ORM 框架使用 mybatis plus,但这不是重点。配置分为以下几步:

  • 创建 spring web 项目;
  • 引入相关依赖;
  • Redis 配置和数据库基本配置;
  • 开启 spring cache;
  • 配置 CacheManager;
  • 使用 spring cache 注解。

注:Spring boot 版本是 2.7.6。

创建项目

直接使用 idea 创建一个 spring web 项目,这一步比较简单,如果有同学不知道,直接看这里的说明吧

引入依赖

由于我们需要使用 redis 缓存数据,因此引入 spring-boot-starter-data-redis。后面的两个是为了操作数据库而引入的,如果你的项目不使用 mybatis plus,可不必加入此依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

如果我们还想使用 mybatis plus 的代码生成器,我们可以引入:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>

以下是代码生成器的使用方法示例:

public static void main(String[] args) {
    String url = "jdbc:mysql://192.168.2.2/your_dbname?useUnicode=true&characterEncoding=utf-8";
    FastAutoGenerator.create(url, "user", "passwd")
        .globalConfig(builder -> {
            builder.author("verytools") // 设置作者
                    .dateType(DateType.TIME_PACK)
                    .fileOverride()
                    .outputDir("/path/to/code/output"); // 指定代码输出目录
        })
        .packageConfig(builder -> {
            // 生成的代码的包名为 c.yourpack.order
            builder.parent("c.yourpack") // 设置包名
                    .moduleName("order") // 设置模块名
                    .pathInfo(Collections.singletonMap(OutputFile.xml, "/path/to/mapper")); // 设置mapperXml生成路径
        })
        .strategyConfig(builder -> {
            builder.addInclude("some_table") // 设置需要生成的表名
                    .addTablePrefix("sys_"); // 设置过滤表前缀
        })
        .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
        .execute();
}

Redis 配置和数据库基本配置

在 application.properties 中加入以下配置,注意修改配置的值,按照实际情况修改。

spring.datasource.name=your_dbname
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.2.2/your_dbname?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

# redis config
spring.redis.port=6379
spring.redis.host=127.0.0.1
spring.redis.password=
spring.redis.database=4

开启 Spring Cache

@SpringBootApplication
@MapperScan("com.yourpack")
@EnableCaching
public class YourOwesomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourOwesomeApplication.class, args);
    }
}

开启 spring cache,只需要加上 @EnableCaching 即可。@MapperScan("com.yourowesome") 是扫描指定包路径下的 mybatis mapper 接口。

配置 CacheManager

CacheManager 是用来管理缓存的,一个项目可能会用到多个缓存,例如这里我们配置了两个缓存,名字分别为 yourCache1 和 yourCache2。他们都采用默认配置,唯一不同的是这两个缓存中 key 的过期时间不同,第一个过期时间是 10 分钟,第二个是 20 分钟。

@Configuration
public class CacheConfig {

    @Bean
    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
        return (builder) -> builder
                .withCacheConfiguration("yourCache1",
                        RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)))
                .withCacheConfiguration("yourCache2", 
                        RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(20)));
    }

}

使用 Spring Cache 注解

经过以上配置,我们就可以愉快的使用 spring cache 注解来完成数据的缓存了。

@Service
public class OrderService extends ServiceImpl<OrderMapper, Order> {

    @CacheEvict(allEntries = true, cacheNames = "yourCache1")
    public void deleteById(String id) {
        getBaseMapper().deleteById(id);
    }

    @Cacheable(cacheNames = "yourCache1")
    public List<Order> getList() {
        return getBaseMapper().selectList(null);
    }
}
有问题吗?点此反馈!

温馨提示:反馈需要登录