设计缓存初始化程序

时间:2016-01-29 14:50:00

标签: java caching design-patterns hazelcast

我需要为我的Web应用程序编写一个缓存解决方案。

基本上我有使用Hazelcast保存在内存中的不同对象的列表。每次应用程序启动时,对象都会从持久性存储加载到内存中。有时,对象会再次持久存回商店。

应用程序是实时的(许多websockets接收修改数据的客户端请求)所以我需要能够根据不同类型的id和/或简单的搜索标准非常快速地获取/检索这些对象。

我正在考虑使用不同的地图,其中键表示id,值是对象的实例。

例如某种类型的对象我会有一个数字地图(或多图):

  1. map1:< some_internal_key,object>
  2. map2:< some_other_internal_key,object>
  3. map3:< some_other_internal_key2,object>
  4. map4:< a_search_criteria,list< objects_meeting_the_criteria> >
  5. map5:< another_search_criteria,list< objects_meeting_the_criteria> >
  6. ...

    等等。

    这些对象应该在所有10个地图上同步,这意味着如果修改了一个对象,那么这些修改应该可用于所有地图。有时,由于此修改可能会影响搜索标准,因此某些对象应与其他键关联。

    从代码角度来看,您将如何设计此机制?

    你有更好的主意吗?

    如果我在地图中保留相同的引用,将解决保持所有对象同步的问题。但是从缓存的角度来看,如何跟踪更改以重新计算新对象< - >标准协会?

3 个答案:

答案 0 :(得分:2)

为什么不使用谓词从地图中检索对象?另外,如果你需要大吞吐量,你可以考虑使用入门处理器,如果你的计划是修改项目吗?

答案 1 :(得分:1)

仅存储对象一次,然后使用该键引用存储的对象。

所以对你的例子来说:

map1: < some_internal_key, object >

然后:

map2: < some_other_internal_key, some_internal_key >

您可以将map2保留在内存中,因为它没有一致性问题。所以额外的查找很便宜。

答案 2 :(得分:0)

正如@travikk所提到的,Hazelcast不仅支持按键查找,还支持按对象的不同属性查找 - Distributed Query / Predicate API。 Hazelcast还支持indexes以加快搜索速度。如果您需要根据定义的条件填充另一个地图/缓存,则可以使用Continuous Query Cache。 当然,您可以将对象存储在不同的地图中,但如果您需要共同定位相关数据,请查看Data Affinity技术。 如果您需要以事务方式修改多个分布式对象(地图,列表,集等)的内容,则可以使用Transactional Context

如您所见,Hazelcast中有许多功能可供您使用,因此您无需发明轮子并手动管理地图内容。

干杯, 维克