spring cache (ehcache方式)

news2024/11/25 4:57:46

目录

  • 前置
  • pom: jar
  • 配置文件:
    • ehcache.xml
    • application.yml
  • MyEhCacheCacheConfiguration.java
  • 效果图
    • 禁用 MyEhCacheCacheConfiguration.java
    • 启用 MyEhCacheCacheConfiguration.java


前置

会演示springcache的使用方式
项目地址: https://gitee.com/xmaxm/test-code/blob/master/chaim-cache/chaim-spring-cache/chaim-spring-cache-ehcache/README.md

前置配置

本篇文章是基于上篇文章进行: spring cache (默认方式)

强调:

在追踪源码的时候发现, 是通过注入ehCacheCacheManager进行文件的初始化, 当然解析xml文件也是该地方开始. 也就有了MyEhCacheCacheConfiguration,java方法. 大致思路同源码一致, 只是对获取的数据进行拦截, 增加部分数据, 进行一遍赋值操作

源码部分
spring cache (默认方式) 一致, 只是实现缓存的方式不一样

关键类: org.springframework.cache.Cache
org.springframework.cache.interceptor.CacheInterceptor#invoke
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
实现类: org.springframework.cache.ehcache.EhCacheCache

相关缓存文章

spring cache (默认方式)
spring cache (Redis方式)
spring cache (ehcache方式)


pom: jar

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache</artifactId>
</dependency>

<dependency>
	<groupId>javax.cache</groupId>
	<artifactId>cache-api</artifactId>
</dependency>

<!-- 反射工具包 -->
<dependency>
	<groupId>org.reflections</groupId>
	<artifactId>reflections</artifactId>
	<version>0.9.10</version>
</dependency>

配置文件:

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">

    <!-- 磁盘缓存位置
    path属性可以配置的目录有:
    user.home(用户的家目录)
    user.dir(用户当前的工作目录)
    java.io.tmpdir(默认的临时目录)
    ehcache.disk.store.dir(ehcache的配置目录)
    绝对路径(如:d:\\ehcache)
    -->
    <diskStore path="F:\upload\EhCache"/>

    <!--
        name:缓存名称。
        maxElementsInMemory:缓存最大个数。
        eternal:对象是否永久有效,一但设置了,timeout将不起作用。
        timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
        timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
        overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
        diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
        maxElementsOnDisk:硬盘最大缓存个数。
        diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
        diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
        memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
        clearOnFlush:内存数量最大时是否清除。
    -->


    <!-- 默认缓存 -->
    <defaultCache
            eternal="true"
            maxElementsInMemory="1000"
            overflowToDisk="false"
            diskPersistent="true"
            timeToIdleSeconds="0"
            timeToLiveSeconds="0"
            memoryStoreEvictionPolicy="LRU"/>

    <!-- 自定义缓存 name需与 @Cacheable(value = "selectById")的value值一直 -->
    <!-- 如果想自定义就需要在此地方依次罗列, 参考: MyEhCacheCacheConfiguration.java -->
    <cache
            name="CUSTOMIZE_GLOBAL"
            eternal="true"
            maxElementsInMemory="1000"
            overflowToDisk="false"
            diskPersistent="true"
            timeToIdleSeconds="0"
            timeToLiveSeconds="0"
            memoryStoreEvictionPolicy="LRU"/>


</ehcache>

application.yml

spring:
  cache:
    # 程序启动时创建的缓存名称
    cache-names: chaim-name
    # 缓存类型 org.springframework.boot.autoconfigure.cache.CacheType
    type: ehcache
    ehcache:
      config: classpath:ehcache.xml


MyEhCacheCacheConfiguration.java

package com.chaim.spring.cache.ehcache.config;

import net.sf.ehcache.CacheManager;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.Configuration;
import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.ehcache.EhCacheManagerUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author Chaim
 * @date 2022/9/23 0:11
 */
@Component
@Primary
public class MyEhCacheCacheConfiguration {
    /**
     * 固定 ehcache.xml 中 cache标签name值为: CACHE_NAME 就进行全局配置
     */
    private static final String CACHE_NAME = "CUSTOMIZE_GLOBAL";
    /**
     * 要扫描注解的包路径
     */
    private static final String PACKAGE_NAME = "com.chaim.spring.cache.ehcache.controller";

    /**
     * 重写 org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration#ehCacheCacheManager
     * 实现: 多 cache 标签自动添加
     *
     * @param cacheProperties
     * @return
     */
    @Bean
    CacheManager ehCacheCacheManager(CacheProperties cacheProperties) {
        Resource location = cacheProperties.resolveConfigLocation(cacheProperties.getEhcache().getConfig());
        if (location != null) {
            // 源码: 从给定资源中解析 EhCache 配置,以供进一步使用
            Configuration configuration = EhCacheManagerUtils.parseConfiguration(location);
            // 对获取的 ehcache 资源进行重写
            Map<String, CacheConfiguration> cacheConfigurations = configuration.getCacheConfigurations();
            // 校验其是否是全局标签 (配置该标签, 就标记需要缓存的都是此一个文件进行加载)
            CacheConfiguration cacheConfiguration = cacheConfigurations.get(CACHE_NAME);
            if (cacheConfiguration != null) {
                // 获取指定路径下的 @Cacheable 的 value 值, 也就是需要进行创建的缓存文件名
                Set<String> allCacheableValue = this.getAllCacheableValue();
                allCacheableValue.forEach(key -> {
                    if (cacheConfigurations.get(key) == null) {
                        // 对象克隆, 该处涉及深浅拷贝
                        CacheConfiguration clone = cacheConfiguration.clone();
                        // 修改缓存文件名为 @Cacheable 的 value 值
                        clone.name(key);
                        // 将需要的值 PUT 进入 CacheConfiguration, 对应的cache标签值除name其余不变
                        cacheConfigurations.put(key, clone);
                    }
                });
                // 移除全局配置配置文件, 避免创建该文件无效
                cacheConfigurations.remove(CACHE_NAME);
            }
            // 源码: 返回CacheManager
            return new CacheManager(configuration);
        }
        return EhCacheManagerUtils.buildCacheManager();
    }

    /**
     * 获取指定路径下所有 Cacheable 的 value 值
     *
     * @return Cacheable -> value
     */
    private Set<String> getAllCacheableValue() {
        Set<String> set = new HashSet<>();

        // 要扫描的包
        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
                .addUrls(ClasspathHelper.forPackage(PACKAGE_NAME))
                .addScanners(new MethodAnnotationsScanner());
        Reflections ref = new Reflections(configurationBuilder);

        // 获取扫描到的标记注解的集合
        Set<Method> methodsAnnotatedWith = ref.getMethodsAnnotatedWith(Cacheable.class);
        for (Method method : methodsAnnotatedWith) {
            Cacheable cacheable = method.getAnnotation(Cacheable.class);
            String[] value = cacheable.value();
            set.addAll(Arrays.asList(value));
        }
        return set;
    }
}

效果图

禁用 MyEhCacheCacheConfiguration.java

在这里插入图片描述


启用 MyEhCacheCacheConfiguration.java

在这里插入图片描述

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

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

相关文章

第五章 神经网络(上)

5.1 神经元模型 神经网络目前使用的最广泛的定义为“神经网络是由具有适应性的简单单元组成的广泛并行互联的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。神经网络中最基本的成分是神经元模型&#xff0c;即上述定义的简单单元。 在生物神经…

离线安装Redis集群(redis-6.2.4)

记录&#xff1a;326 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用redis-6.2.4版本&#xff0c;在三台机器上&#xff0c;离线安装Redis集群。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 Redis版本&#xff1a;redis-6.2.4 1.主机规划 目标&#xff…

物联网僵尸网络再次发起大规模攻击事件回顾

执行摘要 随着物联网的不断发展&#xff0c;物联网安全也被越来越多的人所关注。我们于 2016 年发布《物联网安全 白皮书》&#xff0c;进行物联网安全的科普介绍&#xff1b;于 2017 年发布《2017 物联网安全年报》&#xff0c;关注物联网资产 在互联网上的暴露情况、物联网设…

预训练模型相对位置编码和绝对位置编码的通俗理解

1 transformer最经典的理解&#xff1a; http://jalammar.github.io/illustrated-transformer/ 2 位置编码 相对位置编码(relative position representation)&#xff1a;https://zhuanlan.zhihu.com/p/397269153 Transformer中的相对位置编码(Relative Position Embedding)…

基于物联网的花卉养殖监控设计系统与研究

目 录 1、绪论 1 1.1课题背景 1 1.2 本课题研究意义 2 2、 系统总体方案设计 3 2.1、传感器部分 3 2.2、主控制部分 4 3、系统硬件设计 6 3.1 STC89C52RC单片机主控模块设计 6 3.2单片机最小系统 9 3.2.1时钟电路 9 3.2.2复位电路 10 3.2.3 STC89C52RC中断技术概述 10 3.3 温度…

基于最小误差阈值法的特定医学图像分割算法研究-含Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、阈值分割原理✳️ 三、最小误差阈值法✳️ 四、基于最小误差阈值法图像分割的实验分析✳️ 4.1 图像分割结果✳️ 4.2 边缘曲线提取结果✳️ 五、参考文献✳️ 六、Matlab代码获取✳️ 一、引言 图像是人们所熟悉的&#xff0c;但是图像…

服务器稳定性测试-LTP压力测试方法及工具下载

简介 LTP&#xff08;LinuxTest Project&#xff09;是SGI、IBM、OSDL和Bull合作的项目&#xff0c;目的是为开源社区提供一个测试套件&#xff0c;用来验证Linux系统可靠性、健壮性和稳定性。LTP测试套件是测试Linux内核和内核相关特性的工具的集合。 该工具的目的是通过把测…

【HMS Core】构建SplitBill应用集成多个HMS Core服务,助力您更好的了解华为生态组成

一、介绍 Duration: 3:00 总览 通过构建本次的SplitBill应用&#xff0c;您可以更好地了解华为生态的组成部分&#xff0c;包括认证服务、云存储和云数据库等Serverless服务。此外您还可以了解如何使用近距离数据通信服务的Nearby Connection功能分享文件。无需使用现金&…

重回synchronized(源码解读与实战解析篇)

读前必知 文中锁&#xff0c;也称为对象锁&#xff0c;而锁对象就是指的承载这个锁的对象&#xff0c;如下面&#xff0c;用法中所指的Object o&#xff0c;在print3中就是锁对象。 以下源码分析仅适用于jdk8&#xff0c;版本未知&#xff0c;因为源码提供者的源码版本访问地址…

金仓数据库KingbaseES GIN 索引

目录 一、索引的逻辑结构 二、索引的物理结构 三、GIN索引使用例子 1、前后模糊查询 2、全文检索 四、gin 索引可用于超长的字段 GIN(Generalized Inverted Index, 通用倒排索引) 是一个存储对(key, posting list)集合的索引结构&#xff0c;其中key是一个键值&#xff0c…

【uniapp】利用Vuex实现购物车功能

实战项目名称&#xff1a;实现购物车功能 文章目录一、实战步骤1. 先编辑store.js文件2. 定义方法和基本的结构3. 编写SETSHPPING二、在项目中调用1. 触发相应的mutations2. 利用computed计算数量和总价的方法提示&#xff1a;本实战内容大部分为具体实现的思路&#xff0c;界面…

C语言 2 —— 常量

常量是什么&#xff1f; 常量就是在程序运行过程中&#xff0c;值不会发生改变&#xff0c;而且一眼可以辨识出值的量。 如&#xff1a; 20&#xff0c;‘a’ , 3.1415926 , "helloworld" 常量的分类&#xff1a; 整形&#xff0c;浮点型&#xff0c;字符型&#…

成电860考研专业课考前划重点-学长课程音频转文字-用科大讯飞花钱买的-三万五千字

成电860考研专业课考前划重点-学长课程音频转文字。 这个是我2021年把视频的音频扒下来后用科大讯飞音频转文字网站上花了几十块钱买的。 说话人1 03:04 对有回放&#xff0c;我这边开回放了&#xff0c;大家可以让大家下载&#xff0c;然后我怕这边回放有问题&#xff0c;大家…

Airtest poco 入门小结

目录 一、poco介绍 1、poco能做什么 2、三种定位方式 1&#xff09;基本选择器 2&#xff09;相对选择器 3&#xff09;空间顺序选择器 4&#xff09;正则表达式方式 3、poco支持平台 二、Airtest介绍 1、Airtest能做什么 2、Airtest不能做什么 3、Airtest的图像识别…

发挥数字化平台优势,电子元器件采购商城系统助力企业改变固有低效流程

我国是全球最大的电子元器件生产国&#xff0c;电子元器件在国民经济发展中占据着重要地位。近年来&#xff0c;随着数字经济的快速发展&#xff0c;电子元器件的需求量也在不断升高&#xff0c;但疫情与国际环境对电子元器件产业要素流通仍然造成了一定困扰。在此背景下&#…

win10系统下使用onnxruntime部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、mainwindow.h3、mainwindow.cpp四、YOLO 类封装1、yolov5.h2、yolov5.cpp3、class.names五、效果前言 上一篇介绍过使用opencv-dnn模块实现模型推理部署&#xff0c;但视频效果较差&#xff0c;本篇…

ps2023最新版免费滤镜插件Exposure安装下载教程

滤镜插件是ps的重要功能之一&#xff0c;它主要是用来制作不同的图片特效。那么&#xff0c;ps滤镜插件哪些好用&#xff0c;ps滤镜插件如何获取&#xff0c;下面我们一起来学习这些内容。 ps滤镜插件是比较多的&#xff0c;下面对几款常见的ps滤镜插件进行讲解&#xff0c;看…

TIA博途中的TRACE功能具体使用方法示例

TIA博途中的TRACE功能具体使用方法示例 我们可以利用TRACE曲线来监控程序、排查故障,那么具体怎样使用呢,可以参考以下内容。 如下图所示,打开TIA博途,新建项目后,在左侧项目树中可以看到TRACES, 如下图所示,双击添加新轨迹,然后在右侧窗口中,添加需要监视的信号,…

TOUGH2系列建模方法及在CO2地质封存、水文地球化学、地热、地下水污染等领域中的技术

TOUGH2系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同EOS模块&#xff0c;软件…

【矩阵论】3. 矩阵函数——矩阵函数求导

3.6 矩阵函数求导 3.6.1 积分与求导定义 设 mnm\times nmn 阶矩阵 A(x)(aij(x))mnA(x)\left(a_{ij}(x)\right)_{m\times n}A(x)(aij​(x))mn​ 中的元素都是 x 的可导函数&#xff0c;则 A(x)A(x)A(x) 为关于 xxx 的求导为&#xff1a; A′(A)dA(x)dx(daij(x)dx)mnA(A)\frac{…