Todos os produtos
Search
Central de documentação

Tair (Redis® OSS-Compatible):Mitigue problemas de chaves de hot spot com a separação de leitura e escrita

Última atualização: Jun 26, 2026

Quando um pequeno defina de chaves recebe uma parcela desproporcional do tráfego de leitura, o nó primário se torna um gargalo. Ative a separação de leitura e escrita e adicione nós somente leitura para distribuir essas leituras entre todos os nós. Isso reduz a carga no nó primário e aumenta o throughput de leitura linearmente a cada nó adicionado.

Casos de uso

A separação de leitura e escrita é ideal para cargas de trabalho que toleram dados ligeiramente desatualizados durante períodos de alto volume de escrita. Isso ocorre porque os nós somente leitura replicam dados do nó primário de forma assíncrona, com uma latência baixa, porém não nula. Os cenários típicos incluem:

  • Conteúdo de página em cache: caches HTML para páginas iniciais de sites que recebem atualize com pouca frequência.

  • Placares de jogos: classificações horárias em que um pequeno atraso na atualize não causa impacto significativo.

  • Dados de previsão do tempo: dados consultados frequentemente e atualize em horários fixos.

Como funciona

Todos os nós somente leitura replicam dados do nó primário de forma assíncrona, garantindo consistência eventual. O nó primário processa 100% das solicitações de escrita e 1/N das solicitações de leitura, onde N é o número total de nós (primário + somente leitura). Por exemplo, com um nó primário e três nós somente leitura, N é 4, e o desempenho de leitura aumenta em até 4x. Isso reduz a pressão sobre a CPU, o tráfego de rede e a sobrecarga de conexões no nó primário.

Um componente Proxy integrado roteia as solicitações automaticamente: envia as solicitações de escrita para o nó primário e distribui as de leitura entre os nós somente leitura. Instâncias de zona única não exigem alterações no código do cliente.

A separação de leitura e escrita é compatível com arquiteturas padrão (primário-réplica) e de cluster. Em uma arquitetura de cluster, cada shard de dados pode ter seu próprio nó somente leitura. Para mais detalhes sobre a arquitetura, consulte Separação de leitura e escrita.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Uma instância implantada no modo nativo da nuvem

  • Uma instância do tipo Redis Open-Source Edition, Tair (Enterprise Edition) otimizado para DRAM ou Tair (Enterprise Edition) otimizado para memória persistente

  • Uma instância com pelo menos 1 GB de memória

  • Uma instância de alta disponibilidade

Ative a separação de leitura e escrita

Na página de detalhes da instância, clique em Node Management no painel de navegação à esquerda e ative a opção Read/write Splitting. Para instruções passo a passo, consulte Ative a separação de leitura e escrita.

Conectar seu cliente

Instâncias de zona única

As instâncias de zona única expõem um único endpoint. O Proxy integrado roteia automaticamente as solicitações de leitura e escrita para os nós apropriados. Conecte-se usando o endpoint e a senha atuais, sem modificar o código.

Para exemplos de conexão, consulte o tutorial de conexão do cliente.

Instâncias de zona dupla

As instâncias de zona dupla expõem dois endpoints: um para a zona primária (leitura e escrita) e outro para a zona secundária (somente leitura). Os clientes na zona secundária conectam-se ao endpoint dessa zona para leituras, reduzindo a latência entre zonas. As operações de escrita são sempre direcionadas ao endpoint da zona primária.

Os exemplos a seguir usam a Hangzhou Zone I (zona primária) e a Hangzhou Zone J (zona secundária).

Cliente da zona primária — leitura e escrita

Um cliente na Hangzhou Zone I conecta-se ao endpoint da zona primária para leitura e escrita:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class MasterReadWrite {
    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(200);
        config.setMaxTotal(300);
        config.setTestOnBorrow(false);
        config.setTestOnReturn(false);

        // Primary zone endpoint, port, and password
        String host = "r-bp1vtq8tnrquy****pd.redis.rds.aliyuncs.com";
        int port = 6379;
        String password = "default:Passw***2";

        JedisPool pool = new JedisPool(config, host, port, 3000, password);
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            jedis.set("foo", "bar");
            System.out.println(jedis.get("foo"));
        }
        catch (Exception e) {
            // Handle timeouts or other exceptions.
            e.printStackTrace();
        }
        finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        pool.destroy();    // On application exit, call this method to release connections and resources.
    }
}

Cliente da zona secundária — somente leitura

Um cliente na Hangzhou Zone J conecta-se ao endpoint da zona secundária para leituras. O endpoint da zona secundária aceita apenas operações de leitura. Capture a JedisDataException para tratar adequadamente qualquer tentativa acidental de escrita:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class ReplicaRead {
    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(200);
        config.setMaxTotal(300);
        config.setTestOnBorrow(false);
        config.setTestOnReturn(false);

        // Secondary zone endpoint, port, and password
        String host = "r-bp1vtq8tnrquy****pd.redis.rds.aliyuncs.com";
        int port = 6379;
        String password = "default:Passw***2";

        JedisPool pool = new JedisPool(config, host, port, 3000, password);
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            System.out.println(jedis.get("foo"));
        }
        catch (JedisDataException e) {
            // The secondary zone endpoint is read-only. Catch this exception if a write command is sent by mistake.
            e.getMessage();
        }
        catch (Exception e) {
            // Handle timeouts or other exceptions.
            e.printStackTrace();
        }
        finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        pool.destroy();    // On application exit, call this method to release connections and resources.
    }
}

Tópicos relacionados