Crates.io | redis-event |
lib.rs | redis-event |
version | 1.2.1 |
source | src |
created_at | 2020-01-29 14:32:08.972621 |
updated_at | 2020-08-17 11:57:53.960005 |
description | 用于监听Redis的写入操作,据此可以实现数据复制,监控等相关的应用 |
homepage | https://github.com/maplestoria/redis-event |
repository | https://github.com/maplestoria/redis-event |
max_upload_size | |
id | 203045 |
size | 9,266,451 |
用于监听Redis的写入操作,据此可以实现数据复制,监控等相关的应用。
[dependencies]
redis-event = "1.2.1"
此crate实现了Redis Replication协议,在运行时,程序将以replica的身份连接到Redis,相当于Redis的一个副本。
所以,在程序连接上某个Redis之后,Redis会将它当前的所有数据以RDB的格式dump一份,dump完毕之后便发送过来,这个RDB中的每一条数据就对应一个Event::RDB
事件。
在这之后,Redis接收到来自客户端的写入操作(即Redis命令)后,也会将这个写入操作传播给它的replica,每一个写入操作就对应一个Event::AOF
事件。
use std::net::{IpAddr, SocketAddr};
use std::sync::atomic::AtomicBool;
use std::sync::Arc;
use std::str::FromStr;
use std::rc::Rc;
use std::cell::RefCell;
use std::io;
use redis_event::listener;
use redis_event::config::Config;
use redis_event::{NoOpEventHandler, RedisListener};
fn main() -> io::Result<()> {
let host = String::from("127.0.0.1");
let port = 6379;
let conf = Config {
is_discard_rdb: false, // 不跳过RDB
is_aof: false, // 不处理AOF
host,
port,
username: String::new(), // 用户名为空
password: String::new(), // 密码为空
repl_id: String::from("?"), // replication id,若无此id,设置为?即可
repl_offset: -1, // replication offset,若无此offset,设置为-1即可
read_timeout: None, // None,即读取永不超时
write_timeout: None, // None,即写入永不超时
is_tls_enabled: false, // 不启用TLS
is_tls_insecure: false, // 未启用TLS,设置为false即可
identity: None, // 未启用TLS,设置为None即可
identity_passwd: None // 未启用TLS,设置为None即可
};
let running = Arc::new(AtomicBool::new(true));
let mut builder = listener::Builder::new();
builder.with_config(conf);
// 设置控制变量, 通过此变量在外界中断`redis_event`内部的逻辑
builder.with_control_flag(running);
// 设置事件处理器
builder.with_event_handler(Rc::new(RefCell::new(NoOpEventHandler{})));
let mut redis_listener = builder.build();
// 启动程序
redis_listener.start()?;
Ok(())
}