Client library code samples Stay organized with collections Save and categorize content based on your preferences.
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:
- Memorystore for Redis ClusterClient library code samples
- Memorystore for Redis ClusterClient library connection 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 the
RedisClusterorValkeyClusterclient 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.