Yandex Cloud
Search
Contact UsTry it for free
  • Customer Stories
  • Documentation
  • Blog
  • All Services
  • System Status
  • Marketplace
    • Featured
    • Infrastructure & Network
    • Data Platform
    • AI for business
    • Security
    • DevOps tools
    • Serverless
    • Monitoring & Resources
  • All Solutions
    • By industry
    • By use case
    • Economics and Pricing
    • Security
    • Technical Support
    • Start testing with double trial credits
    • Cloud credits to scale your IT product
    • Gateway to Russia
    • Cloud for Startups
    • Center for Technologies and Society
    • Yandex Cloud Partner program
    • Price calculator
    • Pricing plans
  • Customer Stories
  • Documentation
  • Blog
© 2026 Direct Cursus Technology L.L.C.
Yandex Managed Service for Valkey™
  • Getting started
    • All guides
      • Pre-configuration
      • FQDNs of hosts
      • Connecting from applications
        • Overview
        • Connection examples for non-sharded clusters
        • Connection examples for sharded clusters
  • Access management
  • Pricing policy
  • Terraform reference
  • Monitoring metrics
  • Audit Trails events
  • Public materials
  • Release notes
  • FAQ

In this article:

  • C#
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
  1. Step-by-step guides
  2. Connection
  3. Code examples
  4. Connection examples for sharded clusters

Code examples for connecting to a sharded Valkey™ cluster

Written by
Yandex Cloud
Updated at February 13, 2026
  • C#
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby

C#C#

Before connecting:

  1. Install the dependencies:

    sudo apt update && sudo apt install --yes apt-transport-https dotnet-sdk-6.0
    
  2. Create a directory for the project:

    cd ~/ && mkdir cs-project && cd cs-project
    
  3. Create a configuration file:

    RedisClient.csproj
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="StackExchange.Redis" Version="2.8.58" />
      </ItemGroup>
    </Project>
    
  4. To connect with SSL, get an SSL certificate.

Connecting without SSL
Connecting with SSL

Program.cs

using System;
using System.Threading.Tasks;
using StackExchange.Redis;

namespace RedisClient
{
    class Program
    {
        // Configuration constants
        private const string TEST_KEY = "test-key";
        private const string TEST_VALUE = "test-value";
        private const string USERNAME = "default";
        private const string PASSWORD = "<password>";

        static async Task<int> Main(string[] args)
        {
            try
            {
                var masterOptions = new ConfigurationOptions
                {
                    EndPoints = {
                        "<FQDN_of_master_host_in_shard_1>:6379",
                        ...
                        "<FQDN_of_master_host_in_shard_N>:6379"
                    },
                    User = USERNAME,
                    Password = PASSWORD
                };

                var connection = await ConnectionMultiplexer.ConnectAsync(masterOptions);

                var db = connection.GetDatabase();

                // Send SET command
                bool setResult = await db.StringSetAsync(TEST_KEY, TEST_VALUE);
                if (!setResult)
                {
                    Console.WriteLine($"SET failed for key {TEST_KEY}");
                    return 1;
                }
                Console.WriteLine($"Successfully set {TEST_KEY} = {TEST_VALUE}");

                // Send GET command
                var getResult = await db.StringGetAsync(TEST_KEY);
                if (!getResult.HasValue)
                {
                    Console.WriteLine($"GET failed: Key {TEST_KEY} not found");
                    return 1;
                }

                string retrievedValue = getResult.ToString();
                if (retrievedValue != TEST_VALUE)
                {
                    Console.WriteLine($"GET failed. Expected: '{TEST_VALUE}', Actual: '{retrievedValue}'");
                    return 1;
                }
                Console.WriteLine($"Successfully retrieved {TEST_KEY} = {retrievedValue}");

            return 0;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Operation failed: {ex.Message}");
            return 1;
        }
        }
    }    
}

Program.cs

using System;
using System.Threading.Tasks;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using StackExchange.Redis;

namespace RedisClient
{
    class Program
    {
        // Configuration constants
        private const string TEST_KEY = "test-key";
        private const string TEST_VALUE = "test-value";
        private const string USERNAME = "default";
        private const string PASSWORD = "<password>";
        private const string CERT = "/home/<home_directory>/.redis/YandexInternalRootCA.crt"            

        static async Task<int> Main(string[] args)
        {
            try
            {
                var masterOptions = new ConfigurationOptions
                {
                    EndPoints = {
                        "<FQDN_of_master_host_in_shard_1>:6380",
                        ...
                        "<FQDN_of_master_host_in_shard_N>:6380"
                    },
                    User = USERNAME,
                    Password = PASSWORD,
                    Ssl = true
                };
                masterOptions.CertificateValidation += (
                    object sender,
                    X509Certificate? certificate,
                    X509Chain? chain,
                    SslPolicyErrors sslPolicyErrors) =>
                {
                    if (certificate == null) {
                        return false;       
                    }
                    var ca = new X509Certificate2(CERT);
                    bool verdict = (certificate.Issuer == ca.Subject);
                    if (verdict) {
                        return true;
                    }
                    Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
                    return false;
                }

                var connection = await ConnectionMultiplexer.ConnectAsync(masterOptions);

                var db = connection.GetDatabase();

                // Send SET command
                bool setResult = await db.StringSetAsync(TEST_KEY, TEST_VALUE);
                if (!setResult)
                {
                    Console.WriteLine($"SET failed for key {TEST_KEY}");
                    return 1;
                }
                Console.WriteLine($"Successfully set {TEST_KEY} = {TEST_VALUE}");

                // Send GET command
                var getResult = await db.StringGetAsync(TEST_KEY);
                if (!getResult.HasValue)
                {
                    Console.WriteLine($"GET failed: Key {TEST_KEY} not found");
                    return 1;
                }

                string retrievedValue = getResult.ToString();
                if (retrievedValue != TEST_VALUE)
                {
                    Console.WriteLine($"GET failed. Expected: '{TEST_VALUE}', Actual: '{retrievedValue}'");
                    return 1;
                }
                Console.WriteLine($"Successfully retrieved {TEST_KEY} = {retrievedValue}");

            return 0;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Operation failed: {ex.Message}");
            return 1;
        }
        }
    }    
}

To learn how to get a host FQDN, see this guide.

Connecting:

cd ~/cs-project && \
dotnet build && dotnet run bin/Debug/net6.0/RedisClient

If your cluster connection and test command are successful, the output will contain the following strings:

Successfully set test-key = test-value
Successfully retrieved test-key = test-value

GoGo

Before connecting, install the dependencies:

sudo apt update && sudo apt install --yes golang git && \
go mod init github.com/go-redis/redis && \
go get github.com/redis/go-redis/v9
Connecting without SSL
Connecting with SSL

connect.go

package main

import (
	"fmt"
	"github.com/go-redis/redis/v7"
	"time"
)

func main() {
	hostports := []string{
		"<FQDN_of_master_host_in_shard_1>:6379",
		...
		"<FQDN_of_master_host_in_shard_N>:6379",
	}
	options := redis.UniversalOptions{
		Addrs:       hostports,
		DB:          0,
		ReadOnly:    false,
		DialTimeout: 5 * time.Second,
		Password:    "<password>",
	}
	client := redis.NewUniversalClient(&options)

	err := client.Set("foo", "bar", 0).Err()
	if err != nil {
		panic(err)
	}

	result, err := client.Get("foo").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println(result)

	client.Close()
}

connect.go

package main

import (
    "context"
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "net"
    "os"
    "strings"
    "time"

    "github.com/redis/go-redis/v9"
)

func main() {
    caCert, err := os.ReadFile("/home/<home_directory>/.redis/YandexInternalRootCA.crt")
    if err != nil {
        panic(err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    hostports := []string{
        "<FQDN_of_master_host_in_shard_1>:6380",
        ...
        "<FQDN_of_master_host_in_shard_N>:6380",
    }
    options := redis.UniversalOptions{
        Addrs:        hostports,
        MaxRedirects: 1,
        Password:     "password",
        DB:           0,
        ReadOnly:     false,
        DialTimeout:  5 * time.Second,
        TLSConfig: &tls.Config{
            RootCAs:            caCertPool,
            ServerName: "c-<cluster_ID>.rw.mdb.yandexcloud.net",
            VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
                certs := make([]*x509.Certificate, len(rawCerts))
                for i := 0; i < len(rawCerts); i++ {
                    cert, err := x509.ParseCertificate(rawCerts[i])
                    if err != nil {
                        return fmt.Errorf("error parsing certificate: %+v", err)
                    }
                    certs[i] = cert
                }

                opts := x509.VerifyOptions{
                    Roots:         caCertPool,
                    CurrentTime:   time.Now(),
                    DNSName:       "",
                    Intermediates: x509.NewCertPool(),
                }

                for i := range certs {
                    if i == 0 {
                        continue
                    }
                    opts.Intermediates.AddCert(certs[i])
                }
                _, err := certs[0].Verify(opts)
                return err
            },
        },
    }
    options.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
        parts := strings.Split(addr, ":")
        newAddr := addr
        if len(parts) > 1 && !strings.HasPrefix(parts[0], "[") {
            newAddr = "[" + strings.Join(parts[:len(parts)-1], ":") + "]:" + parts[len(parts)-1]
        }

        netDialer := &net.Dialer{
            Timeout:   options.DialTimeout,
            KeepAlive: 5 * time.Minute,
        }
        return tls.DialWithDialer(netDialer, network, newAddr, options.TLSConfig)
    }

    ctx := context.Background()

    client := redis.NewUniversalClient(&options)
    err = client.Set(ctx, "foo", "bar", 0).Err()
    if err != nil {
        panic(err)
    }

    get := client.Get(ctx, "foo")
    err = get.Err()
    if err != nil {
        panic(err)
    }
    fmt.Println(get.String())
}

To learn how to get a host FQDN, see this guide.

Connecting:

go run connect.go

If your cluster connection and test command are successful, you will see the bar string in the output.

JavaJava

Before connecting:

  1. Install the dependencies:

    sudo apt update && sudo apt install --yes default-jdk maven
    
  2. Create a directory for the Maven project:

    cd ~/ && mkdir --parents project/src/java/com/example && cd project/
    
  3. Create a configuration file for Maven:

    pom.xml
    <?xml version="1.0" encoding="utf-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example</groupId>
      <artifactId>app</artifactId>
      <packaging>jar</packaging>
      <version>0.1.0</version>
      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
      <dependencies>
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>3.7.0</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
          <version>1.7.30</version>
        </dependency>
      </dependencies>
      <build>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <sourceDirectory>src</sourceDirectory>
        <resources>
          <resource>
            <directory>src</directory>
          </resource>
        </resources>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>attached</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                  <descriptorRefs>
                    <descriptorRef>
                    jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
                  <archive>
                    <manifest>
                      <mainClass>com.example.App</mainClass>
                    </manifest>
                  </archive>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
              <archive>
                <manifest>
                  <mainClass>com.example.App</mainClass>
                </manifest>
              </archive>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    Current versions of Maven dependencies:

    • jedis
    • slf4j-simple
  4. To connect with SSL:

    1. Get an SSL certificate.

    2. Create a secure certificate store:

      keytool -importcert \
              -alias YARootCrt \
              -file ~/.redis/YandexInternalRootCA.crt \
              -keystore ~/.redis/YATrustStore \
              -storepass <secure_store_password> \
              --noprompt && chmod 0655 ~/.redis/YATrustStore
      
Connecting without SSL
Connecting with SSL

src/java/com/example/App.java

package com.example;

import java.util.HashSet;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

public class App {
  public static void main(String[] args) {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

    HashSet<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    jedisClusterNodes.add(new HostAndPort("<FQDN_of_master_host_in_shard_1>", 6379));
    ...
    jedisClusterNodes.add(new HostAndPort("<FQDN_of_master_host_in_shard_N>", 6379));

    DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder().
            password("<password>").
            build();

    try {
      JedisCluster jc = new JedisCluster(jedisClusterNodes, jedisClientConfig, 5, jedisPoolConfig);

      jc.set("foo", "bar");
      System.out.println(jc.get("foo"));
      jc.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

src/java/com/example/App.java

package com.example;

import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import javax.net.ssl.SSLParameters;
import java.util.HashSet;
import java.util.Set;

public class App {
  public static void main(String[] args) {
    System.setProperty("javax.net.ssl.trustStore", "/home/<home_directory>/.redis/YATrustStore");
    System.setProperty("javax.net.ssl.trustStorePassword", "<secure_certificate_storage_password>");

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    SSLParameters sslParameters = new SSLParameters();
    jedisClusterNodes.add(new HostAndPort("<FQDN_of_master_host_in_shard_1>", 6380));
    ...
    jedisClusterNodes.add(new HostAndPort("<FQDN_of_master_host_in_shard_N>", 6380));

    DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder().
            password("<cluster_password>").
            ssl(true).
            sslParameters(sslParameters).
            build();

    try {
      JedisCluster jc = new JedisCluster(jedisClusterNodes, jedisClientConfig, 5, jedisPoolConfig);

      jc.set("foo", "bar");
      System.out.println(jc.get("foo"));
      jc.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

To learn how to get a host FQDN, see this guide.

Connecting:

mvn clean package && \
java -jar target/app-0.1.0-jar-with-dependencies.jar

If your cluster connection and test command are successful, you will see the bar string in the output.

Node.jsNode.js

Before connecting, install the required dependencies:

sudo apt update && sudo apt install --yes nodejs npm && \
npm install ioredis
Connecting without SSL
Connecting with SSL

app.js

"use strict";

const Redis = require("ioredis");

const cluster = new Redis.Cluster(
    [
        {
            host: "<FQDN_of_master_host_in_shard_1>",
            port: 6379
        },
        ...
        {
            host: "<FQDN_of_master_host_in_shard_N>",
            port: 6379
        }
    ],
    {
        redisOptions: {
            password: "<password>"
        }
    }
);

cluster.on("ready", () => {
    Promise.all([
        cluster.set("foo", "bar"),
        cluster.get("foo")
    ]).then(
        (result) => {
            console.log(result[1]); // result == ["OK", "bar"]
            cluster.disconnect();
        },
        (reject) => {
            console.log(reject);
            cluster.disconnect();
        }
    );
});

app.js

"use strict";

const Redis = require("ioredis");
const fs = require("fs");

const cluster = new Redis.Cluster(
    [
        {
            host: "<FQDN_of_master_host_in_shard_1>",
            port: 6380
        },
        ...
        {
            host: "<FQDN_of_master_host_in_shard_N>",
            port: 6380
        },
    ],
    {
        redisOptions: {
            password: "<password>",
            tls: {
                ca: [fs.readFileSync("/home/<home_directory>/.redis/YandexInternalRootCA.crt")],
                checkServerIdentity: () => {
                    return null;
                }
            }
        }
    }
);

cluster.on("ready", () => {
    Promise.all([
        cluster.set("foo", "bar"),
        cluster.get("foo")
    ]).then(
        (result) => {
            console.log(result[1]); // result == [ "OK", "bar"]
            cluster.disconnect();
        },
        (reject) => {
             console.log(reject);
             cluster.disconnect();
        }
    );
});

To learn how to get a host FQDN, see this guide.

Connecting:

node app.js

If your cluster connection and test command are successful, you will see the bar string in the output.

PHPPHP

Before connecting, install the required dependencies:

sudo apt update && sudo apt install --yes php php-dev php-pear && \
sudo pear channel-discover pear.nrk.io && \
sudo pear install nrk/Predis
Connecting without SSL
Connecting with SSL

connect.php

<?php

require "Predis/Autoloader.php";
Predis\Autoloader::register();

$hosts = [
    "tcp://<FQDN_of_master_host_in_shard_1>:6379",
    ...
    "tcp://<FQDN_of_master_host_in_shard_N>:6379",
];

$options = [
    "cluster" => "redis",
    "parameters" => [
        "password" => "<password>",
    ],
];

$conn = new Predis\Client($hosts, $options);
$conn->set("foo", "bar");

var_dump($conn->get("foo"));

$conn->disconnect();
?>

connect.php

<?php

require "Predis/Autoloader.php";
Predis\Autoloader::register();

$hosts = [
    'tls://<FQDN_of_master_host_in_shard_1>:6380?ssl[cafile]=/home/<home_directory>/.redis/YandexInternalRootCA.crt',
    ...
    'tls://<FQDN_of_master_host_in_shard_N>:6380?ssl[cafile]=/home/<home_directory>/.redis/YandexInternalRootCA.crt',
];

$options = [
    'cluster' => 'predis',
    'parameters' => [
        'password' => '<password>',
    ],
];

$conn = new Predis\Client($hosts, $options);
$conn->set('foo', 'bar');

var_dump($conn->get("foo"));

$conn->disconnect();
?>

To learn how to get a host FQDN, see this guide.

Connecting:

php connect.php

If your cluster connection and test command are successful, you will see the bar string in the output.

PythonPython

Before connecting, install the dependencies:

sudo apt update && sudo apt install -y python3 python3-pip python3-venv && \
python3 -m venv env && \
source env/bin/activate && \
pip install pip -U && \
pip install pyopenssl redis-py-cluster setuptools_rust
Connecting without SSL
Connecting with SSL

connect.py

from rediscluster import RedisCluster

startup_nodes = [
    {"host": "<FQDN_of_master_host_in_shard_1>", "port": 6379},
    ...
    {"host": "<FQDN_of_master_host_in_shard_N>", "port": 6379},
]

rc = RedisCluster(
    startup_nodes=startup_nodes,
    decode_responses=True,
    skip_full_coverage_check=True,
    password="<password>",
)

rc.set("foo", "bar")

print(rc.get("foo"))

connect.py

import OpenSSL
from rediscluster import RedisCluster

startup_nodes = [
    {"host": "<FQDN_of_master_host_in_shard_1>", "port": 6380},
    ...
    {"host": "<FQDN_of_master_host_in_shard_N>", "port": 6380},
]

rc = RedisCluster(
    startup_nodes=startup_nodes,
    decode_responses=True,
    skip_full_coverage_check=True,
    password="<password>",
    ssl=True,
    ssl_ca_certs="/home/<home_directory>/.redis/YandexInternalRootCA.crt",
)

rc.set("foo", "bar")

print(rc.get("foo"))

To learn how to get a host FQDN, see this guide.

Connecting:

python3 connect.py

If your cluster connection and test command are successful, you will see the bar string in the output.

RubyRuby

Before connecting, install the required dependencies:

sudo apt update && sudo apt install --yes ruby && \
sudo gem install redis
Connecting without SSL
Connecting with SSL

connect.rb

# coding: utf-8

require 'redis'

nodes = [
  { host: '<FQDN_of_master_host_in_shard_1>', port: 6379 },
  ...
  { host: '<FQDN_of_master_host_in_shard_N>', port: 6379 }
]

conn = Redis.new(
   cluster: nodes,
   password: '<password>'
)

conn.set('foo', 'bar')
puts conn.get('foo')

conn.close

connect.rb

# coding: utf-8

require 'redis'

nodes = [
  { host: '<FQDN_of_master_host_in_shard_1>', port: 6380 },
  ...
  { host: '<FQDN_of_master_host_in_shard_N>', port: 6380 }
]

conn = Redis.new(
  cluster: nodes,
  password: '<password>',
  ssl: true,
  ssl_params: {
    ca_file: '/home/<home_directory>/.redis/YandexInternalRootCA.crt',
    verify_hostname: false
  }
)

conn.set('foo', 'bar')
puts conn.get('foo')

conn.close

To learn how to get a host FQDN, see this guide.

Connecting:

ruby connect.rb

If your cluster connection and test command are successful, you will see the bar string in the output.

Was the article helpful?

Previous
Connection examples for non-sharded clusters
Next
Queries in Yandex WebSQL
© 2026 Direct Cursus Technology L.L.C.