创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度

前言

由于之前写的所有后端都没有进行过缓存操作,在结合前端已经app调试时,发现本地请求的响应都会很慢,所以现在结合redis对后端的请求进行一次缓存,提高执行的效率

关于SpringCache的学习

(1)SpringCache简介
Spring Cache是Spring框架提供的对缓存使用的抽象类,支持多种缓存,比如Redis、EHCache等,集成很方便。同时提供了多种注解来简化缓存的使用,可对方法进行缓存。
(2)关于SpringCache 注解的简单介绍

  • @Cacheable:标记在一个方法上,也可以标记在一个类上。主要是缓存标注对象的返回结果,标注在方法上缓存该方法的返回值,标注在类上,缓存该类所有的方法返回值。参数: value缓存名、 key缓存键值、 condition满足缓存条件、unless否决缓存条件
    创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度_第1张图片

  • @CacheEvict:从缓存中移除相应数据。
    创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度_第2张图片

  • @CachePut:方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
    创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度_第3张图片

  • @Caching:多个Cache注解使用,比如新增用户时,删除用户属性等需要删除或者更新多个缓存时,集合以上三个注解。

(3)SpEL上下文数据
Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:
创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度_第4张图片
(4)@EnableCaching 做了什么:

@EnableCaching 注释触发后置处理器, 检查每一个Spring bean 的 public 方法是否存在缓存注解。如果找到这样的一个注释, 自动创建一个代理拦截方法调用和处理相应的缓存行为。

(5)同步缓存
在多线程环境中,可能会出现相同的参数的请求并发调用方法的操作,默认情况下,spring cache 不会锁定任何东西,相同的值可能会被计算几次,这就违背了缓存的目的

对于这些特殊情况,可以使用sync属性。此时只有一个线程在处于计算,而其他线程则被阻塞,直到在缓存中更新条目为止。

@Cacheable(cacheNames="foos", sync=true) 

(6)条件缓存
condition: 什么情况缓存,condition = true 时缓存,反之不缓存
unless: 什么情况不缓存,unless = true 时不缓存,反之缓存

@Cacheable(cacheNames="book", condition="#name.length() < 32", unless="#result?.hardback")
public Optional<Book> findBook(String name)

springboot集成

之前项目已经使用过redis了,所以配置文件和依赖都已经有了
所以只需要添加一些配置就好了,比如超时,序列化的策略等等
需要将需要的缓存名称put到map中,这个缓存才能生效
创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度_第5张图片

/**
 * 有关redis的配置管理信息。
 */
@Configuration
@EnableCaching
public class RedisConfig implements Serializable {
    /**
     * 设置redis缓存过期时间
     */

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), this.getRedisCacheConfigurationWithTtl( 60), this.getRedisCacheConfigurationMap() // 指定 key 策略
        );
    }
    private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
        //SsoCache和BasicDataCache进行过期时间配置
       redisCacheConfigurationMap.put("userCache", this.getRedisCacheConfigurationWithTtl( 60));
        redisCacheConfigurationMap.put("articleCache", this.getRedisCacheConfigurationWithTtl( 60));
        redisCacheConfigurationMap.put("blogCache", this.getRedisCacheConfigurationWithTtl( 60));
        redisCacheConfigurationMap.put("tagCache", this.getRedisCacheConfigurationWithTtl( 60));
        redisCacheConfigurationMap.put("recordCache", this.getRedisCacheConfigurationWithTtl( 60));
        redisCacheConfigurationMap.put("subscriptionCache", this.getRedisCacheConfigurationWithTtl( 60));
        redisCacheConfigurationMap.put("portraitCache", this.getRedisCacheConfigurationWithTtl( 60));
        return redisCacheConfigurationMap;
    }

    private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {
        Jackson2JsonRedisSerializer<Object> 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);
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
                RedisSerializationContext
                        .SerializationPair
                        .fromSerializer(jackson2JsonRedisSerializer)
        ).entryTtl(Duration.ofSeconds(seconds));

        return redisCacheConfiguration;
    }


}

然后就是在controller层,对每个接口配置缓存的条件,然后实现数据的缓存操作。
在这里插入图片描述
不同的板块,根据配置重的缓存名,存入不同的key中
创新实训(35)——SpringBoot中使用 Spring Cache 集成 Redis进行缓存,提高响应速度_第6张图片
这里没有制定key,他会自动生成key

最后

我们用的是阿里云RDS提供的redis,加了缓存之后发现访问速度竟然更慢了?????

你可能感兴趣的:(项目实训)