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

news2024/11/25 18:37:48

文章目录

  • 一,170-缓存-SpringCache-自定义缓存配置
  • 二,171-缓存-SpringCache-@CacheEvict
    • 1,删除多个缓存
    • 2,删除一个缓存
  • 三,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,必须自己编写缓存相关的逻辑来实现分布式锁的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国对世界各国的进出口面板数据(2000-2022年)

中国作为全球最大的贸易国之一&#xff0c;其对各国的进出口数据不仅量级庞大&#xff0c;而且蕴含着丰富的经济信息与趋势动向&#xff0c;对于研究全球经济互动、国际贸易格局、产业链分布以及中国自身经济的发展策略具有一定价值。例如&#xff0c;近年来的数据表明&#xf…

对接的广告平台越多,APP广告变现的收益越高?

无论是游戏、社交、工具应用类APP还是泛娱乐类APP&#xff0c;流量变现的方式主要有广告、内购、订阅三种方式。其中&#xff0c;广告变现是门槛最低、适用最广的变现方式。 只要APP有流量&#xff0c;就可以进行广告变现&#xff0c;让APP的流量快速转化为商业价值。作为最常…

什么是张量

张量的基础概念 学习使用pytorc库进行深度学习网络搭建时&#xff0c;张量这个词总是不定时会出现。其实&#xff0c;Pytorch中的所有操作都是在张量的基础上进行的&#xff0c;今天就来了解张量到底是什么 由PyTorch官网官网介绍可知&#xff0c;一个Tensor是一个包含单一数据…

软件测试自学三个月,进了一家自研薪资11k,面试总结分享给大家

功能方面&#xff1a;问得最多的就是测试流程&#xff0c;测试计划包含哪些内容&#xff0c;公司人员配置&#xff0c;有bug开发认为不是 bug怎么处理&#xff0c;怎样才算是好的用例&#xff0c;测试用例设计方法&#xff08;等价类&#xff0c;边界值等概念方法&#xff09;&…

DVWA靶场配置相关问题解决

本文主要提到鄙人在DVWA配置过程中所遇到的问题&#xff0c;以及我的解决方式&#xff0c;希望会帮到大家&#xff01; 首先&#xff0c;我使用的是windows版本&#xff0c;运用的是小皮搭建&#xff0c;前期准备可参考&#xff1a;【靶场搭建】超级详细——DVWA靶场搭建&…

springboot美术馆管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发美术馆管理系统管理系统需要搭建的开发环境&#xff0c;还有美术馆管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 技术路线 在美术馆管理系统中常用的技术方案如下所展示&#xff1a; 针对已有的购物中心&#xff0c;系统结构为B…

ChatGPT:智能聊天机器人微信开发实战

简介 ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&#xff0c;可以在与好友对话中给出意想不到的回…

微信分享朋友圈单页面设置

需求:用户在朋友圈打开分享的小程序页面&#xff0c;并不会真正打开小程序&#xff0c;而是进入一个“小程序单页模式”的页面,需要自定义单页面样式 第一步:先读官方文档 分享到朋友圈 | 微信开放文档 由官方文档可知,当进入单页面会返回一个场景值1154,判断如果是1154就展示…

利用腾讯云AI代码助手优化图书馆管理系统

引言 在当今信息爆炸的时代&#xff0c;软件开发已成为推动社会进步和科技发展的重要力量。随着项目规模的扩大和复杂性的提升&#xff0c;我们开发者在编程过程中面临着越来越多的挑战。代码编写的效率、准确性和规范性&#xff0c;直接关系到项目的成功与否。为了应对这些挑…

开机就能打?没那么玄乎!客观分析 “狂躁许可”漏洞(CVE-2024-38077)及其影响范围

一、事件背景 2024年7月9日&#xff0c;微软官方发布了一个针对“windows远程桌面授权服务远程代码执行漏洞”&#xff08;CVE-2024-38077&#xff09;的修复补丁包&#xff0c;起初并没有引起大家的警觉。今日在国外某网站上疑似漏洞的作者公开了该漏洞的“POC验证代码”。一…

无法判断编程器固件类型

按照简书上指导把小米路由器4C刷机了OpenWrt&#xff0c;玩个新鲜&#xff0c;看看都有什么功能&#xff0c;确实挺强大&#xff0c;能做很多事&#xff0c;但是不稳定&#xff0c;又想刷回去&#xff0c;结果卡在上传步骤&#xff0c;报错&#xff0c;提示“无法判断编程器固件…

解决 Kibana 中的 “Invalid character in header content” 错误

在使用 Kibana 进行数据可视化和分析的过程中&#xff0c;我们可能会遇到一些配置相关的问题。本文将介绍一个常见的错误&#xff1a;“Invalid character in header content”&#xff0c;并提供详细的解决步骤。 问题背景 当启动 Kibana 服务时&#xff0c;如果遇到以下错误…

【三维重建】Pixel-GS:三维高斯泼溅的像素感知的梯度密度控制(去除浮点,提升精度)

项目&#xff1a;https://pixelgs.github.io/ 标题&#xff1a;Pixel-GS: Density Control with Pixel-aware Gradient for 3D Gaussian Splatting 来源&#xff1a;香港大学&#xff1b;腾讯AI Lab 文章目录 摘要一、前言二、相关工作1.新视图合成2.基于点的辐射场3.Floater 的…

MFC系列-改变控件字体和颜色

【1】在资源管理器中&#xff0c;选择对话框&#xff0c;右键选择类向导&#xff0c;消息中选择WM_CTLCOLOR HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);//if (nCtlColor CTLCOLOR_STATIC) …

Postgres 超时 (Timeout) 详解

原文地址 https://www.bytebase.com/blog/postgres-timeout/ PostgreSQL 提供各种超时 (Timeout) 设置&#xff0c;通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要&#xff0c;尤其是在高流量或复杂查询的环境中。让我们…

脱胎于 S 语言的R语言,它何为成为各行业数据分析师的首选?

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 1章3节&#xff1a;R 语言的产生与发展轨迹&#xff08;更新2024/08/14&#xff09;-C…

积木报表导出数据量太大报错

积木报表导出数据量太大报错问题处理 问题背景解决方案运行结果关键代码 问题背景 积木报表在导出大量数据时可能会遇到报错‌&#xff0c;‌这通常是由于数据量大导致的性能问题或数据处理方式不当引起的。‌以下是一些可能导致报错的原因及相应的解决方法&#xff1a;‌ …

Redis13-多级缓存

目录 概述 JVM进程缓存 Caffeine 实现进程缓存 Lua语法 初识Lua 变量和循环 Lua的数据类型 声明变量 循环 条件控制、函数 函数 条件控制 实现多级缓存 安装OpenResty OpenResty快速入门 请求参数处理 查询Tomcat 发送http请求的API 封装http工具 CJSON工…

传感器灯光与避障系统的详细作用!

传感器灯光 视觉指示&#xff1a;传感器灯光为无人机提供了直观的视觉指示&#xff0c;帮助飞行员或地面操作人员清晰地识别无人机的飞行状态、方向和位置。 通信与警示&#xff1a;通过特定的灯光颜色和闪烁模式&#xff0c;传感器灯光能够传达无人机的特定状态或警告信息&a…

Gato:A Generalist Agent

发表时间&#xff1a;11 Nov 2022 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4689785740490440705&noteId2412686834489472512 作者单位&#xff1a;DeepMind 前言&#xff1a;近日&#xff0c;DeepMind发布了文章《A Generalist Agent》&#…