我正在开发一个 Spring 应用程序,该应用程序拥有数百个用户,但有 100-100 万条数据作为响应发送给每个单独的用户。因此,性能对我们来说是一个大问题。我们使用 Java、JSP、jQuery、HTML 和 CSS。对于我正在从事的工作,我正在构建一个通知系统。例如,如果用户的商品已过期,我们会向该用户发送通知。然而,存在的问题是:
- 我使用 jQuery/AJAX 每分钟轮询一次服务器
- 每个查询的成本都非常高,因为我们每分钟都在数据库中为每个用户搜索数百个或数千个数据。而且,还有数百个用户。
- 我们不会检查上次修改时间,而是检查此到期日期字段是否早于当前时间。
我现在的想法是使用一个线程来连续检查数据库中是否有新更新的项目,如果有新项目,我们会更新缓存对象的表示。用户将从缓存中检索数据。
我应该如何用 Spring 来实现这个?我应该使用什么数据结构?我应该为线程和缓存对象使用什么?我应该为此使用 WeakHashMap 吗?
注意:我们的应用程序不支持注释驱动的 mvc。
最佳答案
Spring 在 3.x RELEASE 中引入了 Cache 的抽象。您可以在 Spring 官方文档中阅读相关内容(该网站由于某种原因今天已关闭:)),或者例如在这篇文章中。
http://dzone.com/articles/spring-cache-abstraction-0
有了这个抽象,您需要做的就是向您的服务添加一些注释来启用缓存,例如
为缓存添加值
@Cacheable("customers")
public Customer findCustomer(long customerId) {...}
删除缓存中的值
@CacheEvict(value="customer", allEntries = true)
public void removeAllCustomers(long customerId) {...}
并启用可缓存的 spring 配置。 Spring 魔法 AOP 会处理剩下的事情。 与 Spring 的一切一样,您可以使用任何您想要的实现,并且许多实现都是开箱即用的。您不需要为此更改代码分配,只需根据需要添加注释:)
除了 Spring 原生支持之外,还有 Guava Cache
https://code.google.com/p/guava-libraries/wiki/CachesExplained
您可以选择您想要的内容,并通过例如指定缓存 key 生命周期来实现您的要求,这样它将在特定时间后从缓存中删除,并在下次调用时重新计算。
关于java - 我应该如何在 Spring 中实现缓存对象/系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818285/