当前位置: 首页 > 面试题库 >

使用Spring / EHCache加载时刷新缓存

锺离玮
2023-03-14
问题内容

我在具有数据库后端和基于EHCache的缓存的Spring多线程Web服务上遇到缓存问题。该服务有许多客户端一次又一次地请求同一个对象,每秒有数十个请求。仅频繁请求几个对象,而不经常请求大量其他对象。对象可以每隔几分钟更改一次,因此将缓存的TTL设置为一分钟。从数据库加载对象很慢,并且至少需要几秒钟。

首先,我使用了一个简单的实现来获取对象:

  1. 检查对象是否在缓存中。
  2. 如果是,请从缓存中将其返回。
  3. 如果不是,请从数据库加载它,将其放入高速缓存中并返回。

最初在本地进行测试时,此方法运行良好。但是,在速度更快的服务器上进行的性能测试显示,每次缓存中最频繁请求的对象之一过期时,都会出现一些非常糟糕的负载峰值。发生这种情况时,在接下来的10秒钟内,对该对象的所有请求都将导致数据库加载,直到第一个线程完成数据库加载并将新对象放入缓存中为止。结果是数据库上的负载很短,但负载却非常高,并且许多用户需要等待请求完成。

我当前的实现通过跟踪当前是否正在加载哪个对象来改善数据库负载:

  1. 检查对象是否被缓存。
  2. 如果是,请从缓存中将其返回。
  3. 如果不是,请检查当前是否正在加载对象。
  4. 如果是,请等待另一个线程的加载完成,从缓存中获取新对象并返回它。
  5. 如果否,则将对象放入正在加载的对象列表中,完成后将其放入缓存中并返回。

通过这种实现,即使对象过期,也只有一个数据库操作。并且,由于数据库负载较低,它也将更快地完成。但这仍然意味着在对象加载期间请求该对象的所有用户都需要等待。

我真正想要的是只有第一个线程等待数据库加载,而所有其他线程仅在加载对象时返回“过期”对象。对我而言,响应时间比对象太旧几秒钟的事实更重要。

另外,当我注意到某个对象将在几秒钟后过期时,我可以异步刷新缓存。这更接近于EHCache的单一TTL模型,这意味着无需等待数据库加载

我真正的问题是:在我重新发明轮子之前,是否有任何现有框架已经实现了这样的功能(在Spring /
EHCache环境中)?或者也许对此的支持已经在Spring / EHCache中某个地方存在了,而我只是找不到正确的选项?


问题答案:

Ehcache提供了两种可以帮助您的构造:

  1. 提前刷新
  2. 计划刷新

两者都要求您更改与缓存交互的方式,因为它们都需要CacheLoader配置。

不幸的是,我找不到显示第二个选项示例的在线文档。它允许使用Quartz刷新缓存条目以对其进行调度。它也可以基于密钥生成器仅刷新一部分密钥。看看包中的类net.sf.ehcache.constructs.scheduledrefresh



 类似资料:
  • 我在一个Spring多线程web服务上遇到了一个缓存问题,它有一个数据库后端和基于EHCache的缓存。该服务有许多客户端都在一次又一次地请求同一个对象,每秒钟有几十个请求。只有几个对象被频繁地请求,而大量其他对象被不频繁地请求。对象可以每隔几分钟改变一次,所以缓存的TTL设置为一分钟。从数据库加载对象很慢,至少需要几秒钟。 起初我使用了一个朴素的实现来获取对象: 检查对象是否在缓存中 如果是,则

  • 我从缓存中读取数据。我正在使用ehcache。每次插入操作后,我都需要刷新缓存数据。如何使用注释?或者其他方式? ehcache。xml 存储库类: 公共接口NodeRepository扩展了JpaRepository{

  • 我在这里观看了spring loaded的演示http://www.youtube.com/watch?v=GTrNkhVnJBU 它对于类更改非常有效,但是有没有办法让它在视图层工作,特别是SpringMVC和Thymeleaf模板。

  • 问题内容: 我需要在应用程序中缓存一些数据,并且我正在考虑使用Ehcache。我有几个问题: 我是否需要其他服务器进行Ehcache? 我是否需要其他客户端来使用Ehcache? Ehcache如何与多个实例一起使用?甚至可以使用Ehcache创建类似共享缓存的内容吗? 问题答案: 我是否需要其他服务器进行Ehcache? 您可以在独立模式下使用Ehcache。在这种拓扑中,缓存数据保存在应用程序

  • 该组件目前已经升级为Scroll,请移步Scroll

  • 问题内容: 这是一个非常基本的问题-但我无法通过在线搜索找到答案。 我正在使用python控制ArcGIS,并且有一个简单的python脚本,该脚本调用了一些预先编写的代码。 但是,当我对预写代码进行更改时,它似乎没有导致任何更改。我导入了此模块,并尝试刷新它,但是没有任何反应。 我什至将它调用的文件移到了另一个位置,脚本仍然可以正常工作。昨天我做的一件事是我将所有python文件都添加到sys路