缓存最佳实践java

时间:2014-03-05 11:19:44

标签: spring hibernate caching jboss spring-cache

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

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

谢谢。

1 个答案:

答案 0 :(得分:3)

如果您的应用程序使用Spring,那么Caching abstraction就是一个好的开始,另请参阅this blog post for a good introduction

设计模型

您需要为那些可能直接在struts应用程序中重用的列表的内容设计一个模型。您可能不希望缓存Country本身,而是更多过滤列表,因为这可能是您获得最佳收益的地方。由于您的应用程序正在使用Hibernate,因此无论如何都可以轻松地enable the 2nd level cache in Hibernate

设计完成后,您需要找到一种方法来生成足以识别应用程序用户的密钥。可能客户的身份是一个很好的候选人。

创建存储库

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

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或指定要使用的模式as a SPeL expression in the annotation directly

启用缓存支持

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

更新缓存

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

强制要求特定列表更改的逻辑可能很难实现,所以在设计模型时,您应该尽早关注该部分。