@EnableCaching、@Cacheable的介绍,及Redis在SpringBoot中的使用教程

这篇具有很好参考价值的文章主要介绍了@EnableCaching、@Cacheable的介绍,及Redis在SpringBoot中的使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、@EnableCaching、@Cacheable的介绍

首先说明这两个注解都是spring提供的,可以结合不同的缓存技术使用。(这里将顺便结合Redis进行讲解)

1.1 @EnableCaching

@EnableCaching是开启缓存功能,作用于缓存配置类上或者作用于springboot启动类上。

1.2 @Cacheable

@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。如果缓存过期,则重新执行。
注解常用的几个属性:

  • cacheNames/value :用来指定缓存组件的名字
  • key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来编写)
  • keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用
  • cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。
  • condition :可以用来指定符合条件的情况下才缓存
  • unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过#result 获取方法结果)
  • sync :是否使用异步模式。

2、Redis在SpringBoot中的使用教程

2.1 Redis的配置类

@EnableCaching   //开启缓存功能,作用于缓存配置类上或者作用于springboot启动类上
@Configuration
public class RedisConfig {


    /**
     * 创建一个RedisTemplate实例,用于操作Redis数据库。
     * 其中,redisTemplate是一个泛型为<String, Object>的模板对象,可以存储键值对数据;
     * @param factory   factory是一个Redis连接工厂对象,用于建立与Redis服务器的连接
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();

        //创建一个字符串序列化器对象,用于将字符串类型的数据转换成二进制格式存储到Redis中。
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();

        //创建一个字符串序列化器对象,用于将字符串类型的数据转换成二进制格式存储到Redis中。
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //创建一个字符串序列化器对象,用于将字符串类型的数据转换成二进制格式存储到Redis中。
        ObjectMapper om = new ObjectMapper();

        //设置ObjectMapper对象的属性访问器可见性,使其能够访问所有的属性。
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        //启用默认类型识别,避免在序列化过程中出现类型错误。
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        //将ObjectMapper对象设置为JSON序列化器的属性访问器。
        jackson2JsonRedisSerializer.setObjectMapper(om);

        //将ObjectMapper对象设置为JSON序列化器的属性访问器。
        template.setConnectionFactory(factory);

        //key序列化方式,将ObjectMapper对象设置为JSON序列化器的属性访问器。
        template.setKeySerializer(redisSerializer);

        //value序列化,将ObjectMapper对象设置为JSON序列化器的属性访问器。
        template.setValueSerializer(jackson2JsonRedisSerializer);

        //value hashmap序列化,将ObjectMapper对象设置为JSON序列化器的属性访问器。
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    /**
     *  创建一个CacheManager实例,用于管理缓存。
     *  其中,cacheManager是一个缓存管理器对象,用于管理缓存的生命周期和策略等;
     * @param factory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {

        //第一个序列化器用于将字符串类型的数据转换为二进制格式,第二个序列化器用于将Java对象序列化为JSON格式。
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                //禁用缓存空值
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

2.2 测试实体类及Controller类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class People {
    private String name;
    private int age;
}
@RestController
@RequestMapping("cache")
public class Demo2OfCacheController {

    @GetMapping("/getById/{id}")
    @Cacheable("people")   //存储在Redis中的键为people::id   例如 people::111
    public People getById(@PathVariable("id") String id) {
        return new People("lisi", 23);
    }
}

2.3 进行测试

直接访问
@enablecaching,spring boot,redis,spring
执行完getById方法返回数据之后,@Cacheable将会将返回结果保存到Redis中去,key为eople::id,value为所返回的People对象结果。
下次执行该方法时就会先根据key去Redis中查找,如果有直接返回,没有再进行方法的执行。
@enablecaching,spring boot,redis,spring

3、@Cacheable注解的进阶使用

3.1 定义多个缓存名存多份

@RestController
@RequestMapping("/cache")
public class Demo2OfCacheController {

    @GetMapping("/getPeopleById/{id}")
    @Cacheable({"people01","people02"})
    public People getPeopleById(@PathVariable("id") String id) {
        return new People("lisi", 23);
    }
}

@enablecaching,spring boot,redis,spring

3.2 自定义key参数

默认的key拼串并不是很友好,调用的方法只有一个参数时,会自动使用@Cacheable(“student00”)中设置的student00 + :: + 传入参数;当多个参数时:

@RestController
@RequestMapping("/cache")
public class Demo2OfCacheController {

    @GetMapping("/getByIdAndName/{id}/{name}")
    //组成的key为 people03::id-name:111-lisi
    @Cacheable(value = "people03", key = "'id-name:' + #id + '-' + #name")
    public People getByIdAndName(@PathVariable("id") String id, 
                                 @PathVariable("name") String name) {
        return new People("lisi", 23);
    }
}

@enablecaching,spring boot,redis,spring
@enablecaching,spring boot,redis,spring

3.3 条件判断

可加入缓存判断条件,对方法传入参数进行判断,满足条件则执行缓存查询;不满足条件则直接把该方法当作普通方法使用,不会进行缓存判断,也不会把结果放近缓存。
condition = “#id > 1” //只有id>1才走缓存

3.4 是否使用异步模式

@Cacheable()中可加入sync = true/false属性,
是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的结果存在缓存中。

3.5 设置过期时间

默认Cacheable使用公用的RedisCacheManager,可以自定义RedisCacheManager来实现ttl设置
PS:项目中已配置了RedisCacheManager需要在原配置的bean上添加注解**@Primary**,以免造成干扰
使用时使用cacheManager = "xxxCacheManager"进行使用文章来源地址https://www.toymoban.com/news/detail-819916.html

到了这里,关于@EnableCaching、@Cacheable的介绍,及Redis在SpringBoot中的使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在 SpringBoot中的WebSocket使用介绍

    在 Spring Boot 中,WebSocket 是一种非常有用的通信协议。WebSocket 可以使客户端和服务器之间实现双向通信,而不是传统的单向 HTTP 请求和响应。本文将介绍在 Spring Boot 中如何使用 WebSocket。 添加依赖 在 pom.xml 文件中添加以下依赖: 创建 WebSocket 配置类 创建一个 WebSocketConfig 类,

    2024年01月19日
    浏览(33)
  • SpringBoot的Cacheable缓存注解

    当我们的应用程序需要频繁地读取和写入数据时,为了提高应用程序的性能,我们通常会使用缓存技术。Spring Boot 提供了一种简单而强大的缓存框架,它可以轻松地将数据缓存到 Redis 中。 在 Spring Boot 中可以在方法上简单的加上注解实现缓存。 首先,您需要在您的项目中添加

    2024年02月10日
    浏览(42)
  • SpringBoot通过@Cacheable注解实现缓存功能

    Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107) 注解简化我们的开发。 其使用方法和原理都类似于 Spring 对事务管理的支持,Spring Cache 是作用在方法上的,其核

    2024年02月10日
    浏览(39)
  • Spring Boot 中的 @Cacheable 注解

    在 Spring Boot 中,缓存是一个非常重要的话题。当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。为了实现缓存,Spring Boot 提供了一些缓存注解,其中最常用的是 @Cacheable 注解。 @Cacheable 注解用于标记一个方法需要被缓存

    2024年02月12日
    浏览(59)
  • 一文掌握SpringBoot注解之@Cacheable 知识文集(1)

    🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论⭐收藏 🔎 SpringBoot 领域知识 🔎 链接 专栏 SpringBoot 专业知识学习一 SpringBoot专栏 Sprin

    2024年01月20日
    浏览(44)
  • 【springboot】缓存之@Cacheable、@CachePut、@CacheEvict的用法

    一、注解参数说明 1.1 属性说明 1.1.1 value/cacheNames 属性 1.这两个属性代表的意义相同 2.用来指定缓存组件的名称,将方法的返回结果存进缓存的名称 3.定义为数组时,可以存到多个缓存key中 1.1.2 key属性 1.指定缓存数据的key 2.redis作为缓存时,redis中的key为value::key 3.方法没有参

    2024年02月06日
    浏览(55)
  • Spring 中的 @Cacheable 缓存注解,太好用了!

    第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。 对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程是先要从磁盘拿到数据,再刷新到内存,再返回数据。磁

    2024年02月16日
    浏览(38)
  • SpringBoot缓存注解@Cacheable之自定义key策略及缓存失效时间指定

    1. 项目依赖 本项目借助 SpringBoot 2.2.1.RELEASE  +  maven 3.5.3  +  IDEA  +  redis5.0 进行开发 开一个 web 服务用于测试 1. key 生成策略 对于 @Cacheable 注解,有两个参数用于组装缓存的 key cacheNames/value: 类似于缓存前缀 key: SpEL 表达式,通常根据传参来生成最终的缓存 key 默认的 redisK

    2024年02月19日
    浏览(39)
  • Redis在SpringBoot中的简单应用

    1 redis的由来:         Salvatore • Sam Philippe对于公司的系统的性能不满意,亲手撸了一个缓存数据库,旨在提高其性能,就是现在的redis。 2 简单介绍: redis是一个间于后端和数据库之间的一层缓存,作为基于内存的数据库使用。 具有灵活和多实现方式的特点 3 redis解决的问

    2024年02月06日
    浏览(28)
  • 【Redis】Redis 的学习教程(五)之 SpringBoot 集成 Redis

    在前几篇文章中,我们详细介绍了 Redis 的一些功能特性以及主流的 java 客户端 api 使用方法。 在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几个使用 Redis 经常用到的功能: 分布式缓

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包