Springboot集成Ehcache3实现本地缓存

server/2024/12/23 7:01:31/

如果只需要在单个应用程序中使用本地缓存,则可以选择Ehcache;它支持内存和磁盘存储,这里不以注解方式演示,通过自己实现缓存管理者灵活控制缓存的读写;

1、引入相关依赖

		<!-- ehcache3集成start --><dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.10.8</version></dependency><dependency><groupId>javax.cache</groupId><artifactId>cache-api</artifactId></dependency><!-- ehcache3集成end -->

2、修改yml配置

spring:cache:type: jcachejcache:config: classpath:cache/ehcache.xml

3、配置ehcache.xml文件

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.ehcache.org/v3"xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd"><!-- 缓存持久化配置: 定义磁盘缓存位置 --><persistence directory="E:/project_home/limit_control/cache/light-element-mybatis"/><!-- 缓存模板: 未填写缓存名时使用的默认缓存,同时也可被继承 --><cache-template name="defaultCache"><key-type>java.lang.String</key-type><value-type>java.lang.Object</value-type><resources><heap unit="MB">64</heap><offheap unit="MB">128</offheap></resources></cache-template><!-- 缓存列表: 自定义缓存配置 --><!-- 不过期 --><cache alias="EXPIRE_NONE" uses-template="defaultCache"/><!-- 24小时过期 --><cache alias="EXPIRE_24_HOURS" uses-template="defaultCache"><expiry><ttl unit="hours">24</ttl></expiry></cache><!-- 30分钟过期 --><cache alias="EXPIRE_30_MINUTES" uses-template="defaultCache"><expiry><ttl unit="minutes">30</ttl></expiry></cache>
</config>

4、编写缓存策略枚举

public enum CacheStrategy {EXPIRE_30_MINUTES,EXPIRE_24_HOURS,EXPIRE_NONE
}

5、编写缓存管理者,来控制缓存的增删改查

import com.alibaba.fastjson.JSON;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;import java.util.List;/*** ehcache3缓存管理者*/
@Configuration
@EnableCaching
public class EhCacheManager {private static CacheManager cacheManager;public EhCacheManager(CacheManager cacheManager) {EhCacheManager.cacheManager = cacheManager;}/*** 获取默认缓存** @return*/public static Cache getDefaultCache() {return getCache("EXPIRE_24_HOURS");}/*** 获取指定缓存** @param cacheName 缓存名称* @return*/public static Cache getCache(String cacheName) {if (cacheManager == null) {return null;}return cacheManager.getCache(cacheName);}/*** 获取缓存内容(对象)** @param cacheName 缓存名称* @param key       键* @param clazz<T>  class类型* @return*/public static <T extends Object> T getObjValue(String cacheName, String key, Class<T> clazz) {Object o = getValue(cacheName, key);if (o == null) {return null;}T t = (T) JSON.parseObject(JSON.toJSONString(o), clazz);return t;}/*** 获取缓存内容(集合)** @param cacheName 缓存名称* @param key       键* @param clazz<T>  class类型* @return*/public static <T extends Object> List<T> getListValue(String cacheName, String key, Class<T> clazz) {Object o = getValue(cacheName, key);if (o == null) {return null;}List<T> ts = JSON.parseArray(JSON.toJSONString(o), clazz);return ts;}/*** 获取缓存内容** @param cacheName* @param key* @return*/private static Object getValue(String cacheName, String key) {Cache cache = getCache(cacheName);if (cache == null && cache.get(key) == null) {return null;}Cache.ValueWrapper valueWrapper = cache.get(key);if (valueWrapper == null) {return null;}Object o = valueWrapper.get();if (o == null) {return null;}return o;}/*** 新增或修改缓存数据** @param cacheName 缓存名称* @param key       键* @param value     值*/public static void put(String cacheName, String key, Object value) {Cache cache = getCache(cacheName);if (cache == null) {return;}cache.put(key, value);}/*** 删除缓存数据** @param cacheName 缓存名称* @param key       键*/public static void del(String cacheName, String key) {Cache cache = getCache(cacheName);if (cache == null) {return;}cache.evict(key);}
}

6、编写controller进行简单测试

import cn.hutool.core.collection.CollectionUtil;
import com.yx.light.element.mybatis.cache.CacheStrategy;
import com.yx.light.element.mybatis.cache.EhCacheManager;
import com.yx.light.element.mybatis.mapper.entity.GroupHeader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping(value = "/index")
@Slf4j
public class IndexController {@GetMapping(value = "/list")public List<GroupHeader> list() {List<GroupHeader> listValue = EhCacheManager.getListValue(CacheStrategy.EXPIRE_30_MINUTES.name(), "list", GroupHeader.class);if (CollectionUtil.isEmpty(listValue)) {log.info("集合缓存不存在或已过期,查询数据库!");//模拟查库List<GroupHeader> objects = new ArrayList<>();for (int i = 0; i < 5; i++) {GroupHeader groupHeader = new GroupHeader();groupHeader.setGroupCode("aaaaa-" + i);groupHeader.setGroupName("多个对象" + i);objects.add(groupHeader);}listValue = objects;EhCacheManager.put(CacheStrategy.EXPIRE_30_MINUTES.name(), "list", listValue);log.info("集合数据加载到缓存!");} else {log.info("从集合缓存中直接获取数据!");}return listValue;}@GetMapping(value = "/one")public GroupHeader one() {GroupHeader objValue = EhCacheManager.getObjValue(CacheStrategy.EXPIRE_30_MINUTES.name(), "obj", GroupHeader.class);if (objValue == null) {log.info("对象缓存不存在或已过期,查询数据库!");//模拟查库GroupHeader groupHeader = new GroupHeader();groupHeader.setGroupCode("aaaaa");groupHeader.setGroupName("单个对象");objValue = groupHeader;EhCacheManager.put(CacheStrategy.EXPIRE_30_MINUTES.name(), "obj", groupHeader);log.info("对象数据加载到缓存!");} else {log.info("从对象缓存中直接获取数据!");}return objValue;}@GetMapping(value = "/del")public void del() {log.info("清理对象缓存!");EhCacheManager.del(CacheStrategy.EXPIRE_30_MINUTES.name(), "obj");}}

7、分别调用接口查看日志打印


http://www.ppmy.cn/server/4350.html

相关文章

JVM之JVM栈的详细解析

Java 栈 Java 虚拟机栈&#xff1a;Java Virtual Machine Stacks&#xff0c;每个线程运行时所需要的内存 每个方法被执行时&#xff0c;都会在虚拟机栈中创建一个栈帧 stack frame&#xff08;一个方法一个栈帧&#xff09; Java 虚拟机规范允许 Java 栈的大小是动态的或者是…

K8s RBAC认证授权深度解析

​ &#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s简介 2、RBAC简介 二、RBAC…

PSCAD|应用于输电线路故障测距的行波波速仿真分析

1 主要内容 该程序参考文献《应用于输电线路故障测距的行波波速仿真分析》&#xff0c;利用线路内部故障产生的初始行波浪涌达线路两端测量点的绝对时间之差值计算故障点到两端测量点之间的距离&#xff0c;并利用小波变换得到初始行波波头准确到达时刻&#xff0c;从而精准定…

安装kafka需优先安装 zookeeper ,scala

安装kafka需优先安装 zookeeper ,scala scala安装&#xff08;如安装略过&#xff09; 现在 wget https://downloads.lightbend.com/scala/2.12.11/scala-2.12.11.tgz解压 tar -zxvf scala-2.12.11.tgz编辑环境变量 vim /etc/profile添加环境变量 &#xff08;export SCALA_H…

安卓Dagger框架:依赖注入实践与应用

摘要 Dagger是适用于Android和Java生态系统的强大依赖注入(Dependency Injection, DI)工具&#xff0c;以其编译时生成代码和高效的运行时性能而著称。本文旨在深入探讨Dagger的核心概念、工作流程、优缺点以及实际代码示例&#xff0c;以便开发者更好地理解并有效利用这一框架…

JVM-内存模型(运行时数据区)

目录 1. 线程私有1.1 程序计数器&#xff08;PC寄存器&#xff09;1.2 虚拟机栈1.3 本地方法栈 2. 线程共享2.1 堆2.2 方法区 3. 直接内存 参考 pdai全栈知识体系-JVM-内存结构 1. 线程私有 1.1 程序计数器&#xff08;PC寄存器&#xff09; 作用&#xff1a;PC 寄存器用来存…

3.2 iHRM人力资源 - 组织架构 - 编辑及删除

iHRM人力资源 - 组织架构 文章目录 iHRM人力资源 - 组织架构一、编辑功能1.1 表单弹层并数据回显1.2 编辑校验1.3 编辑 二、删除功能 一、编辑功能 编辑功能和新增功能用的组件其实是一个&#xff0c;结构几乎是一样的&#xff0c;其实是复用了组件&#xff0c;我们也省去了很…

Oracle+RAC静默安装系列(基于RHEL9/国产/麒麟/华为欧拉的生产案例)

由风哥发布的 OracleRAC静默安装系列&#xff08;基于RHEL9/国产/麒麟/华为欧拉的生产案例&#xff09;系列&#xff0c;适合运维人员/数据库/开发人员&#xff0c;可以用于业务生产环境。 为满足想快速安装布署Oracle数据库的学员&#xff0c;风哥特别设计的一套比较全面的全命…