首页 > 其他分享 >springboot2 - ehcache

springboot2 - ehcache

时间:2024-05-21 09:18:21浏览次数:36  
标签:ehcache 缓存 spring cache springboot2 key id

介绍 ehcache 一下在 spring 环境下的应用。

如果是单机系统,ehcache 一般是首选方案,想通过切换 redis 提高性能,意义不大,反而会增加部署和维护负担。

工具函数

如果想在 spring 环境下,封装自己的工具函数,下面这些基础代码估计会用到。

场景:像是 Excel 导入数据,需要大批量更新缓存时,手动操作缓存反而更容易。

import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Service;

@Service
class CacheUtils{

    // 获取 spring 容器中的缓存管理
    @Resource
    private CacheManager cacheManager;

    public void demo() {
        // 根据 name 找到对应的 cache
        Cache cache = cacheManager.getCache("cache-name");
        // 获取 Cache 对象实体
        net.sf.ehcache.Cache nativeCache = (net.sf.ehcache.Cache) cache.getNativeCache();
    }
}

@CacheConfig

/**
 * @CacheConfig 在类上使用,声明这个类使用的缓存名称。
 *
 * 很多人可能没用过这个注解,不用也是可以的,因为 @Cacheable 也有一个 cacheNames,效果一致。
 */
@Service
@CacheConfig(cacheNames = "user")
public class UserService {
}

@Cacheable

class Test {

    /**
     * Cacheable 注解用在方法上;数据查询时,对函数的返回值进行缓存。
     *
     * key 值就是缓存中用的名字,可以专门定制一套生成策略;
     * 下面这种,用的是 spring 的 EL 表达式,将参数中的 id 拼接上 'test' 作为 key 值。
     *
     * cacheNames 声明你用的是什么缓存,ehcache 中对应的是 cache 的 name。
     *
     * @param id 能唯一定位到数据的值
     */
    @Cacheable(cacheNames = "user", key = "'test' + #id")
    public User getUserById(Long id) {
        return dao.getUserById(id);
    }
}

注解中其余字段说明:

  • cacheNames/value:缓存名称;
  • key:缓存数据使用的 key;
  • keyGenerator:用于指定 key 的生成策略,可以封装一个工具,自动生成 key;
  • cacheManager:指定缓存管理器;
  • condition:符合条件才缓存,例:@Cacheable(condition = "#id > 1");
  • unless:除非,对返回值进行判断,满足条件的不缓存;
  • sync:是否使用异步模式。

@CachePut

class Test{

    /**
     * CachePut 注解用在方法上:数据变化的时候,将缓存中的数据,更新成函数的返回值。
     */
    @CachePut(key = "#id")
    public User updateUserById(User user) { 
        return dao.updateUserById(user); 
    }
}

@CacheEvict

class Test{

    /**
     * CacheEvict 注解用在方法上:数据发生删除的时候,清除缓存。
     */
    @CacheEvict(key = "#id")
    public void deleteUserById(Long id) {
        dao.deleteUserById(id);
    }
}

Maven 依赖


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.6</version>
    </dependency>
</dependencies>

yml 配置

# ehcache缓存配置,注意调整 yml 配置的时候,还需要调整 maven 依赖
spring:
  cache:
    type: ehcache
    ehcache:
      config: classpath:ehcache.xml

ehcache.xml

如果你的 yml 也指定为 classpath:ehcache.xml,那就放在 resources 根目录,位置可按需调整。

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

    <!-- java.io.tmpdir:默认的临时文件存放路径;-->
    <!-- user.home:用户文件夹;-->
    <!-- user.dir:工程目录。-->
    <diskStore path="java.io.tmpdir"/> 

    <!-- 默认缓存,在程序中创建缓存时的模版 -->
    <defaultCache maxElementsInMemory="10000"
                  eternal="false"
                  timeToIdleSeconds="120"
                  timeToLiveSeconds="120"
                  overflowToDisk="true"
                  maxElementsOnDisk="100000"
                  diskPersistent="false"
                  diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU"/>

    <!-- 
                    配置自定义缓存
    maxElementsInMemory:缓存中允许创建的最大对象数
    eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
    timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,
                                两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,
                                如果该值是 0 就意味着元素可以停顿无穷长的时间。
    timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
                    这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
    overflowToDisk:内存不足时,是否启用磁盘缓存。
    memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。默认策略是LRU(最近最少使用)。
            你可以设置为FIFO(先进先出)或是LFU(较少使用)
    -->

    <cache name="security"
           maxElementsInMemory="10000"
           eternal="false"
           overflowToDisk="false"
           timeToIdleSeconds="300"
           timeToLiveSeconds="300"
           memoryStoreEvictionPolicy="LRU"/>
</ehcache>

标签:ehcache,缓存,spring,cache,springboot2,key,id
From: https://www.cnblogs.com/chenss15060100790/p/18203284

相关文章

  • springboot2 - 请求相关的兼容配置
    StandardServletMultipartResolverStandardServletMultipartResolver在spring4和spring5代码是不一样的。在低版本spring环境下,文件只能通过POST请求提交。对程序的影响可能不大,因为现在的做法,基本形成统一的定式:文件表单和业务表单分离,先将文件上传,返回一段url,再将......
  • SpringBoot2.x整合Redis Sentinel
    redissentinel搭建之后,在spring-boot项目中集成。配置在pom.xml文件中添加如下依赖配置(这里spring-boot版本2.2.5),这个版本中,默认使用lettuce作为redis连接池。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis<......
  • 9.prometheus监控--监控springboot2.x(Java)
    一、环境部署yumsearchjava|grepjdkyuminstall-yjava-11-openjdk-devel二、监控java应用(tomcat/jar)JMXexporter负责收集Java虚拟机信息---没举例,等以后再做测试进入到tomcat安装目录,vimPROMETHEUS_JMX_EXPORTER_OPTS="-javaagent:../prometheus-exporter......
  • Springboot2+vue2整合项目
    前端https://blog.csdn.net/m0_37613503/article/details/128961447数据库1.用户表CREATETABLE`x_user`(`id`int(11)NOTNULLAUTO_INCREMENT,`username`varchar(50)NOTNULL,`password`varchar(100)DEFAULTNULL,`email`varchar(50)DEFAULTNULL,`......
  • springboot234基于Spring Boot的疗养院管理系统的设计与实现
    具体演示视频链接:https://pan.baidu.com/s/1epOAnmfyRpfuI3eBR13WDA?pwd=8888毕业设计(论文)疗养院管理系统设计与实现摘要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安......
  • springboot235基于SpringBoot的房屋交易平台的设计与实现
    具体演示视频链接:https://pan.baidu.com/s/1epOAnmfyRpfuI3eBR13WDA?pwd=8888本科毕业设计论文题目:房屋交易平台设计与实现系别:XX系(全称)专业:软件工程班级:软件工程15201学生姓名:学生学号:指导教师:导师1导师2摘要信息数据从传统到当代,是一直在变革当中,突......
  • springboot223基于springboot的信息技术知识竞赛系统的设计与实现
    具体演示视频链接:https://pan.baidu.com/s/1epOAnmfyRpfuI3eBR13WDA?pwd=8888毕业设计(论文)信息技术知识赛系统设计与实现摘要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机......
  • springboot235基于SpringBoot的房屋交易平台的设计与实现
          本科毕业设计论文题目:房屋交易平台设计与实现系   别:XX系(全称)专    业:软件工程班   级:软件工程15201学生姓名:学生学号:指导教师:导师1       导师2摘  要信息数据从传统到当代,是一直在变革当中,突如其......
  • springboot233大学生就业需求分析系统
          本科毕业设计论文题目:大学生就业需求分析系统设计与实现系   别:XX系(全称)专    业:软件工程班   级:软件工程15201学生姓名:学生学号:指导教师:导师1       导师2摘  要信息数据从传统到当代,是一直在变革......
  • Springboot2+consul启动时报错,读取的SystemConfig类的值全部为null
    【错误描述】     解决方案:检查是否已经在pom.xml配置了consul的相关jar包引用。 排查过程:检查了启动的日志,跟旧项目的正常日志进行对比,发现缺少了读取配置boostrap文件的日志。怀疑没有启动consul服务去远端读取consul的内容。 ......