Client library code samples

This page provides code samples for Memorystore for Valkey instances that have boththeCluster Mode Enabled and Cluster Mode Disabled modes.

Code samples for Cluster Mode Enabled

Memorystore for Valkey is compatible with all of the Memorystore for Redis Clusterclient code samples:

About Valkey GLIDE

Valkey General Language Independent Driver for the Enterprise (GLIDE) is anopen-source client library, and it supports all Valkey commands.

You can useValkey GLIDE to connect yourapplications to Memorystore for Valkey instances. Valkey GLIDE is designed forreliability, optimized performance, andhigh-availability.

To help ensure consistency in application development and operations, ValkeyGLIDE is implemented using a core driver framework, written inRust, with language-specific extensions. This design ensures consistency infeatures across languages and reduces complexity.

Valkey GLIDE supports Valkeyversions 7.2, 8.0, and 9.0 (Preview). It's available for the following languages:

Other Valkey OSS client libraries

In addition to Valkey GLIDE, Memorystore for Valkey is compatible with thefollowing Valkey OSS client libraries:

Systems and services

You can useSpring Boot,PostgreSQL, and Memorystore for Valkey to create the following systems andservices:

  • Session management system: session management is a crucial part of modernweb applications, ensuring that user interactions remain consistent and secureacross multiple requests. By using a caching layer, your application can manageuser sessions efficiently while reducing the load on your database and ensuringscalability.
  • Scalable leaderboard system: leaderboards are a useful way to displayranking data in applications. By using a caching layer, you can deliverreal-time leaderboard rankings while reducing your database load.
  • High-performance caching service: modern applications need to deliverfast, responsive user experiences at scale. By building this caching service,you can reduce both latency and your database load.

Code samples for Cluster Mode Disabled

Memorystore for Valkey Cluster Mode Disabled is compatible with all Redis and ValkeyOSS client libraries listed inCode samples for Cluster Mode Enabled.

When you use a Cluster Mode Disabled instance in Memorystore for Valkey, completethe following actions:

  • Instead of theRedisCluster orValkeyCluster client object that thelibrary provides, use the Redis or Valkey client object.
  • Create a writer client by using the primary endpoint IP address.
  • Create a reader client by using the reader endpoint IP address.

redis-py

We recommend usingredis-py, versions 5.1and later.

import redisprimaryEndpoint =PRIMARY_ENDPOINT_IPreaderEndpoint =READER_ENDPOINT_IPprimary_client = redis.Redis(host=primaryEndpoint, port=6379, db=0, decode_responses=True)reader_client = redis.Redis(host=readerEndpoint, port=6379, db=0, decode_responses=True)primary_client.set("key","value")print(reader_client.get("key"))

go-redis

We recommend usinggo-redis, versions9.11.0 and later.

package mainimport ("context""fmt""github.com/redis/go-redis/v9")func main() {primary_endpoint :=PRIMARY_ENDPOINT_IPreader_endpoint :=READER_ENDPOINT_IPprimary_client := redis.NewClient(&redis.Options{  Addr:     primary_endpoint,  Password: "", // no password set  DB:       0,  // use default DB})reader_client := redis.NewClient(&redis.Options{  Addr:     reader_endpoint,  Password: "", // no password set  DB:       0,  // use default DB})ctx := context.Background()err := primary_client.Set(ctx, "foo", "bar", 0).Err()if err != nil {  panic(err)}val, err := reader_client.Get(ctx, "foo").Result()if err != nil {  panic(err)}fmt.Println("foo", val)}

Jedis

We recommend usingJedis, versions 4.4.0 andlater.

package org.example;import java.io.*;import java.time.LocalDateTime;import java.lang.Thread;import java.util.HashMap;import java.util.Map;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class Main{public static void main( String[] args ){  primaryEndpoint =PRIMARY_ENDPOINT_IP  JedisPool pool = new JedisPool(primaryEndpoint, 6379);  try (Jedis jedis = pool.getResource()) {    jedis.set("foo", "bar");    System.out.println(jedis.get("foo")); // prints bar    Map hash = new HashMap<>();;    hash.put("name", "John");    hash.put("surname", "Smith");    hash.put("company", "Redis");    hash.put("age", "29");    jedis.hset("user-session:123", hash);    System.out.println(jedis.hgetAll("user-session:123"));    // Prints: {name=John, surname=Smith, company=Redis, age=29}  } catch (Exception e) {    System.out.println("Error setting or getting  key: " + e.getMessage());  }}}

Node.js

We recommend usingNode.js, versions24.4.1 and later.

import { createClient } from 'redis';import * as fs from 'fs';const primaryEndpoint =PRIMARY_ENDPOINT_IPconst primary_endpoint_url ='redis://primaryEndpoint:6379'const client = createClient({url: primary_endpoint_url});await client.connect();await client.set(key, value);const retval = await client.get(key);console.log(retval)

Code sample for both IAM authentication and in-transit encryption

This section gives an example of how to authenticate and connect to aMemorystore for Valkey instance by using bothIAM authentication andin-transit encryption with various client libraries.

redis-py

We recommend usingredis-py, versions 5.1and later.

from google.cloud import iam_credentials_v1from redis.backoff import ConstantBackofffrom redis.retry import Retryfrom redis.exceptions import (ConnectionError,AuthenticationWrongNumberOfArgsError,AuthenticationError)from redis.utils import (str_if_bytes)import redisservice_account="projects/-/serviceAccounts/<TO-DO-1: your service account that used to authenticate to Valkey>""host=<TO-DO-2: your Redis Cluster discovery endpoint ip>ssl_ca_certs=<TO-DO-3, your trusted server ca file name>def generate_access_token():  # Create a client  client = iam_credentials_v1.IAMCredentialsClient()  # Initialize request argument(s)  request = iam_credentials_v1.GenerateAccessTokenRequest(      name=service_account,      scope=['https://www.googleapis.com/auth/cloud-platform'],  )  # Make the request  response = client.generate_access_token(request=request)  print(str(response.access_token))  # Handle the response  return str(response.access_token)class ValkeyTokenProvider(redis.CredentialProvider):    # Generated IAM tokens are valid for 15 minutes    def get_credentials(self):        token= generate_access_token()        return "default",tokencreds_provider = ValkeyTokenProvider()client = redis.Redis(host=host, port=6379, credential_provider=creds_provider, ssl=True, ssl_ca_certs=caFilePath)client.set('foo',"bar")print(client.get('foo'))

Go

We recommend usingGo, versions 1.24.5 and later.

package mainimport (  "context"  "crypto/tls"  "crypto/x509"  "flag"  "fmt"  "io/ioutil"  "log"  "sync"  "time"  credentials "google.golang.org/genproto/googleapis/iam/credentials/v1"  "github.com/golang/protobuf/ptypes"  "github.com/redis/go-redis/v9"  "google.golang.org/api/option"  gtransport "google.golang.org/api/transport/grpc")var (  svcAccount               = flag.String("a", "projects/-/serviceAccounts/example-service-account@example-project.iam.gserviceaccount.com", "service account email")  lifetime                 = flag.Duration("d", time.Hour, "lifetime of token")  refreshDuration          = flag.Duration("r", 5*time.Minute, "token refresh duration")  checkTokenExpiryInterval = flag.Duration("e", 10*time.Second, "check token expiry interval")  lastRefreshInstant       = time.Time{}  errLastSeen              = error(nil)  token                    = ""  mu                       = sync.RWMutex{}  err                      = error(nil))func retrieveToken() (string, error) {  ctx := context.Background()  conn, err := gtransport.Dial(ctx,    option.WithEndpoint("iamcredentials.googleapis.com:443"),    option.WithScopes("https://www.googleapis.com/auth/cloud-platform"))  if err != nil {    log.Printf("Failed to dial API, error: %v", err)    return token, err  }  client := credentials.NewIAMCredentialsClient(conn)  req := credentials.GenerateAccessTokenRequest{    Name:     *svcAccount,    Scope:    []string{"https://www.googleapis.com/auth/cloud-platform"},    Lifetime: ptypes.DurationProto(*lifetime),  }  rsp, err := client.GenerateAccessToken(ctx, &req)  if err != nil {    log.Printf("Failed to call GenerateAccessToken with request: %v, error: %v", req, err)    return token, err  }  return rsp.AccessToken, nil}func refreshTokenLoop() {  if *refreshDuration > *lifetime {    log.Fatal("Refresh should not happen after token is already expired.")  }  for {    mu.RLock()    lastRefreshTime := lastRefreshInstant    mu.RUnlock()    if time.Now().After(lastRefreshTime.Add(*refreshDuration)) {      var err error      retrievedToken, err := retrieveToken()      mu.Lock()      token = retrievedToken      if err != nil {        errLastSeen = err      } else {        lastRefreshInstant = time.Now()      }      mu.Unlock()    }    time.Sleep(*checkTokenExpiryInterval)  }}func retrieveTokenFunc() (string, string) {  mu.RLock()  defer mu.RUnlock()  if time.Now().After(lastRefreshInstant.Add(*refreshDuration)) {    log.Printf("Token is expired. last refresh instant: %v, refresh duration: %v, error that was last seen: %v", lastRefreshInstant, *refreshDuration, errLastSeen)    return "", ""  }  username := "default"  password := token  return username, password}func main() {  caFilePath :=CA_FILE_PATH  clusterDicEpAddr :=PRIMARY_ENDPOINT_IP_ADDRESS_AND_PORT  caCert, err := ioutil.ReadFile(caFilePath)  if err != nil {    log.Fatal(err)  }  caCertPool := x509.NewCertPool()  caCertPool.AppendCertsFromPEM(caCert)  token, err = retrieveToken()  if err != nil {    log.Fatal("Cannot retrieve IAM token to authenticate to the cluster, error: %v", err)  }  token, err = retrieveToken()  fmt.Printf("token : %v", token)  if err != nil {    log.Fatal("Cannot retrieve IAM token to authenticate to the cluster, error: %v", err)  }  lastRefreshInstant = time.Now()  go refreshTokenLoop()  client := redis.NewClient(&redis.Options{    Addr:                clusterDicEpAddr,    CredentialsProvider: retrieveTokenFunc,    TLSConfig: &tls.Config{      RootCAs: caCertPool,    },  })  ctx := context.Background()  err = client.Set(ctx, "foo", "bar", 0).Err()  if err != nil {    log.Fatal(err)  }  val, err := client.Get(ctx, "foo").Result()  if err != nil {    log.Fatal(err)  }  fmt.Printf("\nGot the value for key: key, which is %s \n", val)}

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2026-02-19 UTC.