private List<BlockClientLog<T>> parseClientLogs(List<Object> elements) {
        if (elements.size() <= 2) {
            return Collections.emptyList();
        }
        elements = (List<Object>) elements.get(2);
        int elementCount = elements.size();
        List<BlockClientLog<T>> logs = new ArrayList<>(elementCount / LOG_ENTRY_ELEMENT_COUNT);
        for (int i = 0; i < elementCount; i += LOG_ENTRY_ELEMENT_COUNT) {
            byte[] bytes = ((ByteBuf) elements.get(i)).array();
            boolean isBlockAction = bytes[0] == BLOCK_ACTION_FLAG;
            T clientId = decodeClientId((ByteBuf) elements.get(i + 1));
            if (isBlockAction) {
                long blockEndTimeMillis = decodeBlockEndTime((long) elements.get(i + 2));
                logs.add(new BlockClientLog<>(clientId, blockEndTimeMillis, true));
            } else {
                logs.add(new BlockClientLog<>(clientId, 0, false));
            }
        }
        return logs;
    }
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