首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot配置EhCache缓存

SpringBoot配置EhCache缓存

作者头像
崔笑颜
发布于 2020-06-08 08:18:23
发布于 2020-06-08 08:18:23
1.4K059
代码可运行
举报
运行总次数:59
代码可运行

添加依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

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

添加配置

在 src/main/resources 目录下创建 ehcache.xml 文件,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <!-- 磁盘缓存位置 -->
    <diskStore path="java.io.tmpdir/ehcache"/>

    <!-- 默认缓存 -->
    <defaultCache
            maxEntriesLocalHeap="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxEntriesLocalDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>

    <!-- 自定义缓存 -->
    <cache name="department"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="50"
           timeToLiveSeconds="50"
           overflowToDisk="false"
           memoryStoreEvictionPolicy="LRU"/>
</ehcache>

说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name:Cache 的唯一标识
maxElementsInMemory:内存中允许存储的最大的元素个数
maxElementsOnDisk:硬盘最大缓存个数,0代表无限个
clearOnFlush:内存数量最大时是否清除
eternal:缓存对象是否永久有效,如果是,超时设置将被忽略
overflowToDisk:内存不足(超过 maxElementsInMemory)时,是否启用磁盘缓存
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds:缓存数据的生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间
diskPersistent:是否将缓存数据持久化到磁盘上,如果为 trueJVM 重启数据依然存在。默认值是false
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
memoryStoreEvictionPolicy:当达到 maxElementsInMemory 限制时,Ehcache 将根据指定策略清除内存。默认为 LRU(最近最少使用),其他策略有 FIFO(先进先出),LFU(较少使用)

application.properties :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 缓存类型(ehcache、redis)
spring.cache.type=ehcache

# ehcache 配置文件
spring.cache.ehcache.config=classpath:ehcache.xml

# 打印日志,查看 sql
logging.level.com.light.springboot=DEBUG

编码

在持久层篇的基础上,结合 Mybatis 测试:

Service 层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@CacheConfig(cacheNames = "department")
@Service
public class DepartmentService {

  @Autowired
  private DepartmentMapper departmentMapper;

  @CachePut(key = "#department.id")
  public Department save(Department department) {
    System.out.println("保存 id=" + department.getId() + " 的数据");
    this.departmentMapper.insert(department);
    return department;
  }

  @CachePut(key = "#department.id")
  public Department update(Department department) {
    System.out.println("修改 id=" + department.getId() + " 的数据");
    this.departmentMapper.update(department);
    return department;
  }

  @Cacheable(key = "#id")
  public Department getDepartmentById(Integer id) {
    System.out.println("获取 id=" + id + " 的数据");
    Department department = this.departmentMapper.getById(id);
    return department;
  }

  @CacheEvict(key = "#id")
  public void delete(Integer id) {
    System.out.println("删除 id=" + id + " 的数据");
    this.departmentMapper.deleteById(id);
  }
}

控制层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
@RequestMapping("department")
@ResponseBody
public class DepartmentController {

  @Autowired
  private DepartmentService departmentService;

  @RequestMapping("save")
  public Map<String,Object> save(Department department) {
    this.departmentService.save(department);

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("code", "200");
    map.put("msg", "保存成功");
    return map;
  }

  @RequestMapping("get/{id}")
  public Map<String,Object> get(@PathVariable("id") Integer id) {
    Department department = this.departmentService.getDepartmentById(id);

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("code", "200");
    map.put("msg", "获取成功");
    map.put("data", department);
    return map;
  }

  @RequestMapping("update")
  public Map<String,Object> update(Department department) {
    this.departmentService.update(department);

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("code", "200");
    map.put("msg", "修改成功");
    return map;
  }

  @RequestMapping("delete/{id}")
  public Map<String,Object> delete(@PathVariable("id") Integer id) {
    this.departmentService.delete(id);

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("code", "200");
    map.put("msg", "删除成功");
    return map;
  }
}

启动类:

添加 @EnableCaching 注解,开启缓存功能。

测试说明

由于 ehcache 缓存是存储在应用的内存中,如果使用 junit 测试,方法执行完毕缓存就释放了,无法正常测试缓存效果,因此测试使用发起 http 请求的形式。

发起保存请求:

发起保存请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
保存 id=2 的数据
2017-12-06 14:50:48.800 DEBUG 680 --- [nio-8081-exec-7] c.l.s.dao.DepartmentMapper.insert        : ==>  Preparing: insert into department(id,name,descr) values(?,?,?)
2017-12-06 14:50:48.801 DEBUG 680 --- [nio-8081-exec-7] c.l.s.dao.DepartmentMapper.insert        : ==> Parameters: 2(Integer), Ehcache 部门(String), Ehcache(String)
2017-12-06 14:50:48.868 DEBUG 680 --- [nio-8081-exec-7] c.l.s.dao.DepartmentMapper.insert        : <==    Updates: 1

保存成功后,立刻发起查询请求,没有日志打印,但返回对象数据,说明数据是从缓存中获取。

发起修改请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
修改 id=2 的数据
2017-12-06 14:51:16.588 DEBUG 680 --- [nio-8081-exec-8] c.l.s.dao.DepartmentMapper.update        : ==>  Preparing: update department set name = ? , descr = ? where id = ?
2017-12-06 14:51:16.589 DEBUG 680 --- [nio-8081-exec-8] c.l.s.dao.DepartmentMapper.update        : ==> Parameters: Ehcache 部门2(String), Ehcache2(String), 2(Integer)
2017-12-06 14:51:16.657 DEBUG 680 --- [nio-8081-exec-8] c.l.s.dao.DepartmentMapper.update        : <==    Updates: 1

修改成功后,立刻发起查询请求,没有日志打印,但返回修改后的对象数据,说明缓存中的数据已经同步。

发起删除请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
删除 id=2 的数据
2017-12-06 14:52:07.572 DEBUG 680 --- [nio-8081-exec-1] c.l.s.dao.DepartmentMapper.deleteById    : ==>  Preparing: delete from department where id = ?
2017-12-06 14:52:07.572 DEBUG 680 --- [nio-8081-exec-1] c.l.s.dao.DepartmentMapper.deleteById    : ==> Parameters: 2(Integer)
2017-12-06 14:52:07.613 DEBUG 680 --- [nio-8081-exec-1] c.l.s.dao.DepartmentMapper.deleteById    : <==    Updates: 1

删除成功后,立刻发起查询请求,控制台打印 sql 语句,说明缓存数据被删除,需要查询数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
获取 id=2 的数据
2017-12-06 14:52:40.324 DEBUG 680 --- [nio-8081-exec-3] c.l.s.dao.DepartmentMapper.getById       : ==>  Preparing: select id,name,descr from department where id = ?
2017-12-06 14:52:40.325 DEBUG 680 --- [nio-8081-exec-3] c.l.s.dao.DepartmentMapper.getById       : ==> Parameters: 2(Integer)
2017-12-06 14:52:40.328 DEBUG 680 --- [nio-8081-exec-3] c.l.s.dao.DepartmentMapper.getById       : <==      Total: 0
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解Diffusion扩散模型:理论、架构与实现
Diffusion扩散模型是一类基于概率扩散过程的生成模型,近年来在生成图像、文本和其他数据类型方面展现出了巨大的潜力和优越性。该模型利用了扩散过程的逆过程,即从一个简单的分布逐步还原到复杂的数据分布,通过逐步去噪的方法生成高质量的数据样本。
TechLead
2024/07/26
2.9K0
详解Diffusion扩散模型:理论、架构与实现
从DDPM到LDM扩散模型的演进与优化解析【扩散模型实战】
扩散模型近年来在生成模型领域取得了令人瞩目的成果。特别是从早期的Denoising Diffusion Probabilistic Models (DDPM)到更高效的Latent Diffusion Models (LDM),扩散模型不仅在图像生成、文本生成等领域展现了强大的能力,而且在推理速度和计算效率上有了显著的改进。本文将对扩散模型的演变进行深入探讨,并结合代码实例帮助理解其核心原理。
一键难忘
2024/09/09
1.5K0
DDPM | 扩散模型代码详解
Denoising Diffusion Probabilistic Model | Code Analysis
iResearch666
2023/09/26
1.7K0
DDPM | 扩散模型代码详解
【源头活水】使用Pytorch中从头实现去噪扩散概率模型(DDPM)
“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注
马上科普尚尚
2024/07/29
3330
【源头活水】使用Pytorch中从头实现去噪扩散概率模型(DDPM)
探秘生成对抗网络(GAN):原理、应用与代码全知道
生成对抗网络(GAN)自提出以来在深度学习领域备受关注。其独特的对抗训练机制使其在图像生成、数据增强、风格迁移等众多领域展现强大能力。
羑悻的小杀马特.
2025/03/27
7160
太强了!深度学习的Top10模型!
自2006年深度学习概念被提出以来,20年快过去了,深度学习作为人工智能领域的一场革命,已经催生了许多具有影响力的算法或模型。那么,你所认为深度学习的最牛的模型有哪些呢?欢迎评论区留言讨论~
算法进阶
2024/06/26
3.2K0
太强了!深度学习的Top10模型!
生成一切的基础,DiT复现
DiT的全称是Diffusion in Transformer,它将Transformer引入到扩散模型中,替换了Stable Diffusion中常用的U-Net主干。通过增加Transformer深度/宽度或增加输入令牌数量,具有较高Gflops(浮点数运算次数)的DiT始终具有较低的FID(Fréchet初始距离,用于描述生成的图片和原始的图片之间的距离)。本文会讲解扩散模型的原理,从零开始逐步复现DiT模型。
Srlua
2024/11/30
6940
生成一切的基础,DiT复现
生成式AI核心技术详解:从GANs到Transformers
生成式AI(Generative AI)作为人工智能的一个重要分支,通过学习大量的数据生成新的数据样本,在多个领域取得了令人瞩目的进展。生成式AI不仅在学术研究中激发了广泛的兴趣,也在工业应用中展示了巨大的潜力,推动了图像生成、文本生成、视频生成等领域的快速发展。
TechLead
2024/05/29
6.2K0
生成式AI核心技术详解:从GANs到Transformers
全面盘点多模态融合算法及应用场景
多模态融合(Multimodal Fusion)是指结合来自不同模态(如视觉、听觉、文本等)的数据,以提升信息处理和理解能力的技术方法。多模态数据通常具有不同的物理性质和信息特征,通过融合这些多模态信息,可以获得更全面和准确的理解。这种融合过程可以发生在数据层、特征层和决策层:
TechLead
2024/05/29
11.3K1
全面盘点多模态融合算法及应用场景
使用PyTorch实现去噪扩散模型
在深入研究去噪扩散概率模型(DDPM)如何工作的细节之前,让我们先看看生成式人工智能的一些发展,也就是DDPM的一些基础研究。
deephub
2024/01/07
6590
使用PyTorch实现去噪扩散模型
从高斯噪声到生成图像-扩散模型的数学原理与YOLO结合应用解析
扩散模型近年来在生成任务上表现出了卓越的效果,尤其是在图像生成领域。这篇文章将介绍扩散模型的核心思想,从高斯噪声到生成图像的整个过程,并结合具体的数学原理来解释这一方法的工作机制。最后,我们将展示一个基于Python的代码实例来演示扩散模型的实现。
一键难忘
2024/09/08
7800
半监督学习算法及其实现
在机器学习领域,数据是驱动模型训练的核心资源。然而,获取大量带标签的数据往往是昂贵且耗时的过程。半监督学习(Semi-Supervised Learning, SSL)通过利用大量未标记的数据和少量标记的数据,有效地缓解了这一问题。SSL不仅能够减少对标记数据的依赖,还能够在许多实际应用中提升模型的性能。
TechLead
2024/07/05
1.2K0
半监督学习算法及其实现
变分自编码器(VAE)在AIGC中的应用及其技术解析
变分自编码器(Variational Autoencoder, VAE)是一种生成模型,在人工智能生成内容(AI-Generated Content, AIGC)领域中具有广泛的应用。本文将介绍VAE的基本原理、技术细节,并通过代码实例展示其在AIGC中的具体应用。
一键难忘
2024/06/25
1.7K0
AI绘画中VAE压缩图像
在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。
Dlimeng
2023/12/23
4900
AI绘画中VAE压缩图像
生成对抗网络(GANs)在AIGC中的应用
生成对抗网络(Generative Adversarial Networks, GANs)是近年来在人工智能生成内容(Artificial Intelligence Generated Content, AIGC)领域取得显著进展的重要技术。GANs通过两个神经网络——生成器(Generator)和判别器(Discriminator)——之间的对抗训练,实现了从噪声中生成高质量、逼真的图像和其他类型的内容。本文将深入探讨GANs在AIGC中的应用,并通过一个代码实例来展示其工作原理。
一键难忘
2024/06/19
5640
使用Python实现深度学习模型:生成对抗网络(GAN)
生成对抗网络(Generative Adversarial Network,GAN)是一种无监督学习的深度学习模型,由Ian Goodfellow等人在2014年提出。GAN包含两个相互竞争的神经网络:生成器(Generator)和判别器(Discriminator)。生成器试图生成看起来像真实数据的假数据,而判别器则试图区分真实数据和生成数据。通过这种对抗过程,生成器能够生成非常逼真的数据。本教程将详细介绍如何使用Python和PyTorch库实现一个简单的GAN,并展示其在MNIST数据集上的应用。
Echo_Wish
2024/05/25
7270
利用pytorch实现GAN(生成对抗网络)-MNIST图像-cs231n-assignment3
In 2014, Goodfellow et al. presented a method for training generative models called Generative Adversarial Networks (GANs for short). In a GAN, we build two different neural networks. Our first network is a traditional classification network, called the discriminator. We will train the discriminator to take images, and classify them as being real (belonging to the training set) or fake (not present in the training set). Our other network, called the generator, will take random noise as input and transform it using a neural network to produce images. The goal of the generator is to fool the discriminator into thinking the images it produced are real. 在生成网络中,我们建立了两个神经网络。第一个网络是典型的分类神经网络,称为discriminator重点内容,我们训练这个网络对图像进行识别,以区别真假的图像(真的图片在训练集当中,而假的则不在。另一个网络称之为generator,它将随机的噪声作为输入,将其转化为使用神经网络训练出来产生出来的图像,它的目的是混淆discriminator使其认为它生成的图像是真的。
老潘
2018/06/21
2.5K0
利用pytorch实现GAN(生成对抗网络)-MNIST图像-cs231n-assignment3
人工智能生成内容(AIGC)在图像生成领域的技术进展
人工智能生成内容(AIGC,AI-Generated Content)在图像生成领域取得了显著的进展。本文将探讨从卷积神经网络(CNN)到风格迁移(Style Transfer)的技术演变,并通过代码实例展示其应用。
一键难忘
2024/06/21
1.5K0
利用扩散模型实现高质量图像生成【原理解析与代码实践】
扩散模型(Diffusion Models)作为生成模型的最新前沿技术,已经在高质量图像生成中展现出了巨大的潜力。相比于生成对抗网络(GANs),扩散模型在生成图像的多样性、稳定性和高分辨率方面都有显著提升。这篇文章将深入解析扩散模型的生成过程,并通过代码示例展示如何通过该模型生成高质量图像。
一键难忘
2024/09/11
3.3K1
从零开始实现VAE和CVAE
来源:DeepHub IMBA 本文约4200字,建议阅读8分钟 本文将用python从头开始实现VAE和CVAE,来增加对于它们的理解。 扩散模型可以看作是一个层次很深的VAE(变分自编码器),
数据派THU
2023/05/11
5500
从零开始实现VAE和CVAE
推荐阅读
相关推荐
详解Diffusion扩散模型:理论、架构与实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验