java-在使用Spring / EHCache加载时刷新缓存
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在使用Spring / EHCache加载时刷新缓存,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1923字,纯文字阅读大概需要3分钟。
内容图文
我在具有数据库后端和基于EHCache的缓存的Spring多线程Web服务上遇到缓存问题.该服务有许多客户端一次又一次地请求同一个对象,每秒有数十个请求.仅频繁请求几个对象,而不经常请求大量其他对象.对象可以每隔几分钟更改一次,因此将缓存的TTL设置为一分钟.从数据库加载对象很慢,并且至少需要几秒钟.
首先,我使用了一个简单的实现来获取对象:
>检查对象是否在缓存中.
>如果是,请从缓存中将其返回.
>否则,请从数据库加载它,然后将其放入缓存中并返回.
最初在本地进行测试时,此方法运行良好.但是,在速度更快的服务器上进行的性能测试显示,每次缓存中最频繁请求的对象之一过期时,都会出现一些非常糟糕的负载峰值.发生这种情况时,在接下来的10秒钟内,对该对象的所有请求都将导致数据库加载,直到第一个线程完成数据库加载并将新对象放入缓存中为止.结果是数据库上的负载很短,但负载却非常高,并且许多用户需要等待请求完成.
我当前的实现通过跟踪当前是否正在加载哪个对象来改善数据库负载:
>检查对象是否已缓存.
>如果是,请从缓存中将其返回.
>否则,请检查当前是否正在加载对象.
>如果是,请等待另一个线程的加载完成,从缓存中获取新对象并返回它.
>否,将对象放入正在加载的对象列表中,完成后将其放入高速缓存中并返回.
通过这种实现,即使对象过期,也只有一个数据库操作.并且,由于数据库负载较低,它也将更快完成.但这仍然意味着在对象加载期间请求该对象的所有用户都需要等待.
我真正想要的是只有第一个线程等待数据库加载,而所有其他线程仅在加载对象时返回“过期”对象.对于我来说,响应时间比对象太旧几秒钟的事实更重要.
另外,当我注意到某个对象将在几秒钟后过期时,我可以异步刷新缓存.这更接近于EHCache的单一TTL模型,这意味着无需等待数据库加载
我真正的问题是:在重新发明轮子之前,是否有任何现有框架已经实现了这样的功能(在Spring / EHCache环境中)?或者也许对此的支持已经在Spring / EHCache中某个地方存在了,而我只是找不到正确的选项?
解决方法:
Ehcache提供了两种可以帮助您的构造:
> Refresh ahead
>计划刷新
两者都需要您更改与缓存的交互方式,因为它们都需要配置CacheLoader.
不幸的是,我找不到显示第二个选项示例的在线文档.
它允许使用Quartz刷新缓存条目进行调度.它也可以基于密钥生成器仅刷新一部分密钥.
看看net.sf.ehcache.constructs.scheduledrefresh包中的类
内容总结
以上是互联网集市为您收集整理的java-在使用Spring / EHCache加载时刷新缓存全部内容,希望文章能够帮你解决java-在使用Spring / EHCache加载时刷新缓存所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。