

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Práticas recomendadas para clientes (Valkey e Redis OSS)
<a name="BestPractices.Clients.redis"></a>

Conheça as melhores práticas para cenários comuns e acompanhe exemplos de código de algumas das bibliotecas cliente OSS de código aberto Valkey e Redis mais populares (redis-py, phpRedis e Lettuce), bem como as melhores práticas para interagir com recursos com bibliotecas de cliente Memcached de código aberto comumente usadas. ElastiCache 

**Topics**
+ [Grande número de conexões (Valkey e Redis OSS)](BestPractices.Clients.Redis.Connections.md)
+ [Descoberta de cliente do cluster e recuo exponencial (Valkey e Redis OSS)](BestPractices.Clients.Redis.Discovery.md)
+ [Configurar um tempo limite do lado do cliente (Valkey e Redis OSS)](BestPractices.Clients.Redis.ClientTimeout.md)
+ [Configurar um tempo limite de inatividade do lado do servidor (Valkey e Redis OSS)](BestPractices.Clients.Redis.ServerTimeout.md)
+ [Scripts Lua](BestPractices.Clients.Redis.LuaScripts.md)
+ [Armazenamento de itens compostos grandes (Valkey e Redis OSS)](BestPractices.Clients.Redis.LargeItems.md)
+ [Configuração do cliente do Lettuce (Valkey e Redis OSS)](BestPractices.Clients-lettuce.md)
+ [Configurar um protocolo preferencial para clusters de pilha dupla (Valkey e Redis OSS)](#network-type-configuring-dual-stack-redis)

## Configurar um protocolo preferencial para clusters de pilha dupla (Valkey e Redis OSS)
<a name="network-type-configuring-dual-stack-redis"></a>

Para clusters do Valkey ou Redis OSS de modo cluster habilitado, você pode controlar o protocolo que os clientes usarão para se conectar aos nós no cluster com o parâmetro de descoberta de IP. O parâmetro de descoberta de IP pode ser definido como IPv4 ou IPv6. 

Para clusters do Valkey ou Redis OSS, o parâmetro de descoberta de IP define o protocolo IP usado na saída de [cluster slots ()](https://valkey.io/commands/cluster-slots/), [cluster shards ()](https://valkey.io/commands/cluster-shards/) e [cluster nodes ()](https://valkey.io/commands/cluster-nodes/). Esses comandos são usados pelos clientes para descobrir a topologia do cluster. Os clientes usam os IPs nesses comandos para se conectar aos outros nós no cluster. 

Alterar a descoberta de IP não resultará em nenhum tempo de inatividade para os clientes conectados. No entanto, as alterações levarão algum tempo para se propagar. Para determinar quando as alterações foram completamente propagadas para um cluster do Valkey ou Redis OSS, monitore a saída de `cluster slots`. Depois que todos os nós retornados pelo comando cluster slots relatam IPs com o novo protocolo, as alterações terminam de se propagar. 

Exemplo com Redis-Py:

```
cluster = RedisCluster(host="xxxx", port=6379)
target_type = IPv6Address # Or IPv4Address if changing to IPv4

nodes = set()
while len(nodes) == 0 or not all((type(ip_address(host)) is target_type) for host in nodes):
    nodes = set()

   # This refreshes the cluster topology and will discovery any node updates.
   # Under the hood it calls cluster slots
    cluster.nodes_manager.initialize()
    for node in cluster.get_nodes():
        nodes.add(node.host)
    self.logger.info(nodes)

    time.sleep(1)
```

Exemplo com Lettuce:

```
RedisClusterClient clusterClient = RedisClusterClient.create(RedisURI.create("xxxx", 6379));

Class targetProtocolType = Inet6Address.class; // Or Inet4Address.class if you're switching to IPv4

Set<String> nodes;
    
do {
   // Check for any changes in the cluster topology.
   // Under the hood this calls cluster slots
    clusterClient.refreshPartitions();
    Set<String> nodes = new HashSet<>();

    for (RedisClusterNode node : clusterClient.getPartitions().getPartitions()) {
        nodes.add(node.getUri().getHost());
    }

    Thread.sleep(1000);
} while (!nodes.stream().allMatch(node -> {
            try {
                return finalTargetProtocolType.isInstance(InetAddress.getByName(node));
            } catch (UnknownHostException ignored) {}
            return false;
}));
```