void removeExpired() {
        Iterator<Metrics> iterator = sessionCache.values().iterator();
        long timestamp = System.currentTimeMillis();
        while (iterator.hasNext()) {
            Metrics metrics = iterator.next();

            if (metrics.isExpired(timestamp, timeoutThreshold)) {
                iterator.remove();
            }
        }
    }
This method relies on the response of database flush callback.
Push the data into the in-memory cache for all metrics except {@link MetricsExtension#supportUpdate()} labeled
as false.
Because those data(e.g. {@link ServiceTraffic}) is one-time writing in the whole TTL period, and some
database(e.g. BanyanDB) has in-memory cache at the server side to improve performance but trade off the 100%
eventual consistency of writing, which means database server could respond
{@link SessionCacheCallback#onInsertCompleted()} but ends of writing failure caused by crashing.
This fail-safe mechanism would require the cache of this kind of metric must be read through
{@link IMetricsDAO#multiGet(Model, List)} which guaranteed data existence.
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsSessionCache.java