我需要为我的Web应用程序编写一个缓存解决方案。
基本上我有使用Hazelcast保存在内存中的不同对象的列表。每次应用程序启动时,对象都会从持久性存储加载到内存中。有时,对象会再次持久存回商店。
应用程序是实时的(许多websockets接收修改数据的客户端请求)所以我需要能够根据不同类型的id和/或简单的搜索标准非常快速地获取/检索这些对象。
我正在考虑使用不同的地图,其中键表示id,值是对象的实例。
例如某种类型的对象我会有一个数字地图(或多图):
...
等等。
这些对象应该在所有10个地图上同步,这意味着如果修改了一个对象,那么这些修改应该可用于所有地图。有时,由于此修改可能会影响搜索标准,因此某些对象应与其他键关联。
从代码角度来看,您将如何设计此机制?
你有更好的主意吗?
如果我在地图中保留相同的引用,将解决保持所有对象同步的问题。但是从缓存的角度来看,如何跟踪更改以重新计算新对象< - >标准协会?
答案 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中有许多功能可供您使用,因此您无需发明轮子并手动管理地图内容。
干杯, 维克