private void removeExpiredRequestTokenBuckets() throws InterruptedException {
        Iterator<TokenBucket> iterator = ipToRequestTokenBucket.values()
                .iterator();
        int processed = 0;
        long startTimeNanos = System.nanoTime();
        while (iterator.hasNext()) {
            TokenBucket bucket = iterator.next();
            long lastAccessTimeNanos = bucket.getLastRefillTimeNanos();
            if ((startTimeNanos - lastAccessTimeNanos) > IDLE_ENTRY_TTL_NANOS
                    && bucket.isTokensMoreThanOrEqualsToInitialTokens()) {
                iterator.remove();
            }
            processed++;
            // To avoid hogging the CPU for a long time
            // and cause the server cannot serve for users
            if (processed >= BATCH_SIZE) {
                processed = 0;
                if (System.nanoTime() - startTimeNanos > SLEEP_THRESHOLD_NANOS) {
                    Thread.sleep(SLEEP_MILLIS);
                    startTimeNanos = System.nanoTime();
                }
            }
        }
    }
We don't add a skip list of access time for a fast iterate because it requires inserting a
new item to update the access time for each client request and needs to store a lot of items.
So just using and iterating ConcurrentHashMap is enough
turms-gateway/src/main/java/im/turms/gateway/access/client/common/IpRequestThrottler.java