dma*_*a_k 5 java caching infinispan evict
我想使用Infinispan作为图像二进制数据(Java类型byte[])的缓存.我假设Infinispan默认策略是LIFO或类似的策略,更喜欢保留最近使用/添加的缓存实体.
在我的loadtest场景中,我在一轮中进行四次调用以检索给定的实体.假设第一个调用永远不会到达缓存(因为每一轮都请求一个唯一的实体),但是后面三个总是命中缓存.所以预期的配置文件如下所示:
#1: MISS-HIT-HIT-HIT
#2: MISS-HIT-HIT-HIT
...
Run Code Online (Sandbox Code Playgroud)
当我使用COUNT具有一定数量实体的驱逐类型配置Infinispan时,它可以正常工作:
<local-cache name="imagesCache" statistics="true">
<!-- lifespan="30 min" max-idle="30 min" interval="1 min" -->
<expiration lifespan="1800000" max-idle="1800000" interval="60000" />
<memory>
<binary eviction="COUNT" size="500" />
</memory>
</local-cache>
Run Code Online (Sandbox Code Playgroud)
基于我在loadtest中捕获的数字的缓存命中率: (2952-738)/2952 = 0.75
当我更改要保留在内存中的实体数量(<binary eviction="COUNT" size="100" />)时,命中率不会改变(如预期的那样).
在运行期间,我测量了负载测试之前和之后的堆大小(在几次GC调用之后进行的测量),结果是500个实体占用大约114.895.000 - 62.445.000 = 52.450.000字节=每个实体大约100KB:

之后,我重新启动了应用程序,只对缓存配置进行了这么小的改动:
<memory>
<binary eviction="MEMORY" size="1000000" />
</memory>
Run Code Online (Sandbox Code Playgroud)
我希望Infinispan的性能具有相同的配置文件,但事实证明,一旦给定的内存量完全分配,新添加的实体不会驱逐旧实体但会立即被驱逐.这意味着大约在添加100个实体之后,所有四个缓存结果缓存未命中的请求.可以看出比率现在是0.58而不是0.75:

缓存命中率: (2952-738-504)/2952 = 0.579
如果我增加内存,确实命中率接近0.75但是我希望命中率与内存大小无关(假设内存可以适合至少几个实体).
一旦我将钝化配置为文件,基于内存的驱逐策略就会按预期开始工作:
<local-cache name="imagesCache" statistics="true">
<expiration lifespan="1800000" max-idle="1800000" interval="60000" />
<persistence passivation="true">
<file-store path="/var/cache/infinispan" purge="true">
<write-behind thread-pool-size="5" />
</file-store>
</persistence>
<memory>
<binary eviction="MEMORY" size="1000000" />
</memory>
</local-cache>
Run Code Online (Sandbox Code Playgroud)
钝化→属性显示钝化次数为1121(等于驱逐次数),激活→属性显示激活次数为1242.这意味着某些实体已被激活多次(并立即被驱逐,这是不好的).一般来说,我希望激活次数为零.
知道如何配置基于内存的驱逐策略,以便缓存命中率与基于计数的策略相同吗?
我上面读过的主题(他们没有直接回答上述问题):
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |