今天分享一个Rust的第三方库 simple_redis 的使用。
这个库正向它的名字一样,简单易用,是基于redis-rs库封装的,不过目前使用下来仅支持单个的redis连接,稍微有点遗憾,不过这个库本身还是较好用的。
安装:
[dependencies]
simple_redis = "0.3.44"
cargo build
使用:
连接数据库:
fn test() -> Result<(), simple_redis::RedisError> {
let mut clients = simple_redis::create("redis://127.0.0.1:6379/0")?;
}
create方法参数的书写通式: redis://[:<passwd>@]<hostname>[:port][/<db>]
create返回值是Result<simple_redis::client::Client,simple_redis::RedisError>
match simple_redis::create("redis://127.0.0.1:6379/") {
Ok(clients) => clients,
Err(error) => println!("error:{}", error)
}
注意:通过 ? 运算符同样可以取到Result和Option的值,值为Err或者None的情况会直接返回这些值。所以要求使用此运算符所在的函数返回值要与调用方法返回类型一致才可以调用。
认证密码:
clients.auth("*******");
设置redis string类型:
clients.set("rust_key", "sdkdd");
clients.set("rust_key_num", 233_i32);
获取redis string:
let str_val = clients.get::<String>("rust_key")?;
let num_val = clients.get::<i32>("rust_key_num")?;
设置list:
clients.lpush("rust_list", "sdkdd");
clients.rpush("rust_list", "sdkdd");
clients.lpushx("rust_list", "sdkdd");
clients.rpushx("rust_list", "sdkdd");
redis list pop:
let val = clients.lpop::<String>("rust_list")?;
let val2 = clients.rpop::<String>("rust_list")?;
获取list range:
let list:Vec<String> = clients.lrange("rust_list", 0, -1)?;
设置Hash:
clients.hset("rust_hash", "a", 1);
clients.hsetnx("rust_hash", "b", 1);
读取hash:
clients.hget::<i32>("rust_hash", "a"); // 1 i32类型
clients.hget_string("rust_hash", "a"); // "1" String类型
clients.hgetall("rust_hash"); // HashMap<String,String>类型
无序集合处理:
clients.sadd("rust_set", "b");
clients.sadd("rust_set", "a");
clients.smembers("rust_set")?; // Vec<String>类型
clients.sismember("rust_set", "c")?; // 判断元素存在 bool类型
以上仅列举了一部分的支持的方法,目前有序集合、集群命令等没有直接支持。
需要使用的话则可以使用如下方法:
clients.run_command("zadd", vec!["rust_zem", "1", "me3"])?;
clients.run_command::<HashMap<String, String>>("zrange", vec!["rust_zem", "0", "-1", "WITHSCORES"])?;
clients.run_command::<Vec<String>>("zrange", vec!["rust_zem", "0", "-1", "WITHSCORES"])?;
run_command函数还有几个固定返回类型的函数:
run_command_bool_response(self:&mut Client, command:&str, arg:Vec<String>)
run_command_string_response(self:&mut Client, command:&str, arg:Vec<String>)
run_command_empty_response(self:&mut Client, command:&str, arg:Vec<String>)
run_command_from_string_response(self:&mut Client, command:&str, arg:Vec<String>)
上面的方法自由度较高,可以调用很多命令。
其他:
也可以直接使用redis-rs,不过使用的相对繁琐一些,需要自行封装。
安装:
[dependencies]
redis = "0.12.0"
简单使用:
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut con = client.get_connection()?;
redis::cmd("SET").arg("rust_key").arg(42).execute(&mut con)?;
let val:i32 = redis::cmd("GET").arg("rust_key").arg(42).query::<i32>(&mut con)?;