Java 使用Spring/EHCache加载时刷新缓存
我在使用数据库后端和基于EHCache的缓存的Spring多线程web服务上遇到了缓存问题。该服务有许多客户端,它们一次又一次地请求同一个对象,每秒有几十个请求。只有两个对象经常被请求,而大量其他对象很少被请求。对象可以每隔几分钟更改一次,因此缓存的TTL设置为一分钟。从数据库加载对象很慢,至少需要几秒钟 首先,我使用了一个简单的实现来获取对象:Java 使用Spring/EHCache加载时刷新缓存,java,multithreading,spring,caching,ehcache,Java,Multithreading,Spring,Caching,Ehcache,我在使用数据库后端和基于EHCache的缓存的Spring多线程web服务上遇到了缓存问题。该服务有许多客户端,它们一次又一次地请求同一个对象,每秒有几十个请求。只有两个对象经常被请求,而大量其他对象很少被请求。对象可以每隔几分钟更改一次,因此缓存的TTL设置为一分钟。从数据库加载对象很慢,至少需要几秒钟 首先,我使用了一个简单的实现来获取对象: 检查对象是否在缓存中 如果是,则从缓存中返回 如果没有,则从数据库加载它,将其放入缓存并返回 当最初在本地进行测试时,它运行良好。但是在速度更快的服务
我真正的问题是:在我重新发明轮子之前,是否有任何现有的框架已经实现了这样的东西(在Spring/EHCache环境中)?或者可能Spring/EHCache中已经存在对此的支持,我就是找不到正确的选项?您的设计有缺陷,因为第二个线程无法从缓存中获取任何“过期”对象,因为没有(按照步骤2:当对象在缓存中时立即返回) 解决办法:
Ehcache提供的两种构造可以帮助您:
CacheLoader
不幸的是,我找不到显示第二个选项示例的在线文档。
它允许使用Quartz刷新缓存条目以进行调度。它还可以根据密钥生成器仅刷新密钥的子集。
查看package
net.sf.ehcache.constructs.scheduledrefresh
中的类,谢谢您的回答。你指的是哪种设计?3号?我知道您无法从EHCache获取过期对象。我的解决方案是在其上放置另一层,该层将保留过期的对象,直到缓存被更新,例如使用第二个缓存