Redis-rs — это библиотека Redis высокого уровня для Rust. Он обеспечивает удобный доступ ко всем функциям Redis через очень гибкий, но низкоуровневый API. Он использует настраиваемую особенность преобразования типов, поэтому любая операция может возвращать результаты именно того типа, который вы ожидаете. Это создает очень приятный опыт разработки.
Ящик называется redis
, и вы можете зависеть от него через Cargo:
[dependencies]
redis = " 0.27.5 "
Документацию по библиотеке можно найти по адресу docs.rs/redis.
Чтобы открыть соединение, вам необходимо создать клиент, а затем получить от него соединение. В будущем для них будет создан пул соединений, в настоящее время каждое соединение является отдельным и не объединено в пул.
Многие команды реализуются через свойство Commands
, но возможно также создание команд вручную.
use redis :: Commands ;
fn fetch_an_integer ( ) -> redis :: RedisResult < isize > {
// connect to redis
let client = redis :: Client :: open ( "redis://127.0.0.1/" ) ? ;
let mut con = client . get_connection ( ) ? ;
// throw away the result, just make sure it does not fail
let _ : ( ) = con . set ( "my_key" , 42 ) ? ;
// read back the key and return it. Because the return value
// from the function is a result for integer this will automatically
// convert into one.
con . get ( "my_key" )
}
Переменные преобразуются в формат Redis и обратно для самых разных типов ( String
, числовые типы, кортежи, Vec
). Если вы хотите использовать его со своими собственными типами, вы можете реализовать черты FromRedisValue
и ToRedisArgs
или получить его с помощью крейта redis-macros.
Чтобы включить асинхронные клиенты, включите соответствующую функцию в вашем Cargo.toml, tokio-comp
для пользователей tokio или async-std-comp
для пользователей async-std.
# if you use tokio
redis = { version = "0.27.5", features = ["tokio-comp"] }
# if you use async-std
redis = { version = "0.27.5", features = ["async-std-comp"] }
Чтобы включить поддержку TLS, вам необходимо использовать соответствующую запись функции в вашем Cargo.toml. В настоящее время поддерживаются native-tls
и rustls
.
Чтобы использовать native-tls
:
redis = { version = "0.27.5", features = ["tls-native-tls"] }
# if you use tokio
redis = { version = "0.27.5", features = ["tokio-native-tls-comp"] }
# if you use async-std
redis = { version = "0.27.5", features = ["async-std-native-tls-comp"] }
Чтобы использовать rustls
:
redis = { version = "0.27.5", features = ["tls-rustls"] }
# if you use tokio
redis = { version = "0.27.5", features = ["tokio-rustls-comp"] }
# if you use async-std
redis = { version = "0.27.5", features = ["async-std-rustls-comp"] }
С помощью rustls
вы можете добавить следующие флаги функций поверх других флагов функций, чтобы включить дополнительные функции:
tls-rustls-insecure
: разрешить небезопасные соединения TLS.tls-rustls-webpki-roots
: использовать webpki-roots
(корневые сертификаты Mozilla) вместо собственных корневых сертификатов. тогда вы сможете подключиться к экземпляру Redis, используя схему URL-адресов rediss://
:
let client = redis :: Client :: open ( "rediss://127.0.0.1/" ) ? ;
Чтобы включить небезопасный режим, добавьте #insecure
в конце URL-адреса:
let client = redis :: Client :: open ( "rediss://127.0.0.1/#insecure" ) ? ;
Уведомление об устаревании. Если вы использовали функции tls
или async-std-tls-comp
, используйте функции tls-native-tls
или async-std-native-tls-comp
соответственно.
Поддержку кластера Redis можно включить, включив функцию cluster
в вашем Cargo.toml:
redis = { version = "0.27.5", features = [ "cluster"] }
Затем вы можете просто использовать ClusterClient
, который принимает список доступных узлов. Обратите внимание, что при создании экземпляра клиента необходимо указать только один узел в кластере, хотя вы можете указать несколько.
use redis :: cluster :: ClusterClient ;
use redis :: Commands ;
fn fetch_an_integer ( ) -> String {
let nodes = vec ! [ "redis://127.0.0.1/" ] ;
let client = ClusterClient :: new ( nodes ) . unwrap ( ) ;
let mut connection = client . get_connection ( ) . unwrap ( ) ;
let _ : ( ) = connection . set ( "test" , "test_data" ) . unwrap ( ) ;
let rv : String = connection . get ( "test" ) . unwrap ( ) ;
return rv ;
}
Поддержку асинхронного кластера Redis можно включить, включив функцию cluster-async
вместе с предпочитаемой асинхронной средой выполнения, например:
redis = { version = "0.27.5", features = [ "cluster-async", "tokio-std-comp" ] }
use redis :: cluster :: ClusterClient ;
use redis :: AsyncCommands ;
async fn fetch_an_integer ( ) -> String {
let nodes = vec ! [ "redis://127.0.0.1/" ] ;
let client = ClusterClient :: new ( nodes ) . unwrap ( ) ;
let mut connection = client . get_async_connection ( ) . await . unwrap ( ) ;
let _ : ( ) = connection . set ( "test" , "test_data" ) . await . unwrap ( ) ;
let rv : String = connection . get ( "test" ) . await . unwrap ( ) ;
return rv ;
}
Поддержку модуля RedisJSON можно включить, указав «json» в качестве функции в вашем Cargo.toml.
redis = { version = "0.27.5", features = ["json"] }
Затем вы можете просто импортировать черту JsonCommands
, которая добавит команды json
ко всем соединениям Redis (не путать с Commands
, которые добавляют только команды по умолчанию).
use redis :: Client ;
use redis :: JsonCommands ;
use redis :: RedisResult ;
use redis :: ToRedisArgs ;
// Result returns Ok(true) if the value was set
// Result returns Err(e) if there was an error with the server itself OR serde_json was unable to serialize the boolean
fn set_json_bool < P : ToRedisArgs > ( key : P , path : P , b : bool ) -> RedisResult < bool > {
let client = Client :: open ( "redis://127.0.0.1" ) . unwrap ( ) ;
let connection = client . get_connection ( ) . unwrap ( ) ;
// runs `JSON.SET {key} {path} {b}`
connection . json_set ( key , path , b ) ?
}
Чтобы проанализировать результаты, вам нужно будет использовать serde_json
(или какую-либо другую библиотеку json) для десериализации результатов из байтов. Это всегда будет Vec
. Если по пути не было найдено результатов, это будет пустой Vec
. Если вы хотите автоматически обрабатывать десериализацию и развертывание Vec
, вы можете использовать оболочку Json
из крейта redis-macros.
Чтобы протестировать redis
, вам понадобится возможность протестировать его с помощью модулей Redis. Для этого вам необходимо установить следующую переменную среды перед запуском тестового сценария.
REDIS_RS_REDIS_JSON_PATH
= абсолютный путь к модулю RedisJSON (либо librejson.so
для Linux, либо librejson.dylib
для MacOS).
Пожалуйста, перейдите по этой ссылке, чтобы получить доступ к модулю RedisJSON:
Если вы хотите разрабатывать библиотеку, в make-файле есть несколько команд:
Чтобы построить:
$ make
Чтобы проверить:
$ make test
Чтобы запустить тесты:
$ make bench
Чтобы собрать документацию (требуется ночной компилятор, см. Rust-lang/rust#43781):
$ make docs
Мы рекомендуем вам запустить clippy
прежде чем искать слияние для вашей работы. Ворсы могут быть довольно строгими. Запуск этого на вашей собственной рабочей станции может сэкономить вам время, поскольку Travis CI завершится неудачей любой сборки, которая не удовлетворяет clippy
:
$ cargo clippy --all-features --all --tests --examples -- -D clippy::all -D warnings
Чтобы запустить нечеткие тесты с помощью afl, сначала установите груз-afl ( cargo install -f afl
), затем запустите:
$ make fuzz
Если фаззер обнаружит сбой, чтобы его воспроизвести, запустите:
$ cd afl//
$ cargo run --bin reproduce -- out/crashes/