如果您的应用程序使用 Spring,一个好的开始是Caching 抽象,另请参阅这篇博客文章以获得很好的介绍
设计你的模型
您需要为这些列表的内容设计一个模型,您可能可以直接在您的 struts 应用程序中重用这些内容。您可能不想缓存Country
本身,但更多的是过滤列表,因为这可能是您获得最佳收益的地方。由于您的应用程序正在使用 Hibernate,因此无论如何您都可以轻松地在 Hibernate中为实体启用二级缓存。
设计好之后,您需要找到一种方法来生成足以识别应用程序用户的密钥。客户的 id 可能是一个很好的候选者。
创建您的存储库
然后,您可以创建一个存储库,根据一些参数提供这些列表的内容。理想情况下,唯一的论点是识别客户的关键,但您可以根据需要对其进行调整。例如:
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
}
...
}
这基本上指示 SpringmodelCache
用方法的结果更新缓存get
。在这种特殊情况下,customerId
是用于将值存储在缓存中的键。通常,如果您再次调用此方法,您的代码甚至不会被调用,因为 Spring 会在缓存中为该键找到一个条目并直接返回该值。
如果无法轻松创建密钥或者您需要更多上下文,则可以直接在注释中定义自定义KeyGenerator
或指定模式以用作 SPeL 表达式。
启用缓存支持
您可以通过@EnableCaching
java 配置的 XML 名称空间轻松打开缓存支持。实际的缓存被委托给一个缓存实现,它支持 ehcache、guava、并发哈希映射和 JSR-107 兼容的开箱即用缓存。您可以在此阶段配置所需的所有缓存提供程序特定设置:它不会影响您的代码,您甚至可以在不更改代码的情况下从一个提供程序更改为另一个提供程序
更新缓存
如果数据是只读的,仅此而已。如果这些列表的内容发生变化,您需要处理驱逐,以便get
再次调用您的方法来重新计算/刷新列表(请参阅 参考资料@CacheEvict
),或者您可以自己更新缓存的内容(请参阅参考资料CachePut
)。您还需要配置后端缓存,以便缓存的内容在集群的所有节点上保持一致。
要求更改特定列表的逻辑可能难以实现,因此您可能应该在设计模型时尽早关注该部分。