Redis клиент на Rust: полное руководство по работе с библиотекой redis-rs

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека redis-rs: Rust клиент для Redis

redis-rs — это основная, зрелая и наиболее популярная библиотека для работы с Redis из языка Rust. Она предоставляет как синхронный, так и асинхронный (на базе tokio или async-std) API, поддерживает кластеризацию, пайплайны, Pub/Sub, транзакции и скрипты Lua. Библиотека отличается высокой производительностью, типобезопасностью и эргономичностью, присущей экосистеме Rust.

Установка и подключение

Добавьте зависимость в Cargo.toml:

[dependencies]
redis = { version = "0.25", features = ["tokio-comp"] }  # для async с tokio
# или
redis = "0.25"  # только синхронный режим

Базовое подключение к Redis (синхронный вариант):

use redis::Commands;

fn main() -> redis::RedisResult<()> {
    let client = redis::Client::open("redis://127.0.0.1:6379/")?;
    let mut con = client.get_connection()?;

    // Установка и получение значения
    con.set("key", "value")?;
    let val: String = con.get("key")?;
    println!("Получено: {}", val);

    Ok(())
}

Основные возможности

1. Типизированные команды

Библиотека автоматически преобразует типы Rust в типы Redis и обратно. Поддерживаются строки, числа, кортежи, векторы, а также пользовательские типы через трейт FromRedisValue / ToRedisArgs.

use redis::Commands;

let mut con = client.get_connection()?;
let count: i32 = con.incr("counter", 2)?;  // атомарный инкремент
let exists: bool = con.exists("nonexistent")?;
let members: Vec<String> = con.smembers("set_key")?;

2. Пайплайны (конвейеры)

Пайплайны позволяют отправить несколько команд за один сетевой запрос, что значительно ускоряет пакетные операции.

use redis::Pipeline;

let mut pipe = Pipeline::new();
pipe.cmd("SET").arg("a").arg(1).ignore();
pipe.cmd("SET").arg("b").arg(2).ignore();
pipe.cmd("GET").arg("a");
let result: i32 = pipe.query(&mut con)?;
println!("Значение a: {}", result);

3. Асинхронный режим (async/await)

Для высоконагруженных приложений используйте асинхронный API на основе tokio или async-std.

use redis::AsyncCommands;

#[tokio::main]
async fn main() -> redis::RedisResult<()> {
    let client = redis::Client::open("redis://127.0.0.1:6379/")?;
    let mut con = client.get_multiplexed_async_connection().await?;

    con.set("async_key", "async_value").await?;
    let val: String = con.get("async_key").await?;
    println!("Async: {}", val);

    Ok(())
}

4. Pub/Sub (издатель-подписчик)

Реализация паттерна Pub/Sub для обмена сообщениями в реальном времени.

use redis::{AsyncCommands, RedisResult};

#[tokio::main]
async fn main() -> RedisResult<()> {
    let client = redis::Client::open("redis://127.0.0.1:6379/")?;

    // Подписчик
    let mut pubsub = client.get_async_connection().await?.into_pubsub();
    pubsub.subscribe("news").await?;

    loop {
        let msg = pubsub.next_message().await?;
        println!("Получено: {:?}", msg.get_payload::<String>()?);
    }
}

5. Транзакции (MULTI/EXEC)

Группировка команд в атомарную транзакцию.

use redis::Commands;

let mut con = client.get_connection()?;
redis::transaction(&mut con, &["key1", "key2"], |con, pipe| {
    pipe.cmd("SET").arg("key1").arg(42).ignore();
    pipe.cmd("INCR").arg("key2");
    pipe.query(con)
})?;

6. Кластеризация

Для работы с Redis Cluster используйте redis::cluster::ClusterClient:

use redis::cluster::ClusterClient;

let nodes = vec!["redis://127.0.0.1:7000/", "redis://127.0.0.1:7001/"];
let client = ClusterClient::new(nodes)?;
let mut con = client.get_connection()?                    

Рекомендаций