就其线程模型而言,hazelcast 如何执行映射条目驱逐?

How does hazelcast perform map entry eviction, in terms of its threading model?

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

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>

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

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

min-eviction-check-millis 是关于最大大小策略和由于最大大小而被驱逐的属性。 如果设置 min-eviction-check-millis=0;然后分区线程将检查每次更新的大小。 如果你设置 min-eviction-check-millis=1000;如果上一次检查早于 1 秒,则分区线程将检查更新的大小。

如果您希望您的地图更严格地遵守最大大小策略,则将其设置为 0。但它会产生每次更新时检查大小的开销。

Q1. Does the eviction operation run on the operation thread ?

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

Q2. Will the eviction operation put a lock on the entire partition it is working on ?

不是显式锁定。但是当分区线程正在执行逐出操作时,其他对该分区的操作将被阻塞。

Q3. Do I need to expect any performance hit, if I'm to follow the default value of 100ms, (which I believe is a very small value).

这是一个尺寸检查,但是是的,它是一个 overhead.If 您可以容忍您的地图超过最大尺寸;那么你可以设置更高的值。

Q4. How often will be the eviction operation carried out in the following scenario.

您尚未在此配置中设置逐出策略。所以 max-size 不会被检查。 min-eviction-check-millis 或 max-size 在这里没有效果。

max-idle-seconds(也称为 ttl)是另一回事。我们称之为到期。每个获取操作首先检查条目是否过期。但也是周期性的;一些条目是随机选择的,并检查它们是否过期。过期条目将被删除。