private Mono<Void> resetAndSyncAllBlockedClients() {
        LOGGER.info("Starting resetting and synchronizing blocked clients");
        blockedClientIdToBlockEndTimeMillis.clear();
        blockedClientSkipList.clear();
        localTimestampMillis = UNINITIALIZED_TIMESTAMP;
        localLogId = UNINITIALIZED_LOG_ID;
        Mono<List<Object>> result = redisClient.eval(getBlockedClientsScript, getBlocklistKey());
        return result.doOnNext(elements -> {
            long timestampMillis = (long) elements.get(0);
            if (timestampMillis < 0) {
                // The blocklist is empty,
                // so we can set the local log ID to 0.
                localLogId = 0;
                return;
            }
            int logId = (int) (long) elements.get(1);
            localTimestampMillis = timestampMillis;
            localLogId = logId;
            List<BlockedClient<T>> blockedUsers = parseBlockedClients(elements);
            long now = System.currentTimeMillis();
            for (BlockedClient<T> blockedClient : blockedUsers) {
                addBlockedClient(blockedClient, now);
            }
        })
                .doOnSuccess(ignored -> LOGGER.info("Reset and synchronized blocked clients"))
                .doOnError(t -> LOGGER.error("Failed to reset and synchronize blocked clients", t))
                .then();
    }
Used to remove the local expired blocked clients quickly, even if there are a lot of blocked
clients so that we can run eviction more frequently.

@implNote It is acceptable to store the same IP or the user ID with different block times in
          the skip list because it is how the skip list works.
turms-server-common/src/main/java/im/turms/server/common/domain/blocklist/manager/BlocklistServiceManager.java