private synchronized void evict() {
        while (totalSize.get() > maxSize && cache.size() > 1) {
            Optional.ofNullable(cache.pop()).ifPresent(entry -> {
                V value = entry.getValue();
                afterRemoveValue(value);
            });
        }

        stats.markEvict(cacheName);
    }
An asynchronous LRU cache that supports asynchronous value computation.

@param <K> key type
@param <V> value type, NOTE: V must not override equals and hashCode
s3stream/src/main/java/com/automq/stream/s3/cache/AsyncLRUCache.java