当前位置: 首页 > 知识库问答 >
问题:

集合的Flink状态TTL过期

商飞龙
2023-03-14

https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/stream/state/state.html#state-time-to-live-ttl

我想确定TTL特性启用的位置,是在key字段上还是在value字段上。特别是,假设我有一个像这样的mapState结构:

mapState = Map[String,List[String]]
e.g. val mapState = Map("haha" -> List("foo","bar")) in Scala
where "haha" is the key of the mapState and List("foo","bar") is the value

如果我要通过StateTtlConfig在mapState上设置1分钟的TTL,那么立即(少于1分钟)写入List中的一个值,比如“foo”。

那么1分钟后,当TTL开火时,是键“哈哈”过期还是值“bar”过期?

换句话说,如果它在密钥上过期,我的理解是mapState将保持不变

mapstate=Map(“haha”->List(“foo”,“bar”))

mapState = Map("haha" -> List("foo"))

因为值“bar”将在1分钟后过期而未被访问。

希望,我把问题说清楚了,提前谢谢你任何形式的帮助。

共有1个答案

师向文
2023-03-14

使用TTL访问状态的代码如下所示:

<SE extends Throwable, CE extends Throwable, CLE extends Throwable, V> TtlValue<V> getWrappedWithTtlCheckAndUpdate(
        SupplierWithException<TtlValue<V>, SE> getter,
        ThrowingConsumer<TtlValue<V>, CE> updater,
        ThrowingRunnable<CLE> stateClear) throws SE, CE, CLE {
        TtlValue<V> ttlValue = getter.get();
        if (ttlValue == null) {
            return null;
        } else if (expired(ttlValue)) {
            stateClear.run();
            if (!returnExpired) {
                return null;
            }
        } else if (updateTsOnRead) {
            updater.accept(rewrapWithNewTs(ttlValue));
        }
        return ttlValue;
    }

验证该值是否过期的方法如下所示:

    static <V> boolean expired(@Nullable TtlValue<V> ttlValue, long ttl, long currentTimestamp) {
        return ttlValue != null && expired(ttlValue.getLastAccessTimestamp(), ttl, currentTimestamp);
    }

这基本上意味着在本例中,它将检查整个列表的TTL,而不是单独的元素。因此,根据statettlconfig的不同,整个列表将过期,或者整个列表不会过期。

 类似资料:
  • 我想使用早期触发逻辑进行窗口聚合(您可以认为聚合是由窗口关闭或特定事件触发的),我阅读了文档:https://ci . Apache . org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows . html # incremental-window-aggregate-with-aggregate functi

  • PS:我们可以将flink状态存储在dynamoDB中,并在那里创建一个API吗?还是以任何其他方式坚持和向外部世界揭露国家?

  • 在广播模式的文档中,提到没有RocksDB状态后端: 如果应用程序使用rocksdb作为状态后端,这将如何影响保存点行为?这是否意味着状态在保存点期间不存储,因此不会恢复?

  • 主要内容:1.算子状态概述,2.算子状态 编程案例,3.状态持久化和状态后端,4.状态编程总结1.算子状态概述 1.1 算子状态分类 算子状态: 列表状态, 联合列表状态, 广播状态 ListState, UnionListState, BroadcastState 1.2 状态分析 列表状态: 与 Keyed State 中的 ListState 一样,将状态表示为一组数据的列表。与 Keyed State 中的列表状态的区别是:在算子状态的上下文中,不会按键(key)分别处理状态,所以

  • 主要内容:1.Flink 中的状态,2.按键分区状态 (keyed state),3.状态生存时间 Ttl,4.状态一致性说明1.Flink 中的状态 1.1 状态管理 状态的访问权限。我们知道 Flink 上的聚合和窗口操作,一般都是基于 KeyedStream的,数据会按照 key 的哈希值进行分区,聚合处理的结果也应该是只对当前 key 有效。然而同一个分区(也就是 slot)上执行的任务实例,可能会包含多个 key 的数据,它 们同时访问和更改本地变量,就会导致计算结果错误。所以这时状态

  • 在阅读了Flink的文档并四处搜索后,我无法完全理解Flink的句柄在其窗口中的状态。假设我有一个每小时滚动的窗口,其中包含一个聚合函数,该函数将消息累积到某个java pojo或scala case类中。该窗口的大小将与一小时内进入该窗口的事件数量相关联,还是仅仅与POJO/Case类相关联,因为我将事件累加到该对象中。(例如,如果将10000个味精数成一个整数,大小会接近10000*味精大小还