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

蒂姆·詹森

我在具有数据库后端和基于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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

Spring Boot,使用EhCache进行缓存

来自分类Dev

使用HTML5缓存时无法加载外部资源

来自分类Dev

在页面刷新时使用jQuery重新加载JSON文件

来自分类Dev

使用memcached的Spring缓存

来自分类Dev

二级缓存从未使用spring3,hibernate4,ehcache命中?

来自分类Dev

使用Guava自动刷新缓存

来自分类Dev

Hibernate + Ehcache更新不会直接刷新缓存

来自分类Dev

涉及逐出时,Spring的缓存注释是否可以安全使用?

来自分类Dev

SelfPopulatingCache 现有缓存问题(Spring 4,EhCache 2.10.3)

来自分类Dev

Spring MVC是否缓存Web应用程序启动时未加载的bean文件?

来自分类Dev

使用 Ehcache 时的 ClosedChannelException 异常

来自分类Dev

在遍历数组时使用jQuery .get()前置的元素在页面刷新时以不同顺序加载

来自分类Dev

使用Redis的Spring缓存:NullPointerException

来自分类Dev

对于Spring MVC,ehcache或spring缓存中的最佳缓存实践是什么?

来自分类Dev

当使用contains_eager时,SQLAlchemy加载不相关的缓存对象

来自分类Dev

使用Spring的cut ehcache逐出策略

来自分类Dev

使用Spring以编程方式驱逐Ehcache元素

来自分类Dev

使用Spring的cut ehcache逐出策略

来自分类Dev

使用 ehcache 的 Spring 实现配置 JMX?

来自分类Dev

使用直接网址或刷新时,不会加载angular-ui-router嵌套视图的页面

来自分类Dev

使用Angular的$ timeout刷新图像时,取消新请求而不是当前加载请求

来自分类Dev

使用直接URL或刷新时,不会加载angular-ui-router嵌套视图的页面

来自分类Dev

如何使用 SQLite3 在页面加载/刷新时将数据插入 SQLite?

来自分类Dev

带有ehcache的spring,不可缓存的函数调用中缺少缓存

来自分类Dev

在Tomcat群集中使用ehcache进行缓存复制

来自分类Dev

使用EhCache在生产中缓存的对象数

来自分类Dev

如何使用Spring加载UrlResource?

来自分类Dev

如何在使用Spring启动时加载sql函数?

Related 相关文章

  1. 1

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

  2. 2

    Spring Boot,使用EhCache进行缓存

  3. 3

    使用HTML5缓存时无法加载外部资源

  4. 4

    在页面刷新时使用jQuery重新加载JSON文件

  5. 5

    使用memcached的Spring缓存

  6. 6

    二级缓存从未使用spring3,hibernate4,ehcache命中?

  7. 7

    使用Guava自动刷新缓存

  8. 8

    Hibernate + Ehcache更新不会直接刷新缓存

  9. 9

    涉及逐出时,Spring的缓存注释是否可以安全使用?

  10. 10

    SelfPopulatingCache 现有缓存问题(Spring 4,EhCache 2.10.3)

  11. 11

    Spring MVC是否缓存Web应用程序启动时未加载的bean文件?

  12. 12

    使用 Ehcache 时的 ClosedChannelException 异常

  13. 13

    在遍历数组时使用jQuery .get()前置的元素在页面刷新时以不同顺序加载

  14. 14

    使用Redis的Spring缓存:NullPointerException

  15. 15

    对于Spring MVC,ehcache或spring缓存中的最佳缓存实践是什么?

  16. 16

    当使用contains_eager时,SQLAlchemy加载不相关的缓存对象

  17. 17

    使用Spring的cut ehcache逐出策略

  18. 18

    使用Spring以编程方式驱逐Ehcache元素

  19. 19

    使用Spring的cut ehcache逐出策略

  20. 20

    使用 ehcache 的 Spring 实现配置 JMX?

  21. 21

    使用直接网址或刷新时,不会加载angular-ui-router嵌套视图的页面

  22. 22

    使用Angular的$ timeout刷新图像时,取消新请求而不是当前加载请求

  23. 23

    使用直接URL或刷新时,不会加载angular-ui-router嵌套视图的页面

  24. 24

    如何使用 SQLite3 在页面加载/刷新时将数据插入 SQLite?

  25. 25

    带有ehcache的spring,不可缓存的函数调用中缺少缓存

  26. 26

    在Tomcat群集中使用ehcache进行缓存复制

  27. 27

    使用EhCache在生产中缓存的对象数

  28. 28

    如何使用Spring加载UrlResource?

  29. 29

    如何在使用Spring启动时加载sql函数?

热门标签

归档