#redis #r2d2 #pool #连接池

redis_r2d2

Redis 对 r2d2 连接池的支持

1 个不稳定版本

0.17.0 2020年8月4日

#2886数据库接口

MIT/Apache

6KB
85

redis-r2d2

Documentation

redis-rsr2d2 连接池的支持库,完全基于 r2d2-redis 开发。

文档可在此处查看:这里

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
redis_r2d2 = "*"

标准用法

此示例展示了使用 redis::Commands 提供的便利方法的典型用例。您会注意到这实际上与直接使用 redis crate 几乎相同。感谢 Deref 特性,您可以直接在连接池连接上调用任何 Connection 方法。

use std::thread;

use redis_r2d2::{r2d2, RedisConnectionManager};
use redis_r2d2::redis::Commands;

fn main() {
    let manager = RedisConnectionManager::new("redis://127.0.0.1").unwrap();
    let pool = r2d2::Pool::builder()
        .build(manager)
        .unwrap();

    let mut handles = vec![];

    for _i in 0..10i32 {
        let pool = pool.clone();
        handles.push(thread::spawn(move || {
            let mut conn = pool.get().unwrap();
            let n: i64 = conn.incr("counter", 1).unwrap();
            println!("Counter increased to {}", n);
        }));
    }

    for h in handles {
        h.join().unwrap();
    }
}

手动查询构建

不幸的是,有时不能使用 Deref 特性。这通常发生在您需要将 redis 连接传递到其他地方时,例如在手动构建查询时以及/或者当 redis crate 没有为特定命令(例如 PING)提供便利方法时。在这些情况下,您必须直接使用并调用 Deref 特性。

extern crate redis_r2d2;

use std::ops::DerefMut;
use std::thread;

use redis_r2d2::{r2d2, redis, RedisConnectionManager};

fn main() {
    let manager = RedisConnectionManager::new("redis://127.0.0.1").unwrap();
    let pool = r2d2::Pool::builder()
        .build(manager)
        .unwrap();

    let mut handles = vec![];

    for _i in 0..10i32 {
        let pool = pool.clone();
        handles.push(thread::spawn(move || {
            let mut conn = pool.get().unwrap();
            let reply = redis::cmd("PING").query::<String>(conn.deref_mut()).unwrap();
            // Alternatively, without deref():
            // let reply = redis::cmd("PING").query::<String>(&mut *conn).unwrap();
            assert_eq!("PONG", reply);
        }));
    }

    for h in handles {
        h.join().unwrap();
    }
}

依赖关系

~3.5–9.5MB
~112K SLoC