首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存最佳实践java

缓存最佳实践java
EN

Stack Overflow用户
提问于 2014-03-05 11:19:43
回答 1查看 4.8K关注 0票数 4

我有一个基于Struts的B2B应用程序。页面中可以有20-25个列表框,列表框中的数据可能因客户而异。例如,列表框将是符合条件的国家列表、产品品牌列表等。在一个客户下面将有多个用户。在当前解决方案中,当客户下的第一个用户登录时,会在应用程序范围(ServletContext)中设置customer对象。采用这种方法是为了避免页面加载时的数据库调用。

我们期待重新架构的解决方案,预计50%的客户基础增长.新的应用程序将在Spring上使用Hibernate-JPA,最后应用程序将部署在JBoss集群上。寻找最佳缓存方法的专家意见来处理列表框数据。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 13:36:30

如果您的应用程序正在使用Spring,那么最好的开始是缓存抽象,请参见这篇博文对一个很好的介绍

设计你的模型

您需要为这些列表的内容设计一个模型,您可能可以在struts应用程序中直接重用该模型。您可能不想缓存Country本身,但更多的是筛选列表,因为这可能是您获得最佳收益的地方。由于您的应用程序使用Hibernate,您可以轻松地为实体进行在Hibernate中启用二级缓存

一旦设计好了,就需要找到一种方法来生成足以识别应用程序用户的密钥。也许顾客的身份是一个很好的人选。

创建存储库

然后,您可以创建一个存储库,根据一些参数提供这些列表的内容。理想情况下,唯一的参数将是标识客户的关键,但您可以根据您的需要对其进行调整。例如:

代码语言:javascript
复制
public class YourRepositoryImpl implements YourRepository {

  @Cacheable("modelCache")
  public YourModel get(String customerId) {
    // compute the list for that customer. 
    // Only called if not in the cache
  }

  ...
}

这基本上指示Spring使用modelCache方法的结果更新get缓存。在这种情况下,customerId是用于在缓存中存储值的键。通常,如果再次调用此方法,代码甚至不会被调用,因为Spring将在缓存中为该键找到一个条目,并将直接返回该值。

如果无法轻松创建密钥,或者需要更多上下文,则可以定义自定义KeyGenerator或指定使用直接作为注释中的SPeL表达式。的模式。

启用缓存支持

您可以通过@EnableCaching java配置的XML命名空间轻松地打开缓存支持。实际缓存委托给缓存实现,支持ehcache、番石榴、并发散列映射和JSR-107兼容缓存。您可以在此阶段配置所有特定于缓存提供程序的设置:它不会影响您的代码,甚至可以在不更改代码的情况下从一个提供程序更改为另一个提供程序。

更新缓存

如果数据是只读的,那就差不多了。如果这些列表的内容发生变化,则需要处理驱逐,以便再次调用get方法来重新计算/刷新列表(请参阅@CacheEvict),或者您可以自己更新缓存的内容(参见CachePut)。您还需要配置后端缓存,以便在集群的所有节点上缓存的内容是一致的。

要求更改特定列表的逻辑很难实现,因此在设计模型时,您可能应该尽早将重点放在这一部分上。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22196230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档