# redis-event [![Build Status](https://travis-ci.com/maplestoria/redis-event.svg?token=LAWtGewQmwi6dpqV9Qcy&branch=master)](https://travis-ci.com/maplestoria/redis-event) [![codecov](https://codecov.io/gh/maplestoria/redis-event/branch/master/graph/badge.svg?token=u9ZqCQjuPi)](https://codecov.io/gh/maplestoria/redis-event) [![Crates.io](https://img.shields.io/crates/v/redis-event)](https://crates.io/crates/redis-event) [![Crates.io](https://img.shields.io/crates/l/redis-event)](LICENSE) 用于监听Redis的写入操作,据此可以实现数据复制,监控等相关的应用。 ``` [dependencies] redis-event = "1.2.1" ``` ## 原理 此crate实现了[Redis Replication协议](https://redis.io/topics/replication),在运行时,程序将以replica的身份连接到Redis,相当于Redis的一个副本。 所以,在程序连接上某个Redis之后,Redis会将它当前的所有数据以RDB的格式dump一份,dump完毕之后便发送过来,这个RDB中的每一条数据就对应一个`Event::RDB`事件。 在这之后,Redis接收到来自客户端的写入操作(即Redis命令)后,也会将这个写入操作传播给它的replica,每一个写入操作就对应一个`Event::AOF`事件。 ## 示例 ```rust 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(()) } ```