public <K, V> Flux<Map.Entry<K, V>> hgetall(K key) {
        return Flux.defer(() -> {
            ByteBuf keyBuffer = serializationContext.encodeHashKey(key);
            Flux<KeyValue<K, V>> flux =
                    commands.createDissolvingFlux(() -> commandBuilder.hgetall(keyBuffer));
            Flux<Map.Entry<K, V>> entryFlux = flux.flatMap(entry -> {
                if (entry.isEmpty()) {
                    return Mono.empty();
                }
                return Mono.just(Map.entry(entry.getKey(), entry.getValue()));
            });
            return entryFlux.doFinally(signal -> ReferenceCountUtil.ensureReleased(keyBuffer));
        });
    }
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