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

时间:2014-11-08 14:46:59

标签: java multithreading spring caching service

我正在开发一个Spring应用程序,该应用程序有数百个用户,但有1亿到1百万条数据作为对每个用户的响应发送。因此,性能对我们来说是一个大问题。我们利用Java,JSP,jQuery,HTML和CSS。对于我正在进行的工作,我正在建立一个通知系统。例如,如果用户的项目已超过其到期日期,则我们会向用户发送通知。但问题是:

  • 我每分钟使用jQuery / AJAX轮询服务器
  • 每个查询都非常昂贵,因为我们在数据库中搜索每个用户每分钟数以万计的数据。此外,还有数百名用户。
  • 我们没有检查上次修改时间,我们正在检查此到期日期字段是否在当前时间之前。

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

我应该如何用Spring实现这个?我应该使用哪些数据结构?我应该为线程和缓存对象使用什么?我应该使用WeakHashMap吗?

注意:我们的应用程序不支持注释驱动的mvc。

1 个答案:

答案 0 :(得分:2)

Spring在3.x RELEASE中引入了Cache的抽象。你可以在官方的Spring文档中阅读它(由于某种原因,该网站今天已经关闭:)),或者在这篇文章中。例如。

http://java.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 Magic AOP负责其余部分。 作为Spring的一切,您可以使用任何您想要的实现,并且开箱即用支持许多实现。而且您不需要为此更改分配代码,只需根据需要添加注释:)

除了Spring原生支持外,还有Guava Cache

https://code.google.com/p/guava-libraries/wiki/CachesExplained

您可以选择所需内容,并通过指定缓存密钥生命超时来实现您的需求,因此它将在特定时间后从缓存中删除,并在下次调用时重新计算。