public Mono<Void> destroy(long timeoutMillis) {
        return Mono.defer(() -> {
            long startTime = System.nanoTime();
            return Mono
                    .fromFuture(nativeClient.shutdownAsync(0, timeoutMillis, TimeUnit.MILLISECONDS))
                    .then(Mono.defer(() -> {
                        long elapsedTime =
                                (System.nanoTime() - startTime) / DateTimeUtil.NANOS_PER_MILLI;
                        long timeout = Math.max(1, timeoutMillis - elapsedTime);
                        return PublisherUtil.whenDelayError(
                                eventExecutorGroup
                                        .shutdownGracefully(0, timeout, TimeUnit.MILLISECONDS),
                                eventLoopGroupProvider.shutdown(0, timeout, TimeUnit.MILLISECONDS));
                    }));
        });
    }
ConnectionBuilder$PlainChannelInitializer ChannelGroupListener CommandEncoder
RedisHandshakeHandler CommandHandler ConnectionEventTrigger
ConnectionWatchdog

@see io.lettuce.core.SslConnectionBuilder.SslChannelInitializer
@see io.lettuce.core.SslConnectionBuilder.PlainChannelInitializer
turms-server-common/src/main/java/im/turms/server/common/storage/redis/TurmsRedisClient.java