【问题标题】:How should I implement a cache object/system in Spring?我应该如何在 Spring 中实现缓存对象/系统?
【发布时间】:2014-11-08 14:46:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java multithreading spring caching service


    【解决方案1】:

    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 magic AOP 负责其余的工作。 与 Spring 的所有内容一样,您可以使用任何您想要的实现,并且许多实现都是开箱即用的。而且您不需要为此更改代码分配,只需根据需要添加注释即可:)

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

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

    您可以选择您想要的,并通过例如指定缓存键寿命超时来实现您的要求,因此它将在特定时间后从缓存中删除,并在下次调用时重新计算。

    【讨论】:

    • 是的,基本上就是这个人所说的 :) 您的查询是否需要始终返回最新的内容?我想不会,因为它最终会被缓存。缓存可能与实时数据不同的最长时间是多少?
    • @mavarazy - 对于上面的两个方法签名,方法所在的类或接口名称是什么。它是扩展 JPARepository 类的接口类还是您定义的单独服务接口?提前致谢
    • @emeraldjava 它应该在实现和接口上都可以工作,那些注释是继承的,所以应该没问题。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2013-10-04
    • 2021-11-28
    • 2012-07-04
    • 2017-02-28
    • 1970-01-01
    • 2018-04-17
    • 2019-02-22
    相关资源
    最近更新 更多