谷粒商城实战笔记-170~172-缓存-SpringCache

一,170-缓存-SpringCache-自定义缓存配置

上一节我们提到,@Cacheable的默认行为包括:

  • ① key是默认生成的:缓存的名字::SimpleKey::
  • ② 缓存的value值,默认使用jdk序列化机制,将序列化的数据存到redis中
  • ③ 默认时间是 -1,即永不过期

①可以通过@Cacheable注解的属性key自定义。

③可以通过配置文件设置过期时间。

本节将介绍如何修改key、value的序列化机制。

根据SpringBoot的原理,一定有一个类用来封装配置文件中的配置,Spring Cache的这个配置自动装配类是CacheAutoConfiguration,看这个类的源码,其加载了Redis的配置类RedisCacheConfiguration,这个类中使用了Spring Cache的配置创建RedisCacheManger类,这个类中实现了对Redis的读写操作。

根据源码可以看出,如果容器中有redisCacheConfiguration对象,就使用容器中的对象,否则就创建一个。

	private org.springframework.data.redis.cache.RedisCacheConfiguration determineConfiguration(
			CacheProperties cacheProperties,
			ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,
			ClassLoader classLoader) {
		return redisCacheConfiguration.getIfAvailable(() -> createConfiguration(cacheProperties, classLoader));
	}

默认是没有向容器中注入redisCacheConfiguration对象的,会创建一个,但是创建的对象中没有设置key和value的序列化器,会用默认的JDK序列化器。

所以,我们可以向容器中注入一个redisCacheConfiguration对象,在这个对象中设置JSON序列化器,在创建RedisCacheManger对象时,就会使用我们注入的对象,redis就会使用我们配置的json序列化。

所以,我们可以自定义一个配置类,向容器中注入redisCacheConfiguration对象,在创建这个对象时设置序列化方式。




@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class MyCacheConfig {

    // @Autowired
    // public CacheProperties cacheProperties;


    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        // config = config.entryTtl();
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();

        //将配置文件中所有的配置都生效
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }

}


在这段代码中,创建并向容器中注入了一个RedisCacheConfiguration对象。

这里需要注意,需要通过@EnableConfigurationProperties激活CacheProperties读取和封装配置文件中的配置。

@EnableConfigurationProperties 的作用

  • 激活自动绑定@EnableConfigurationProperties 注解告诉Spring框架去查找并激活一个或多个由 @ConfigurationProperties 标记的类,这些类可以用来绑定配置文件中的属性值。
  • 注册绑定类:它会将标记为 @ConfigurationProperties 的类注册为一个配置类,这样就可以直接在Spring容器中注入这些配置类的实例,并且它们会自动绑定到配置文件中的属性。

使用 CacheProperties 的两种方式

  1. 自动注入 (@Autowired):

    • 作用:使用 @Autowired 注入 CacheProperties 类的实例,这种方式可以直接在类的字段上使用,不需要额外的方法调用。
    • 示例
      @Autowired
      private CacheProperties cacheProperties;
      
  2. 作为方法参数

    • 作用:将 CacheProperties 作为方法参数传递,这种方式通常用于方法内部需要使用配置属性的情况。
    • 示例
      @Bean
      public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
          // ...
      }
      

二,171-缓存-SpringCache-@CacheEvict

Redis缓存保证最终一致性的失效模式,是在更新数据后将缓存中的数据删除,删除缓存数据可以通过@CacheEvict完成,结合@Caching可以删除多个缓存。

1,删除多个缓存

@Caching( evict = {
            @CacheEvict(value = {"category"}, key = "'getLevel1Categorys'"),
            @CacheEvict(value = {"category"}, key = "'catelogJson'")
        }
    )

在这里插入图片描述

2,删除一个缓存

@CacheEvict(value = {"category"}, key = "'getLevel1Categorys'")

在这里插入图片描述

三,172-缓存-SpringCache-原理与不足

对Redis缓存的三个问题:

  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩

SpringCache提供相应的解决方案:

  • 针对缓存穿透,可以设置控制缓存Spring.cache.redis.cache-null-values=true
  • 针对缓存雪崩,可以设置不同的过期时间来防止雪崩
  • 针对缓存击穿,Spring Cache提供了get方法的本地锁方案,没有分布式锁方案

所以,如果实时性要求高、数据一致性要求高,就不能使用Spring Cache,必须自己编写缓存相关的逻辑来实现分布式锁的方案。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用中提供的信息,谷粒商城是一个B2C模式的电商平台,主要销售自营商品给客户。B2C模式指的是商对客的模式,即商家直接向消费者销售商品和服务。谷粒商城使用微服务架构,这是一种将应用程序拆分成独立且可独立开发、部署和扩展的小型服务的架构。引用还提到谷粒商城的技术涵盖微服务架构、分布式、全栈、集群、部署和自动化运维等方面。 因此,从前慢-谷粒商城篇章6主要讨论的可能是谷粒商城的技术方面,包括微服务架构、分布式、全栈、集群、部署和自动化运维等内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [从前慢-谷粒商城篇章1](https://blog.csdn.net/m0_67391121/article/details/125383572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [2020年谷粒商城md笔记](https://download.csdn.net/download/ZHUXIUQINGIT/12543161)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值