Ignite堆内缓存On-Heap Caching配置MaxSize参数含义说明
Apache Ignite堆内缓存evictionPolicy配置中maxSize参数的实际含义
LruEvictionPolicy(以及Ignite其他内置驱逐策略)下的maxSize参数,计量单位是缓存条目(Cache Entry)的数量,不是内存占用大小,你看到的示例里配置为1000000,就代表对应堆内缓存最多存储100万个键值对条目。
设计逻辑说明
很多人第一次接触这个配置会觉得和常规堆内存容量计量逻辑有偏差,这是缓存组件做性能权衡后的典型设计:
- 按条目数计数的驱逐判断逻辑是O(1)复杂度,只需要在缓存写入/更新时维护一个计数器即可,几乎不会给读写链路带来额外性能开销
- 如果按实际内存占用大小作为驱逐阈值,需要实时统计每个缓存键、值对象的堆内存占用,还要处理JVM对象对齐、引用开销等细节,统计逻辑本身会带来非常高的性能损耗,不适合高吞吐的缓存场景
- 当堆内缓存存储的条目数达到
maxSize阈值后,就会触发对应驱逐策略淘汰条目:比如LRU策略会优先淘汰最久未被访问的条目,被淘汰的只是堆内的缓存热副本,不会删除Ignite离堆存储、持久化存储中的真实数据,后续访问被淘汰的键时会自动从下层存储加载数据回堆内缓存。
参考配置示例
<bean class="org.apache.ignite.cache.CacheConfiguration"> <property name="name" value="myCache"/> <!-- 开启当前分布式缓存的堆内缓存功能 --> <property name="onheapCacheEnabled" value="true"/> <property name="evictionPolicy"> <!-- 配置LRU最近最少使用驱逐策略 --> <bean class="org.apache.ignite.cache.eviction.lru.LruEvictionPolicy"> <!-- 配置堆内缓存最大条目数为100万,该参数默认值为10万 --> <property name="maxSize" value="1000000"/> </bean> </property> </bean>
实践建议
如果需要控制堆内缓存的总内存占用,不需要自定义按内存计量的驱逐策略,只需要提前压测你的业务场景下,单条缓存键值对的平均堆内存占用,再用你规划给该缓存的堆内存上限除以单条平均大小,就能算出合理的maxSize值,这种方式在生产环境的稳定性和性能表现远好于实时统计内存占用的实现。
内容的提问来源于stack exchange,提问作者Justin Mathew
相关产品推荐
相关产品推荐

