4个版本

0.1.3 2022年11月17日
0.1.2 2022年11月17日
0.1.1 2022年11月17日
0.1.0 2022年11月17日

#908 in 数据库接口


lunatic-db 中使用

BSD-3-Clause

335KB
6K SLoC

lunatic_redis

Rust crates.io Chat

Lunatic-Redis-rs是Lunatic VM的Rust高级Redis库。它通过一个非常灵活但底层的API提供对Redis所有功能的便捷访问。它使用可定制的类型转换特性,使任何操作都可以返回您期望的类型的结果。这为开发体验带来了极大的愉悦。

该包名为lunatic_redis,您可以通过Cargo依赖它。

[dependencies]
lunatic_redis = "0.1.0"

有关库的文档可在docs.rs/lunatic_redis找到。

注意:lunatic_redis需要至少Lunatic VM 0.12.0和Rust 1.59。

基本操作

要打开连接,您需要创建一个客户端,然后从它获取连接。未来将为这些连接提供连接池,但目前每个连接都是独立的,没有池化。

许多命令是通过Commands特质实现的,但也可以手动创建命令。

extern crate lunatic_redis;
use lunatic_redis::{self as 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")
}

TLS支持

TLS默认通过Lunatic VM启用,因此您应该能够使用rediss:// URL方案连接到Redis实例

let client = lunatic_redis::Client::open("rediss://127.0.0.1/")?;

集群支持

当前不支持 可以通过在Cargo.toml中将"cluster"指定为功能条目来使用集群模式。

redis= {版本= "0.22.1",功能= [ "集群"] }

然后您可以简单地使用ClusterClient,它接受可用节点的列表。

use redis::cluster::ClusterClient;
use redis::Commands;

fn fetch_an_integer() -> String {
    // connect to redis
    let nodes = vec!["redis://127.0.0.1/"];
    let client = ClusterClient::open(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;
}

JSON支持

当前不支持 通过在Cargo.toml中将"json"指定为功能来启用RedisJSON模块的支持。

redis= {版本= "0.22.1",功能= ["json"] }

然后您可以简单地导入JsonCommands特质,它将为所有Redis连接添加json命令(不要与仅添加默认命令的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)?
    
    // you'll need to use serde_json (or some other json lib) to deserialize the results from the bytes
    // It will always be a Vec, if no results were found at the path it'll be an empty Vec
}

开发

要测试redis,您需要能够与Redis模块一起进行测试,为此,在运行测试脚本之前,您必须设置以下环境变量

  • REDIS_RS_REDIS_JSON_PATH = RedisJSON模块的绝对路径(通常称为librejson.so)。

如果您想在库上进行开发,makefile提供了一些命令

构建

$ make

测试

$ make test

运行基准测试

$ make bench

构建文档(需要夜间编译器,见rust-lang/rust#43781

$ make docs

我们鼓励您在寻求合并您的工作之前运行clippy。这些lint可能非常严格。在自己的工作站上运行此命令可以节省您的时间,因为Travis CI将失败任何不满足clippy的构建。

$ cargo clippy --all-features --all --tests --examples -- -D clippy::all -D warnings

依赖项

~2.9–4MB
~106K SLoC