Flink MapState TTL
Flink MapState的失效时间是针对整个map还是单个key?
做需求用到了flink的mapstate,对Flink MapState的失效时间是针对整个map还是单个key产生了疑问,没找到明确的说明,遂写了个代码验证了一下。
Flink MapState 使用
flink MapState 引入代码。
StateTtlConfig ttlConfigString = StateTtlConfig.newBuilder(Time.seconds(10)).setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite).setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired).build();
MapStateDescriptor<String, List> descriptorString = new MapStateDescriptor<String, List>("test", String.class,List.class);
descriptorString.enableTimeToLive(ttlConfigString);
stateString = getRuntimeContext().getMapState(descriptorString);
设置失效时间10s
MapState 失效时间验证
@Override
public String map(Tuple2<String, JSONObject> value) throws Exception {
String uid = value.f0;
long time = new Date().getTime();
if (stateString.contains("test")) {
List list = stateString.get("test");
list.add("stri--" + uid + "--" + time);
stateString.put("test", list);
} else {
List timeList = new ArrayList<>();
timeList.add("stri--" + uid + "--" + time);
stateString.put("test", timeList);
}
if (time % 2 == 0) {
if (stateString.contains("test1")) {
List list = stateString.get("test1");
list.add("stri1--" + uid + "--" + time);
stateString.put("test1", list);
} else {
List timeList = new ArrayList<>();
timeList.add("stri1--" + uid + "--" + time);
stateString.put("test1", timeList);
}
}
if (CollectionUtils.isNotEmpty(stateString.get("test1")) && stateString.get("test").size() > 4) {
System.out.println(stateString.get("test"));
System.out.println(stateString.get("test1"));
}
return null;
}
如图所示:
时间戳为1610180645072的数据存在于test不存在于test1,即MapState的失效时间针对于单独的key。