就其线程模型而言,hazelcast如何执行地图输入驱逐?

Din*_*esh 4 java distributed-cache distributed-caching hazelcast hazelcast-imap

我知道<min-eviction-check-millis>在hazelcast配置中定义了在检查此映射的分区是否可逐出之前应该通过的最短时间(以毫秒为单位).因此,在每个配置的间隔期间,将根据配置的驱逐策略在地图中执行驱逐.我有以下与此领域相关的问题.

Q1.驱逐操作是否在操作线程上运行?

Q2.驱逐操作会锁定它正在处理的整个分区吗?

Q3.如果我要遵循100毫秒的默认值(我相信这是一个非常小的值),我是否需要预期会有任何性能损失.

Q4.在以下情景中,驱逐行动的频率如何?

<map name="employees">
    <in-memory-format>BINARY</in-memory-format>
    <backup-count>1</backup-count>
    <max-idle-seconds>1800</max-idle-seconds>
    <eviction-policy>NONE</eviction-policy>
    <time-to-live-seconds>0</time-to-live-seconds>
    <min-eviction-check-millis>1000</min-eviction-check-millis>
    <max-size>0</max-size>
    <eviction-percentage>0</eviction-percentage>
    <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>

</map>
Run Code Online (Sandbox Code Playgroud)

请注意,虽然没有配置驱逐策略和百分比,但最大空闲时间设置为1800秒.

上述问题的答案将帮助我在大规模部署中对这些配置所使用的值做出明智的决定.

jav*_*nes 6

min-eviction-check-millis是max-size政策和由于max-size导致的驱逐的属性.如果设置min-eviction-check-millis = 0; 然后分区线程将检查每次更新的大小.如果设置min-eviction-check-millis = 1000; 然后,如果先前的检查早于1秒,则分区线程将检查更新的大小.

如果您希望地图更严格地遵守max-size策略,则将其设置为0.但是在每次更新时都会检查大小.

Q1.驱逐操作是否在操作线程上运行?

它在分区线程上运行.分区线程执行基于分区的操作(map.put,map.get,map.remove等).

Q2.驱逐操作会锁定它正在处理的整个分区吗?

不是明确的锁定.但是,当分区线程正在执行逐出操作时,将阻止此分区上的其他操作.

Q3.如果我要遵循100毫秒的默认值(我相信这是一个非常小的值),我是否需要预期会有任何性能损失.

这是一个尺寸检查,但是它是一个开销.如果你容忍你的地图超过max-size; 那么你可以设置更高的值.

Q4.在以下情景中,驱逐行动的频率如何?

您尚未在此配置中设置驱逐策略.因此不会检查max-size.min-eviction-check-millis或max-size在这里没有效果.

max-idle-seconds(也就是ttl)是另一回事.我们称之为到期.每个get操作首先检查条目是否过期.但也要定期; 随机选择一些条目并检查它们是否已过期.已过期的条目已删除.