java - 我应该如何在 Spring 中实现缓存对象/系统?

标签 java multithreading spring caching service

我正在开发一个 Spring 应用程序,该应用程序拥有数百个用户,但有 100-100 万条数据作为响应发送给每个单独的用户。因此,性能对我们来说是一个大问题。我们使用 Java、JSP、jQuery、HTML 和 CSS。对于我正在从事的工作,我正在构建一个通知系统。例如,如果用户的商品已过期,我们会向该用户发送通知。然而,存在的问题是:

  • 我使用 jQuery/AJAX 每分钟轮询一次服务器
  • 每个查询的成本都非常高,因为我们每分钟都在数据库中为每个用户搜索数百个或数千个数据。而且,还有数百个用户。
  • 我们不会检查上次修改时间,而是检查此到期日期字段是否早于当前时间。

我现在的想法是使用一个线程来连续检查数据库中是否有新更新的项目,如果有新项目,我们会更新缓存对象的表示。用户将从缓存中检索数据。

我应该如何用 Spring 来实现这个?我应该使用什么数据结构?我应该为线程和缓存对象使用什么?我应该为此使用 Wea​​kHashMap 吗?

注意:我们的应用程序不支持注释驱动的 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/

相关文章:

java - 如何在 Ant 中使用带有 loadproperties 的 Base64 编码?

Java 3D数组: Storing cube,检索立方体切片

java - 销毁SurfaceView后如何返回主Activity?

java - 如何在Java中自定义ThreadFactory的所有子线程的名称?

java - 为什么并发修改共享对象的所有方法不需要同步修饰符?

java - 如何使用 Gradle 创建 Google App Engine 项目

java - Spring:如何使@Component线程安全?

java - getClass()方法的使用

java - 两个线程如何同时访问同步块(synchronized block)

具有多个 View 解析器的 Spring MVC