Примеры кода для подключения к нешардированному кластеру Valkey™
C#
Перед подключением:
-
Установите зависимости:
sudo apt update && sudo apt install --yes apt-transport-https dotnet-sdk-6.0 -
Создайте директорию для проекта:
cd ~/ && mkdir cs-project && cd cs-project -
Создайте конфигурационный файл:
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> -
Для подключения с SSL получите SSL-сертификат.
Пример кода для подключения с помощью Sentinel:
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 = "<пароль>";
static async Task<int> Main(string[] args)
{
try
{
var sentinelOptions = new ConfigurationOptions
{
EndPoints = {
"<FQDN_хоста_1_Valkey™>:26379",
...
"<FQDN_хоста_N_Valkey™>:26379"
},
CommandMap = CommandMap.Sentinel
};
var sentinelConnection = await ConnectionMultiplexer.ConnectAsync(sentinelOptions);
var endpoints = sentinelConnection.GetEndPoints();
var sentinelServer = sentinelConnection.GetServer(endpoints[0]);
var masterEndpoint = await sentinelServer.SentinelGetMasterAddressByNameAsync("mymaster");
await sentinelConnection.CloseAsync();
var masterOptions = new ConfigurationOptions
{
EndPoints = { masterEndpoint },
User = USERNAME,
Password = PASSWORD,
Ssl = false
};
var connection = await ConnectionMultiplexer.ConnectAsync(masterOptions);
var db = connection.GetDatabase();
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}");
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 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 = "<пароль>";
static async Task<int> Main(string[] args)
{
try
{
var masterOptions = new ConfigurationOptions
{
EndPoints = { "<FQDN_хоста-мастера_Valkey™>:6379" },
User = USERNAME,
Password = PASSWORD
};
var connection = await ConnectionMultiplexer.ConnectAsync(masterOptions);
var db = connection.GetDatabase();
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}");
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 = "<пароль>";
private const string CERT = "/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt"
static async Task<int> Main(string[] args)
{
try
{
var masterOptions = new ConfigurationOptions
{
EndPoints = { "<FQDN_хоста-мастера_Valkey™>:6380" },
User = USERNAME,
Password = PASSWORD,
Ssl = true,
SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13
};
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;
}
}
}
}
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
cd ~/cs-project && \
dotnet build && dotnet run bin/Debug/net6.0/RedisClient
При успешном подключении к кластеру и выполнении тестового запроса будут выведены строки:
Successfully set test-key = test-value
Successfully retrieved test-key = test-value
Go
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes golang git && \
go mod init github.com/go-redis/redis && \
go get github.com/go-redis/redis/v7
Пример кода для подключения с помощью Sentinel:
connect.go
package main
import (
"fmt"
"github.com/go-redis/redis/v7"
)
func main() {
conn := redis.NewUniversalClient(
&redis.UniversalOptions{
Addrs: []string{
"<FQDN_хоста_1_Valkey™>:26379",
...
"<FQDN_хоста_N_Valkey™>:26379"},
MasterName: "<имя_кластера_Valkey™>",
Password: "<пароль>",
ReadOnly: false,
},
)
err := conn.Set("foo", "bar", 0).Err()
if err != nil {
panic(err)
}
result, err := conn.Get("foo").Result()
if err != nil {
panic(err)
}
fmt.Println(result)
conn.Close()
}
Пример кода для подключения напрямую к мастеру:
connect.go
package main
import (
"fmt"
"github.com/go-redis/redis/v7"
)
func main() {
conn := redis.NewUniversalClient(
&redis.UniversalOptions{
Addrs: []string{"c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6379"},
Password: "<пароль>",
ReadOnly: false,
},
)
err := conn.Set("foo", "bar", 0).Err()
if err != nil {
panic(err)
}
result, err := conn.Get("foo").Result()
if err != nil {
panic(err)
}
fmt.Println(result)
conn.Close()
}
connect.go
package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"github.com/go-redis/redis/v7"
"io/ioutil"
)
const (
cert = "/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt"
)
func main() {
rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile(cert)
if err != nil {
panic(err)
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
panic("Failed to append PEM.")
}
conn := redis.NewUniversalClient(
&redis.UniversalOptions{
Addrs: []string{"c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6380"},
Password: "<пароль>",
ReadOnly: false,
TLSConfig: &tls.Config{
RootCAs: rootCertPool,
},
},
)
err = conn.Set("foo", "bar", 0).Err()
if err != nil {
panic(err)
}
result, err := conn.Get("foo").Result()
if err != nil {
panic(err)
}
fmt.Println(result)
conn.Close()
}
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
go run connect.go
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.
Java
Перед подключением:
-
Установите зависимости:
sudo apt update && sudo apt install --yes default-jdk maven -
Создайте директорию для проекта Maven:
cd ~/ && mkdir --parents project/src/java/com/example && cd project/ -
Создайте конфигурационный файл для 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>Актуальные версии зависимостей для Maven:
-
Для подключения с SSL:
-
Создайте защищенное хранилище сертификатов:
keytool -importcert \ -alias YARootCrt \ -file ~/.redis/YandexInternalRootCA.crt \ -keystore ~/.redis/YATrustStore \ -storepass <пароль_защищенного_хранилища> \ --noprompt && chmod 0655 ~/.redis/YATrustStore
Пример кода для подключения с помощью Sentinel:
src/java/com/example/App.java
package com.example;
import java.util.HashSet;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
public class App {
public static void main(String[] args) {
String redisName = "<имя_кластера_Valkey™>";
String redisPass = "<пароль>";
HashSet sentinels = new HashSet();
sentinels.add("<FQDN_хоста_1_Valkey™>:26379");
...
sentinels.add("<FQDN_хоста_N_Valkey™>:26379");
try {
JedisSentinelPool pool = new JedisSentinelPool(redisName, sentinels);
Jedis conn = pool.getResource();
conn.auth(redisPass);
conn.set("foo", "bar");
System.out.println(conn.get("foo"));
pool.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Пример кода для подключения напрямую к мастеру:
src/java/com/example/App.java
package com.example;
import redis.clients.jedis.Jedis;
public class App {
public static void main(String[] args) {
String redisHost = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz";
String redisPass = "<пароль>";
try {
Jedis conn = new Jedis(redisHost);
conn.auth(redisPass);
conn.set("foo", "bar");
System.out.println(conn.get("foo"));
conn.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.Jedis;
import javax.net.ssl.SSLParameters;
public class App {
public static void main(String[] args) {
String redisHost = "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz";
String redisPass = "<пароль_кластера>";
System.setProperty("javax.net.ssl.trustStore", "/home/<домашняя_директория>/.redis/YATrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "<пароль_защищенного_хранилища_сертификатов>");
SSLParameters sslParameters = new SSLParameters();
DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder().
password(redisPass).
ssl(true).
sslParameters(sslParameters).
build();
try {
Jedis conn = new Jedis(new HostAndPort(redisHost, 6380), jedisClientConfig);
conn.set("foo", "bar");
System.out.println(conn.get("foo"));
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
mvn clean package && \
java -jar target/app-0.1.0-jar-with-dependencies.jar
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.
Node.js
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes nodejs npm && \
npm install ioredis
Пример кода для подключения с помощью Sentinel:
app.js
"use strict";
const Redis = require("ioredis");
const conn = new Redis({
sentinels: [
{ host: "<FQDN_хоста_1_Valkey™>", port: 26379 },
...
{ host: "<FQDN_хоста_N_Valkey™>", port: 26379 },
],
name: "<имя_кластера_Valkey™>",
password: "<пароль>"
});
conn.set("foo", "bar", function (err) {
if (err) {
console.error(err);
conn.disconnect();
}
});
conn.get("foo", function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
conn.disconnect();
});
Пример кода для подключения напрямую к мастеру:
app.js
"use strict";
const Redis = require("ioredis");
const conn = new Redis({
host: "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz",
port: 6379,
password: "<пароль>"
});
conn.set("foo", "bar", function (err) {
if (err) {
console.error(err);
conn.disconnect();
}
});
conn.get("foo", function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
conn.disconnect();
});
app.js
"use strict";
const fs = require("fs");
const Redis = require("ioredis");
const conn = new Redis({
host: "c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz",
port: 6380,
password: "<пароль>",
tls: {
ca: fs.readFileSync("/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt"),
}
});
conn.set("foo", "bar", function (err) {
if (err) {
console.error(err);
conn.disconnect();
}
});
conn.get("foo", function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
conn.disconnect();
});
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
node app.js
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.
PHP
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes php php-dev php-pear && \
sudo pear channel-discover pear.nrk.io && \
sudo pear install nrk/Predis
Пример кода для подключения с помощью Sentinel:
connect.php
<?php
require "Predis/Autoloader.php";
Predis\Autoloader::register();
$sentinels = [
"<FQDN_хоста_1_Valkey™>:26379",
...
"<FQDN_хоста_N_Valkey™>:26379",
];
$options = [
"replication" => "sentinel",
"service" => "<имя_кластера_Valkey™>",
"parameters" => [
"password" => "<пароль>",
],
];
$conn = new Predis\Client($sentinels, $options);
$conn->set("foo", "bar");
var_dump($conn->get("foo"));
$conn->disconnect();
?>
Пример кода для подключения напрямую к мастеру:
connect.php
<?php
require "Predis/Autoloader.php";
Predis\Autoloader::register();
$host = ["c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6379"];
$options = [
"parameters" => [
"password" => "<пароль>",
],
];
$conn = new Predis\Client($host, $options);
$conn->set("foo", "bar");
var_dump($conn->get("foo"));
$conn->disconnect();
?>
connect.php
<?php
require "Predis/Autoloader.php";
Predis\Autoloader::register();
$host = ["c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz:6380"];
$options = [
"parameters" => [
"scheme" => "tls",
"ssl" => [
"cafile" => "/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt",
"verify_peer" => true,
"verify_peer_name" => false,
],
"password" => "<пароль>",
],
];
$conn = new Predis\Client($host, $options);
$conn->set("foo", "bar");
var_dump($conn->get("foo"));
$conn->disconnect();
?>
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
php connect.php
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.
Python
Перед подключением установите зависимости:
sudo apt update && sudo apt install -y python3 python3-pip && \
pip3 install redis
Пример кода для подключения с помощью Sentinel:
connect.py
from redis.sentinel import Sentinel
sentinels = [
"<FQDN_хоста_1_Valkey™>",
...
"<FQDN_хоста_N_Valkey™>"
]
name = "<имя_кластера_Valkey™>"
pwd = "<пароль>"
sentinel = Sentinel([(h, 26379) for h in sentinels], socket_timeout=0.1)
master = sentinel.master_for(name, password=pwd)
slave = sentinel.slave_for(name, password=pwd)
master.set("foo", "bar")
print(slave.get("foo"))
Пример кода для подключения без использования SSL-соединения напрямую к мастеру:
connect.py
import redis
r = redis.StrictRedis(
host="c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz",
port=6379,
password="<пароль>",
)
r.set("foo", "bar")
print(r.get("foo"))
connect.py
import redis
r = redis.StrictRedis(
host="c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz",
port=6380,
password="<пароль>",
ssl=True,
ssl_ca_certs="/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt",
)
r.set("foo", "bar")
print(r.get("foo"))
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
python3 connect.py
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.
Ruby
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes ruby && \
sudo gem install redis
Пример кода для подключения с помощью Sentinel:
connect.rb
# coding: utf-8
require 'redis'
SENTINELS = [
{ host: '<FQDN_хоста_1_Valkey™>', port: 26379 },
...
{ host: '<FQDN_хоста_N_Valkey™>', port: 26379 }
]
conn = Redis.new(
host: '<имя_кластера_Valkey™>',
sentinels: SENTINELS,
role: 'master',
password: '<пароль>'
)
conn.set('foo', 'bar')
puts conn.get('foo')
conn.close
Пример кода для подключения без использования SSL-соединения напрямую к мастеру:
connect.rb
# coding: utf-8
require 'redis'
conn = Redis.new(
host: 'c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz',
port: 6379,
password: '<пароль>'
)
conn.set('foo', 'bar')
puts conn.get('foo')
conn.close
connect.rb
# coding: utf-8
require 'redis'
conn = Redis.new(
host: 'c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz',
port: 6380,
password: '<пароль>',
ssl: true,
ssl_params: { ca_file: '/home/<домашняя_директория>/.redis/YandexInternalRootCA.crt' },
)
conn.set('foo', 'bar')
puts conn.get('foo')
conn.close
О том, как получить FQDN хоста, см. инструкцию.
Подключение:
ruby connect.rb
При успешном подключении к кластеру и выполнении тестового запроса будет выведена строка bar.