Библиотека 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()?