Specify a Read Strategy
By default, Valkey GLIDE directs read commands to the primary node that owns a specific slot. For applications that prioritize read throughput and can tolerate possibly stale data, Valkey GLIDE provides the flexibility to route reads to replica nodes.
Valkey GLIDE provides support for the following read strategies, allowing you to choose the one that best fits your specific use case.
Available Read Strategies
Section titled “Available Read Strategies”| Strategy | Description |
|---|---|
| Primary (Default) | Always read from primary, in order to get the freshest data. |
| Prefer Replica | Spread requests between all replicas in a round robin manner. If no replica is available, route the requests to the primary. |
| AZ Affinity | Spread the read requests between replicas in the same client’s availability zone in a round robin manner, falling back to other replicas or the primary if needed. |
| AZ Affinity Replicas and Primary | Spread the read requests among nodes within the client’s availability zone in a round robin manner, prioritizing local replicas, then the local primary, and falling back to other replicas or the primary if needed. |
Prefer Replica
Section titled “Prefer Replica”from glide import ( GlideClusterClient, GlideClusterClientConfiguration, NodeAddress, ReadFrom)
addresses = [NodeAddress(host="address.example.com", port=6379)]client_config = GlideClusterClientConfiguration(addresses, read_from=ReadFrom.PREFER_REPLICA)
client = await GlideClusterClient.create(client_config)await client.set("key1", "val1")# get will read from one of the replicasawait client.get("key1")import glide.api.GlideClusterClient;import glide.api.models.configuration.GlideClusterClientConfiguration;import glide.api.models.configuration.NodeAddress;
GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("address.example.com") .port(6379) .build()) .readFrom(ReadFrom.PREFER_REPLICA) .build();GlideClusterClient client = GlideClusterClient.createClient(config).get();
client.set("key1", "val1").get();
// get will read from one of the replicasclient.get("key1").get();import {GlideClusterClient} from "@valkey/valkey-glide";
const addresses = [ { host: "address.example.com", port: 6379 }];
const client = await GlideClusterClient.createClient({ addresses: addresses, readFrom: "preferReplica"});await client.set("key1", "val1");// get will read from one of the replicasawait client.get("key1");import ( "context"
glide "github.com/valkey-io/valkey-glide/go/v2" "github.com/valkey-io/valkey-glide/go/v2/config")
func ConnectClusterWithReadStrategyPreferReplica() { myConfig := config.NewClusterClientConfiguration(). WithAddress(&config.NodeAddress{Host: "address.example.com", Port: 6379}). WithReadFrom(config.PreferReplica)
client, _ := glide.NewClusterClient(myConfig)
client.Set(context.Background(), "key1", "val1")
// Get will read from one of the replicas client.Get(context.Background(),"key1")}AZ Affinity
Section titled “AZ Affinity”When using the AZ Affinity read strategy, the clientAz setting is required to ensure that readonly commands are directed to replicas within the specified availability zone if they exist.
from glide import ( GlideClusterClient, GlideClusterClientConfiguration, NodeAddress, ReadFrom)
addresses = [NodeAddress(host="address.example.com", port=6379)]client_config = GlideClusterClientConfiguration(addresses, read_from=ReadFrom.AZ_AFFINITY, client_az="us-east-1a")
client = await GlideClusterClient.create(client_config)await client.set("key1", "val1")# get will read from one of the replicas in the same client's availability zone if they existawait client.get("key1")import glide.api.GlideClusterClient;import glide.api.models.configuration.GlideClusterClientConfiguration;import glide.api.models.configuration.NodeAddress;
GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("address.example.com") .port(6379) .build()) .readFrom(ReadFrom.AZ_AFFINITY) .clientAZ("us-east-1a") .build();GlideClusterClient client = GlideClusterClient.createClient(config).get();
client.set("key1", "val1").get();
// get will read from one of the replicas in the same client's availability zone if they existclient.get("key1").get();import {GlideClusterClient} from "@valkey/valkey-glide";
const addresses = [ { host: "address.example.com", port: 6379 }];
const client = await GlideClusterClient.createClient({ addresses: addresses, readFrom: "AZAffinity" as ReadFrom, clientAz: "us-east-1a",});await client.set("key1", "val1");// get will read from one of the replicas in the same client's availability zone if they existawait client.get("key1");import ( "context"
glide "github.com/valkey-io/valkey-glide/go/v2" "github.com/valkey-io/valkey-glide/go/v2/config")
func ConnectClusterWithReadStrategyAZAffinity() { myConfig := config.NewClusterClientConfiguration(). WithAddress(&config.NodeAddress{Host: "address.example.com", Port: 6379}). WithReadFrom(config.AzAffinity). WithClientAZ("us-east-1a")
client, _ := glide.NewClusterClient(myConfig)
client.Set(context.Background(), "key1", "val1")
// Get will read from one of the replicas in the same client's availability zone if they exist client.Get(context.Background(),"key1")}AZ Affinity Replicas and Primary Read Strategy
Section titled “AZ Affinity Replicas and Primary Read Strategy”When using the AZ Affinity Replicas and Primary read strategy, the clientAz setting is required to ensure that readonly commands are directed to replicas or the primary within the specified availability zone if they exist.
from glide import ( GlideClusterClient, GlideClusterClientConfiguration, NodeAddress, ReadFrom)
addresses = [NodeAddress(host="address.example.com", port=6379)]client_config = GlideClusterClientConfiguration(addresses, read_from=ReadFrom.AZ_AFFINITY_REPLICAS_AND_PRIMARY, client_az="us-east-1a")
client = await GlideClusterClient.create(client_config)await client.set("key1", "val1")# get will read from one of the replicas or the primary in the same client's availability zone if they existawait client.get("key1")import glide.api.GlideClusterClient;import glide.api.models.configuration.GlideClusterClientConfiguration;import glide.api.models.configuration.NodeAddress;
GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("address.example.com") .port(6379) .build()) .readFrom(ReadFrom.AZ_AFFINITY_REPLICAS_AND_PRIMARY) .clientAZ("us-east-1a") .build();GlideClusterClient client = GlideClusterClient.createClient(config).get();
client.set("key1", "val1").get();
// get will read from one of the replicas or the primary in the same client's availability zone if they existclient.get("key1").get();import {GlideClusterClient} from "@valkey/valkey-glide";
const addresses = [ { host: "address.example.com", port: 6379 }];
const client = await GlideClusterClient.createClient({ addresses: addresses, readFrom: "AZAffinityReplicasAndPrimary" as ReadFrom, clientAz: "us-east-1a",});await client.set("key1", "val1");// get will read from one of the replicas or the primary in the same client's availability zone if they existawait client.get("key1");import ( "context"
glide "github.com/valkey-io/valkey-glide/go/v2" "github.com/valkey-io/valkey-glide/go/v2/config")
func ConnectClusterWithReadStrategyAZAffinityReplicaAndPrimary() { myConfig := config.NewClusterClientConfiguration(). WithAddress(&config.NodeAddress{Host: "address.example.com", Port: 6379}). WithReadFrom(config.AzAffinityReplicaAndPrimary). WithClientAZ("us-east-1a")
client, _ := glide.NewClusterClient(myConfig)
client.Set(context.Background(), "key1", "val1")
// Get will read from one of the replicas or the primary in the same client's availability zone if they exist client.Get(context.Background(),"key1")}