You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TTL的Hazelcast IMap:实现读写时自动更新TTL

在Hazelcast IMap中实现GET/PUT时原子性重置Key的TTL

PUT操作重置TTL

对于PUT(新增或更新)操作,直接使用IMap带TTL参数的put方法即可,每次调用都会为目标key设置新的TTL,覆盖原有过期时间:

// 假设TTL设置为300秒
int ttlSeconds = 300;
IMap<String, MyValue> map = hazelcastInstance.getMap("my-map");

// 新增或更新key时重置TTL
map.put("key1", new MyValue("value1"), ttlSeconds, TimeUnit.SECONDS);

GET操作原子性重置TTL

普通的get后再调用setTTL是非原子操作,会存在并发竞态问题。要实现原子性的“获取值+重置TTL”,可以使用Hazelcast的EntryProcessor,它会在key所在的分区节点上执行本地操作,全程单线程处理目标key,避免并发冲突。

自定义EntryProcessor实现

import com.hazelcast.core.EntryProcessor;
import com.hazelcast.map.EntryBackupProcessor;
import com.hazelcast.map.MutableEntry;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;

public class RefreshTtlEntryProcessor implements EntryProcessor<String, MyValue, MyValue>, Serializable {
    private final int ttlSeconds;

    public RefreshTtlEntryProcessor(int ttlSeconds) {
        this.ttlSeconds = ttlSeconds;
    }

    @Override
    public MyValue process(MutableEntry<String, MyValue> entry) {
        if (!entry.exists()) {
            return null;
        }
        // 获取当前值
        MyValue value = entry.getValue();
        // 重置TTL(通过重新设置值的方式,值不变但更新过期时间)
        entry.setValue(value, ttlSeconds, TimeUnit.SECONDS);
        // 返回获取到的值
        return value;
    }

    @Override
    public EntryBackupProcessor<String, MyValue> getBackupProcessor() {
        // 同步备份节点的TTL,保证数据一致性
        return new RefreshTtlBackupProcessor(ttlSeconds);
    }

    // 备份处理器:确保备份节点的TTL同步更新
    private static class RefreshTtlBackupProcessor implements EntryBackupProcessor<String, MyValue>, Serializable {
        private final int ttlSeconds;

        public RefreshTtlBackupProcessor(int ttlSeconds) {
            this.ttlSeconds = ttlSeconds;
        }

        @Override
        public void processBackup(MutableEntry<String, MyValue> entry) {
            if (entry.exists()) {
                entry.setValue(entry.getValue(), ttlSeconds, TimeUnit.SECONDS);
            }
        }
    }
}

调用EntryProcessor执行原子操作

// 获取IMap实例
IMap<String, MyValue> map = hazelcastInstance.getMap("my-map");
int ttlSeconds = 300;

// 原子性完成"获取值+重置TTL"
MyValue value = map.executeOnKey("key1", new RefreshTtlEntryProcessor(ttlSeconds));

关键说明

  • EntryProcessor在key所属的分区节点本地执行,整个操作对该key是原子的,不会出现并发场景下的TTL更新丢失问题。
  • 如果不需要同步备份节点的TTL,可以将getBackupProcessor()返回null,但生产环境建议保留备份处理器,保证数据一致性。
  • 自定义的EntryProcessor必须实现Serializable接口,因为Hazelcast需要将其序列化后传输到目标节点执行。

内容的提问来源于stack exchange,提问作者Scientist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:57:36