[排坑]内存缓存(Ehcache)不小心的写数据,导致缓存被污染的事故

深入解析Ehcache:三层存储、淘汰算法与Spring Boot集成实战 缓存技术是提升应用性能、降低数据库负载的核心手段之一,其核心原理在于将高频访问的数据暂存于高速存储介质中。在Java生态中,Ehcache作为一个成熟的开源缓存库,通过其精妙的分层存储模型(堆内、堆外、磁盘)和灵活的过期策略,实现了内存、性能与容量间的平衡。理解其内部架构与数据流转机制,对于构建高响应、高可用的系统具有重要价值。本文将从一次线上Full GC事故切入,重点探讨Ehcache的三层存储模型、LRU等淘汰算法的应用场景,并结合Spring Boot集成实践,解析如何通过合理配置资源池、监控Cac 阅读详情

项目场景:

  • 在项目中使用基于内存(JVM)的缓存
  • 缓存了每个用户的基本信息
  • 用户的基本信息会同步到终端设备

问题描述:

  • 发现同步到终端设备的数据与数据库的不一致。但是很奇怪的是其中一个属性值小概率被置为空了。在数据库中值是存在的。

原因分析:

1,论证数据库数据与缓存数据的一致性,这里的一致性是指,我在数据库看到的,和被缓存的数据是否相同。

因为不排除,在查询数据库并缓存时,ORM映射问题导致某个属性没被赋值,但是这种问题一般出现频率是高频的,而不会是偶发。但也不排除偶发概率,因为在属性映射时,假设映射的代码在处理数据时根据某种特定情况而导致返回空。

2,是否存在非数据库的数据源更新缓存。笔者就是走进了这个坑。

  • 首先,我们使用的是内存缓存,当然这里的内存缓存应该理解为被缓存在JVM运行时中,这种缓存就是我们常说的Ehcache,和Redis不同是,Redis是单独的进程,而Ehcache是同一个进程
  • 假设我们对用户A对象进行了缓存,在不销毁的情况下,无论在何时获取用户A对象,返回的都是指向同一个对象地址的指针。在这种模式下,某个线程执行时,经过了用户A对象缓存的获取,通过参数被传递,慢慢的就可能忘记它是缓存返回的。也就慢慢不小心对这个缓存对象的某个属性进行了修改,在其他线程使用时,由于内存地址都是一样的,所以这个缓存的属性已经被偷偷的修改了,已经和数据库的不一致了。在开发时,一个不注意,这个缓存就会被慢慢的污染,最终面目前非,导致莫名其妙的问题。

总结

  • 在使用基于Ehcache、HashMap等在同一进程的缓存时,一定要注意,读出来的缓存不能被修改,这应该是规范。
  • 某些情况我们会对读取的缓存数据进行加工、转换,但同时加工、转换的载体又放在了缓存对象本身,此时我们应该对缓存对象进行深拷贝。
encache缓存 立即下载

相关推荐

Hi3516CV610 YOLOv8模型转换与部署实战:从源码到板端推理全流程解析

本文详细解析了将YOLOv8模型部署到Hi3516CV610开发板的全流程。内容涵盖从Ubuntu环境搭建、模型获取与验证,到关键的PyTorch模型转换为ONNX格式,并利用海思工具链量化生成板端可执行的.wk文件。最后,指导开发者编写板端C程序,完成视频流处理、NNIE推理及结果后处理,并提供了部署调试与性能优化的实用技巧。

weixin_29215815的博客 266

pytorch如何解决图像大小不一致问题_缓存篇(04)缓存异常(上):如何解决缓存和数据库的数据不一致问题?...

在实际应用 Redis 缓存时,我们经常会遇到一些异常问题,概括来说有 4 个方面:缓存中的数据和数据库中的不一致;缓存雪崩;缓存击穿和缓存穿透。只要我们使用 Redis 缓存,就必然会面对缓存和数据库间的一致性保证问题,这也算是 Redis 缓存应用中的“必答题”了。最重要的是,如果数据不一致,那么业务应用从缓存中读取的数据就不是最新数据,这会导致严重的错误。比如说,我们把电商商品的库存信息缓存...

weixin_32487557的博客 1667

Zoom AI 技术架构研究:联合式方法与多模态集成

通过 Zoom AI 开放平台,企业可以自定义 AI 模块 (如法律合规审查、客户反馈分析),扩展应用场景。这种开放平台策略使企业能够根据自身需求定制 AI 功能,满足特定业务需求。

shao.bing的专栏 1314

Hibernate缓存(EhCache)

Hibernate缓存(EhCache)

weixin_52457750的博客 1290

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1400

通俗理解Xgboost

为了简化计算,XGBoost采用了一阶导数(梯度)和二阶导数(Hessian)来近似损失函数的变化,从而推导出叶子节点值的更新公式。其中 z 就是所有树的叶子节点分数之和。通过这两个正则化项,XGBoost能够在优化目标函数时,不仅考虑损失函数的最小化,还考虑了模型的复杂度,从而达到更好的泛化性能。正则化项通常包括两个部分:一个是与叶子节点数量相关的项,另一个是与叶子节点输出值大小相关的项。通过这种方式,XGBoost能够有效地计算出每个叶子节点的值,同时通过正则化项来平衡模型的复杂度和泛化能力。

金融风控笔记 750

springboot+ehcache缓存遇到的坑

springboot+ehcache使用方法: 1.在src/main/resource里面配置ehcache.xml 2.在配置文件application.properties里引入echcache.xml spring.cache.ehcache.config=classpath:ehcache.xml 3.在springboot启动类里加上ehcache注解 4.在con...

zalan01408980的博客 9288

巡检机器人的基于ROS系统的任务管理架构设计总结

本文探讨了基于ROS(机器人操作系统)的工业巡检机器人任务管理架构设计,提出分层闭环方案。架构围绕稳、准、活、扩四大目标,分为感知层(多源数据融合)、调度层(智能决策)、执行层(动作控制)和数据层(存储交互)。关键技术包括ROS2实时性优化、功能包复用和多机器人协同调度。实践案例显示,该架构在电力巡检中使任务完成率达99%,在化工园区实现95%覆盖率。当前挑战包括SLAM地图漂移和多机通信延迟,未来可通过语义SLAM和区域通信优化。

start_up_go的博客 462

关于Ehcache缓存数据到磁盘时的细节

部署线上项目时被这问题折磨了一天.必须总结下 类型一: [ERROR] [2013-08-07 @ 04:48:19] [data.data|DiskStorageFactory] Disk Write of Xdsfadfeec0des0003SQen-USQUOTE_SPEED failed (it will be evicted instead): java.io.NotSeria

u011303664的专栏 8042

【感知模块算法】障碍物detect+trace+prediction方向介绍

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、多维度看感知问题,体会复杂性二、障碍物/环境目标detect方向1.视觉目标检测方向(1)图像处理认知(2)视觉基础理论部分1、获取数据集---python网页爬虫、买数据、自己录数据、使用开源比赛的数据集2、opencv库的学习3、深度学习框架学习(3)视觉目标检测理论(1)目标检测的概念(2)目标检测的应用场景(3)现有目标检测框架原理及论文【这仅仅是我当初入门学习的框架~

qq_35635374的博客 2893

STM32入门教程:车牌识别

在本文中,我们介绍了如何使用STM32实现车牌识别功能,并提供了详细的代码案例。通过以上步骤,你可以开始开发自己的车牌识别系统了。希望本文对你有所帮助!

2401_85258012的博客 874

ehcache 缓存丢失_记一次spring与ehcache缓存问题跟踪

一个java小项目,由于某种原因,要用到缓存,因为小,所以不打算去折腾memcache,redis这类大级别缓存,所以选择ehcache缓存组件与项目集成使用。初次使用,一开始不怎么熟悉,中间出现了一个令我困扰的问题,明明我的ehcache.xml配置里把缓存的生命周期配成不限制的,也就是说,对象可以无限长时间留在缓存中,但实际是过了2分钟的样子,缓存就消失不见了。现象见图:过2分钟左右,缓存不见...

weixin_39884373的博客 588

FTU电科院检测学习笔记-规划

如果写到最后,还非常的有动力和兴趣,可能会举出一些特定的例子来,但不保证一定是这样。

sixtome 1097

本地缓存实战:从性能利器到架构陷阱的全面解析

缓存是提升系统性能、保护后端存储的核心技术组件。其基本原理是将高频访问的数据暂存于高速存储介质中,以空间换时间,从而显著降低响应延迟和数据库压力。在技术价值上,缓存不仅能实现亚毫秒级的访问速度,更是应对瞬时流量洪峰、保障系统稳定性的关键手段。其典型应用场景包括读多写少的热点数据(如商品信息、系统配置)、计算昂贵的中间结果以及需要极致性能的金融行情、实时竞价等业务。本文聚焦于本地缓存这一具体实现,深入探讨了其在高性能追求与数据一致性、内存管理等多实例协同等复杂挑战下的工程实践,并提供了基于Caffeine的健

congbao6525的博客 466

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

springboot整合ehcache实现二级缓存踩坑

springboot整合redis+ehcache实现二级缓存

a20100997的博客 1530

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

加入ehcache后,系统出现内存泄漏,解决办法

最近在系统中,加入缓存ehcache,但发现,每隔一天,服务器就会报出内存溢出。 问题严重,后来在网上查资料发现,一篇解释的网文: spring中的提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责 处理由 JavaBeans Introspector的使用而引起的缓冲泄露。spring中对它的

7919

ehcache 内存泄漏

 解决办法,就是在web.xml中加入: org.springframework.web.util.IntrospectorCleanupListener Introspector 缓存清除监听器 Spring还提供了一个名为 org.springframework.web.util.Int

寻梦的赶路人 4199

非正常关闭时Ehcache磁盘存储下次不能使用.

在使用ehcache时,我们会使用 diskPersistent="true" 来保证下次虚拟机重启时,缓存数据依然可以使用. 然而当我们ctrl+C或者直接杀死进程时甚至于断电等非正常关闭时,ehcache的缓存就不能再使用了.原因在于: 在ehcache的源码里,DiskStorageFactory类里,硬盘存储初始化时有这段代码: if (getDataFile().last...

做你想做的人,没有时间的限制,只要愿意,什么时候都可以start。 924

基于EHcache实现高并发数据缓存池

在高并发的场景里面经常会使用到localcache内容,但是一直没有一个很好的内存管理工具。在开发的时候发现了ehcache,这么一个开源的工具。唯一的缺点就是无法对于多块数据单元进行一个有效的管理,并且在数据过期的时候无法提供有效的更新机制,所以这里写了一个数据缓存池来满足这个需求。 下面是设计组织结构: 这里主要是在数据实体内部封装了数据更新器,这样在数据过期的时候可以调用

救护车 1375

ehcache 缓存丢失_求助,EhCache缓存中数据失效的问题!

配置文件如下:plugins.add(newEhCachePlugin());//使用EhCache缓存publicvoidafterJFinalStart(){newCacheThread().run();}publicclassCacheThreadextendsThread{@Overridepublicvoidrun(){initUserGroupCache();...

weixin_39713763的博客 750

Ehcache详细解读

Ehcache 是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大,最初知道它,是从Hibernate的缓存开始的。网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google;对于API,官网上介绍已经非常清楚,请参见官网;但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思...

四火专栏 1882

简单说说JAVA内存泄漏

大量对象占用JVM内存,并且垃圾回收无法回收,这就出现了内存泄漏 打个比方一般电商架构可能会使用多级缓存架构,就是redis加上JVM级缓存,有的可能为了图方便对于JVM级缓存就简单使用一个hashmap,于是不断往里面放缓存数据,但是很少考虑这个map的容量问题,结果这个缓存map越来越大,一直占用着老年代的很多空间,时间长了就会导致fullgc非常频繁,这就是一种内存泄漏,对于一些老旧数据没有及时清理导致一直占用着宝贵的内存资源,时间长了除了导致full gc,还有可能导致OOM。这种情况完全可以考虑

好看的博客 888

Spring整合Ehcache管理缓存

前言 Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存。 Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。它支持注解方式使用缓存,非常方便。 本文先通过Ehcache独立应用的范例来介绍它的基本使用方法,然后再介绍与Spring整合的方法。 概述 Ehcache是什么? EhCache 是一个纯Java的进...

weixin_33711647的博客 390

Ehcache食用指南

最近我们有个服务的时延(Latency)略微上涨,gc时间上涨了一倍,dump出java堆(Heap)之后用mat分析发现,有份cache数据占据了20%+的堆内存,拥有上千万个小对象。然而这部分数据只是部分逻辑会用到,所以它占据这么大的堆内空间显得有些不值,并且会影响到gc进而影响到服务的时延。    当然也有一些其他数据也占用比较多的堆内空间,但做优化总是先拿大头开刀。 当然把这份数据去掉是不...

xindoo 4155

一次内存溢出的排查经历

排查经过 在春节影院APP出现保障,出现接口偶发性的超时,一段时间正常,一段时间超时非常严重,最高达到了200s 并且越来越严重 cpu出现飙高,由于当时运维立刻重启没有保留现场,所以没有定性问题的依据,但当时通过观察Zabix 上下文切换数和中断数趋势出现不一致的情况(中断数陡增) 另外CPU飙高,网络流量没有明显增加,重启后恢复,基于以上几点怀疑是内存泄露。但由于没有数据支持,只能等待再次复现 果然过了2天CPU再次上升到了50%的告警,并出现了响应超时的情况,立刻上去拉了栈dump和堆dump,

Wengy的博客 1594
上一篇: [排坑]Spring Boot @RequestParam的required=true但参数依然为null
下一篇: [排坑]ScheduledThreadPoolExecutor Java 线程池吞掉未捕获异常
mt23
博客等级 码龄12年 33粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值