多级进程内缓存的更好选择是什么?
在我的spring启动应用程序中,我需要实现进程内多级缓存以下是需要缓存的数据示例:
客户名称(密钥,字符串) – 数据实体名称(密钥,字符串) – config-1(值,JSONObject) – config-2(值,JSONObject)
我计划有几百个客户条目,每个条目最多有一百个“配置”JSONObjects
我正在寻找ehcache:
Cache cache = manager.getCache("sampleCache1"); Element element = new Element("key1", "value1"); cache.put(element);
在这种情况下,我会用“Customer_Name”代替“key1”,用“My Customer”代替“value1”,但是我需要构建一个层次结构:
customer -data entity -config
我不知道如何用ehcache做到这一点。 我也不确定我是否有更好的选择。
有没有人用ehcache或任何其他库实现这样的多级分层缓存?
对于表示法,我使用类似地图的缓存: value = Cache.get(key)
,这比EHCache2 Element
更常见
选项1:构造复合键对象
class CustomerConfigurationKey { String customerKey; String dataEntityKey; // equals() and hashCode() }
这是非常标准的键/值存储,包括普通地图。 我在cache2k快速入门中解决了这个问题。
选项2:使用多级缓存
将缓存放在缓存中并访问如下: data.get(customerKey).get(dataEntityKey)
。
您可以在cache2k基准测试中找到“Composite Key”与“Multi Level Caches”的示例DateFormattingBenchmark
如果你在第一级有一个小集合,这只能很好地工作。 在您的情况下,每个客户最终会得到一个单独的缓存,这会花费很多。 所以,这只是为了完整性,在你的场景中没有真正的选择。
选项3:使用第二级地图
使用Cache
构造单个缓存。
如果通常所有客户数据都在短时间内使用,那么在更精细的级别上缓存是没有意义的,因为客户的所有数据通常都会在内存中。 另一个例子:当客户不再活动时,缓存将过期,所有客户数据都可以从内存中删除。
更新映射的单个条目将具有正确解决所需的并发问题,例如,通过复制并仅将不可变映射放入缓存或使用ConcurrentHashMap
。
- 如何通过相对路径引用本地XSD文件
- 任何可以限制内存缓存的内存使用的Java缓存,而不仅仅是实例计数?
- Ehcache设置为永恒,但无论如何都会忘记元素?
- 多个线程可以使用相同CacheManager的相同Ehcache对象吗?
- 如何在不使用查询缓存的情况下缓存Spring Data JPA查询方法的结果?
- 写后面的缓存Ehcache新function?
- java.lang.NoClassDefFoundError:org / hibernate / cache / EntityRegion配置EHCache
- Spring MVC的ehcache或spring cache中最好的Cache实践是什么?
- 是否可以使用多个ehcache.xml(在不同的项目中,同样的战争)?