SpringBoot 缓存 – Redis

引入依赖

<!-- 引入缓存 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 引入redis -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

缓存配置

spring:  
  redis:    # 配置REDIS 信息
    host: 127.0.0.1  # 配置 redis host
    port: 6379  # 配置 redis 端口
    lettuce:   # 配置 lettuce 连接池
      pool:
        max-active: 10   # 最大连接数
        max-idle: 10   # 连接池最大空闲连接
        min-idle: 1  # 连接池最小空闲连接
  cache:
    type: REDIS   # 配置缓存使用redis

启用缓存

修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:

@SpringBootApplication
@EnableCaching
public class CacheApplication {
		
  	@Bean
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }

}

配置缓存类

新建Redis缓存配置类RedisConfig,如下:

@Configuration
public class RedisConfig {
		
    // 缓存管理器
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory){
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
    }
}

添加缓存@Cacheable

@Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并将结果进行缓存。案例如下:

@Cacheable(value = "student", key = "#id")  // 设置缓存
public Student getById(Long id) {
    Student student = studentMapper.selectById(id);
    return student;
}

然后我们可以到Redis客户端中查看是否缓存数据成功到Redis中,如下:

SpringBoot 缓存 - Redis

根据Redis中存储的数据,说明缓存信息已经成功存进了redis中。

@Cacheable解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {

    // 为缓存进行命名,类似于命名空间,与value二选一
    @AliasFor("cacheNames")
    String[] value() default {};

    // 为缓存进行命名,类似于命名空间,与cacheNames二选一
    @AliasFor("value")
    String[] cacheNames() default {};

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作,可以为空,如果指定要按照 		// SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
    String key() default "";

		// key的生成器,为缓存指定一个主键,后续可根据主键进行操作
    String keyGenerator() default "";

    // 指定缓存管理器
    String cacheManager() default "";
    
    // 指定缓存获取解析器
    String cacheResolver() default "";

    // 条件判定,如果条件为真则进行缓存
    String condition() default "";
    
    // 条件判定,条件符合则不缓存
    String unless() default "";
    
    // 是否使用异步模式
    boolean sync() default false;
}

缓存更新@CachePut

@CachePut注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用 。简单来说就是用户更新缓存数据。但需要注意的是该注解的valuekey 必须与要更新的缓存相同,也就是与@Cacheable 相同。

@CachePut(value = "student", key = "#student.id")  // 更新缓存
public Student updateStudent(Student student) {
   studentMapper.updateById(student);
   return student;
}

@CachePut解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {
  
    // 为缓存进行命名,类似于命名空间,与value二选一
    @AliasFor("cacheNames")
    String[] value() default {};

    // 为缓存进行命名,类似于命名空间,与cacheNames二选一
    @AliasFor("value")
    String[] cacheNames() default {};

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作,可以为空,如果指定要按照    SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
    String key() default "";

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作
    String keyGenerator() default "";

   // 指定缓存管理器
    String cacheManager() default "";
    
    // 指定缓存获取解析器
    String cacheResolver() default "";
  
    // 条件判定,如果条件为真则进行缓存
    String condition() default "";

    // 条件判定,条件符合则不缓存
    String unless() default "";
}

缓存清除@CacheEvict

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 。

// 清除一条缓存,key为要清空的数据
@CacheEvict(value = "student", key = "#id")
public void delStudent(Long id){
  System.out.println("进行缓存清除操作");
}

//方法调用前清空所有缓存
@CacheEvict(value = "student", beforeInvocation = true)
public void delBefore() {
  System.out.println("方法调用前清空所有缓存");
}

//方法调用后清空所有缓存
@CacheEvict(value = "student", allEntries = true)
public void delAfter() {
  System.out.println("方法调用后清空所有缓存");
}

@CacheEvict解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
  
    // 为缓存进行命名,类似于命名空间,与cacheNames二选一
    @AliasFor("cacheNames")
    String[] value() default {};
  
    // 为缓存进行命名,类似于命名空间,与value二选一
    @AliasFor("value")
    String[] cacheNames() default {};

  	// key的生成器,为缓存指定一个主键,后续可根据主键进行操作,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
    String key() default "";

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作
    String keyGenerator() default "";

    // 指定缓存管理器
    String cacheManager() default "";

    // 指定缓存获取解析器
    String cacheResolver() default "";
  
    // 条件判定,如果条件为真则进行缓存
    String condition() default "";

    // 是否清空所有缓存,默认为false,如果指定为true,则在方法调用后将立即清空所有缓存
    boolean allEntries() default false;
    
    // 是否在方法执行前就清空,默认为false,如果指定为true
    boolean beforeInvocation() default false;
}

@CacheConfig 配置

当我们需要缓存的地方越来越多,你可以使用@CacheConfig(cacheNames = {"myCache"})注解来统一指定value的值,这时可省略value,如果你在你的方法依旧写上了value,那么依然以方法的value值为准。

@Service
@CacheConfig(cacheNames = {"student"})
public class CacheServiceImpl implements CacheService {


    @Resource
    private StudentMapper studentMapper;

    @Override
    @Cacheable(key = "#id")  // 设置缓存,此时没有设置value值
    public Student getById(Long id) {
        Student student = studentMapper.selectById(id);
        return student;
    }
}

@CacheConfig解析

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
  
    // 为缓存进行命名,类似于命名空间
    String[] cacheNames() default {};

    // key生成器
    String keyGenerator() default "";

    // 指定缓存管理器
    String cacheManager() default "";

    // 指定缓存获取解析器
    String cacheResolver() default "";
}

组合@Caching

有时候我们可能组合多个Cache注解使用,此时就需要@Caching组合多个注解标签了。

@Caching(
    cacheable = {
      @Cacheable(value = "student", key = "#id")
    },
    put = {
      @CachePut(value = "student", key="#id")
    },
    evict = {
      @CacheEvict(value = "student", key="#id")
    }
)
public Student cacheGroup(Long id) {
  return null;
}

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/502

Previous 2023年4月23日
Next 2023年4月23日

相关推荐

  • SpringBoot 打包

    SpringBoot 项目部署到服务器常见的方式就是,打包成 jar 包,通过 nohup java -jar 命令去运行项目,这也是官方推荐的一种方式。 导入依赖 打包 设置打包…

    springboot 2023年4月5日
    148
  • SpringBoot 整合Log4j2日志框架

    简介 Apache Log4j 2是日志框架Log4j的升级,它比其前身Log4j 1.x提供了重要的改进, 并且参考了Logback中许多有用的改进,同时修复了Logback的一…

    springboot 2023年3月26日
    153
  • SpringBoot 缓存

    简介 缓存主要是为了提高数据的读取速度。 因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大…

    springboot 2023年4月23日
    133
  • SpringBoot 单元测试

    简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter…

    springboot 2023年4月2日
    242
  • SpringBoot 全局异常统一处理

    前言 在实际的项目开发过程中,会有大量的异常发生,而我们并不能将异常信息反馈到用户,所以在返回结果的时候需要对异常进行处理,可是如果在每个Controller返回结果都需要进行异常…

    springboot 2023年4月29日
    125
  • SpringBoot 整合Druid数据源

    简介 Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能。 优点 引入依赖 这里使用的是SpringBoot整合版的Dru…

    2023年3月26日
    168
  • SpringBoot自定义注解与使用

    简介 注解是一种能添加到Java代码中的元数据,方法,类,参数与包都可以使用注解进行修饰,可以将注解看为一种特殊的标记,在Java编译或运行过程中将有这种特殊标记的部分进行特殊处理…

    springboot 2024年1月25日
    254
  • SpringBoot 整合Redis

    添加依赖 在pom.xml文件添加redis的依赖,如下: 配置 在application.yml文件中添加Redis相关的配置项,如下所示: 案例 1、字符串元素 2、List元…

    springboot 2023年3月26日
    121
  • SpringBoot 整合Memcached

    简介 Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached…

    springboot 2023年4月24日
    242
  • Springboot 注解 @Resource

    作用 和@Autowired注解类似,也是用来注入依赖对象的,spring容器会对bean中所有的字段、方法进行遍历,标注有@Resouce注解的,都会进行注入。@Autowire…

    springboot 2022年9月14日
    269