#redis #github #forked #git #protocols #redis-raw #com-aminroosta-redis-raw-rs

redis_rawl

最小化的 Redis 客户端库实现。从 redis-raw 分支 [email protected]:aminroosta/redis-raw-rs.git

4 个版本

0.1.20240823 2024年8月23日
0.0.6 2024年8月23日
0.0.5 2024年8月23日
0.0.4 2024年8月23日

#453数据库接口

Download history 253/week @ 2024-08-17

每月 254 次下载

BSD-3-Clause

14KB
208

redis_rawl 是一个最小化的 Redis 客户端库实现。它暴露了一个通用的 Redis 接口。

从 redis-raw 分支 [email protected]:aminroosta/redis-raw-rs.git 分支,更新并调整。

[dependencies]
redis_rawl = "*"

基本操作

redis_rawl 暴露了两个 API 级别:低级别和更高级别!
低级别部分不暴露 Redis 的所有功能,可能在协议的表述上做一些妥协。API 的更高级别部分允许你在 Redis 级别表达任何请求。你可以在任何时刻流畅地在两个 API 级别之间切换。

连接处理

要连接到 Redis,可以使用 tokio::net::TcpStream,它可以转换为(或从)RedisConnection

use redis_raw::RedisConnection;
use tokio::net::TcpStream;

#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
    // stablishes a TcpStream to redis
    let stream = TcpStream::connect("127.0.0.1:6379").await?;
    // RedisConnection can be converted to and from TcpStream
    let mut con: RedisConnection = stream.into();

    // we can use the same the lower level "command" fn
    con.command::<()>("set key value".to_owned()).await?;
    con.command::<i64>("append key !!!".to_owned()).await?;
    let value = con.command::<String>("get key".to_owned()).await?;

    assert_eq!(value, "value!!!");

    for i in 1..3 {
        con.command::<i64>(format!("zadd myset {} {}", i, i * i)).await?;
    }
    let myset = con.command::<Vec<String>>("zrange myset 0 -1".to_owned()).await?;

    assert_eq!(myset, vec!["1", "4"]);
    Ok(())
}

执行低级别命令

要执行低级别命令,可以使用 write()read() 函数,这些函数允许你发出 Redis 请求并解析 Redis(RESP)响应。这些函数对应于底层套接字的读写操作。

read() 函数将 RESP 响应解析为 redis_rawl::Value
Value 代表 Redis 的 RESP 协议响应

use redis_rawl::{RedisConnection, RedisResult, Value }

fn do_something(con: &mut RedisConnection) -> RedisResult<Value> {
   con.write("set key vvv").await?
   con.read().await
}

执行低级别命令

低级别接口类似。command() 函数执行 write()read(),并将 Value 转换为请求的类型。

use redis_rawl::{RedisConnection, RedisResult, Value }

fn do_something(con: &mut RedisConnection) -> RedisResult<String> {
   con.command::<()>("set key value".to_owned()).await?;
   con.command::<i64>("append key !!!".to_owned()).await?;
   con.command::<String>("get key".to_owned()).await
}

以下是一个示例,要了解正确的结果类型,请参阅 redis 文档

use redis_rawl::{RedisConnection, RedisResult, Value }

fn do_something(con: &mut RedisConnection) -> RedisResult<Vec<String>> {
   for i in 1..10 {
       con.command::<i64>(format!("zadd myset {} {}", i, i*i)).await?;
   }
   con.command::<Vec<String>>("zrange myset 0 -1".to_owned()).await
}

以下返回类型受到支持: ()i64StringVec<i64> 以及 Vec<String>

依赖项

~3-11MB
~110K SLoC