实现自定义缓存存储

Posted

技术标签:

【中文标题】实现自定义缓存存储【英文标题】:Implementing Custom Cache Store 【发布时间】:2021-10-23 20:50:47 【问题描述】:

刚刚基于官方现有的 RocksDb 为不同的后端存储实现了一个自定义缓存存储。

这让我产生了一些担忧/问题:

发现 PersistenceContextInitializerImpl 是自动生成的,并添加了从 Eclipse 导入来解决问题。现在我必须让它不导入并在 Eclipse 中显示为错误,是否有最佳实践方法来处理这个问题? 为什么 RocksDBDbStoreTest#testSegmentsRemovedAndAdded 在分段时调用为 false,因为此调用的 removeSegments 如果不分段,则按合同规定不应调用? 同一个类,为什么非分段测试用例的 buildConfig numSegments 设置或大于 1? 任何实现 NonBlockingStore 事务方法的商店示例?主要是想确保所有调用都来自同一个线程? 想要禁用兼容性测试,因为以前的版本不支持。将组更改为不稳定或手动,并且始终会被调用,这似乎与文档不匹配。从构建时运行中禁用它的正确方法是什么? 是否有任何可以执行或调整的持久存储性能/压力测试?

【问题讨论】:

【参考方案1】:

发现 PersistenceContextInitializerImpl 是自动生成的,并且添加了从 Eclipse 的导入来解决问题。现在我必须让它不导入并在 Eclipse 中显示为错误,是否有最佳实践方法来处理这个问题?

应该有办法让它运行注释处理器。我们使用 IntelliJ,它在 OOTB 中运行良好。

为什么当分段为 false 时调用 RocksDBDbStoreTest#testSegmentsRemovedAndAdded,因为这调用了如果不分段则按合同不应该调用的 removeSegments?

这只是进行这样的参数化测试的副作用。在实际运行时它不会被调用。如果它是分段的,你可以让测试忽略它。

if (segmented) return;

同一个类,为什么非分段测试用例的 buildConfig numSegments 设置或大于 1?

在运行任何集群模式时,Infinispan 数据容器始终是分段的。但是,在这些情况下,不需要对商店进行分段。如果商店没有分段,您可以忽略文档中的任何分段参数。

任何实现 NonBlockingStore 事务方法的商店示例?主要是想确保所有调用都来自同一个线程?

您可以在https://github.com/infinispan/infinispan/blob/main/persistence/jdbc/src/main/java/org/infinispan/persistence/jdbc/stringbased/JdbcStringBasedStore.java#L724 看到一些。这些方法可以并且将从不同的方法中调用,因此它存储了一个由 Transaction 键入的 Map。

想要禁用兼容性测试,因为以前的版本不支持。将组更改为不稳定或手动,并且始终会被调用,这似乎与文档不匹配。从构建时运行中禁用它的正确方法是什么?

不确定我是否理解这个问题。对于您的商店,您不需要任何兼容性测试,所以不要复制该测试文件。

是否有任何可以执行或调整的持久存储性能/压力测试?

我们有 https://github.com/infinispan/infinispan-benchmarks/blob/main/cachestores/src/main/java/org/infinispan/jmhbenchmarks/InfinispanHolder.java 应该可以工作。

【讨论】:

非常感谢

以上是关于实现自定义缓存存储的主要内容,如果未能解决你的问题,请参考以下文章

借鉴dubbo实现自定义缓存

rails test无法测试自定义缓存存储

webapi 自定义缓存实现

nginx缓存和自定义header

Mybatis源码分析自定义缓存分页的实现

java 自定义 LRU(最近最少使用)策略 实现 缓存机制