redis_event/cmd/
mod.rs

1/*!
2所有支持的Redis命令的定义,以及命令相关的解析代码俱在此模块下
3
4此模块包括:
5- 所有支持的Redis命令定义,见于枚举[Command]及各个子模块
6- 相关Redis命令的解析代码,见于各个子模块
7
8子模块的命名与分组,按照[Redis Command Reference]中的`filter by group`进行命名与分组,各个命令所对应的结构体中的字段命名已尽可能和文档中的保持一致。
9
10所有涉及到的命令参考[Redis Command Reference]所描述。
11
12[Command]: enum.Command.html
13[Redis Command Reference]: https://redis.io/commands
14*/
15use crate::cmd::connection::{SELECT, SWAPDB};
16use crate::cmd::hashes::*;
17use crate::cmd::hyperloglog::{PFADD, PFCOUNT, PFMERGE};
18use crate::cmd::keys::*;
19use crate::cmd::lists::*;
20use crate::cmd::pub_sub::PUBLISH;
21use crate::cmd::scripting::{EVAL, EVALSHA, SCRIPTLOAD};
22use crate::cmd::server::{FLUSHALL, FLUSHDB};
23use crate::cmd::sets::*;
24use crate::cmd::sorted_sets::*;
25use crate::cmd::streams::{XACK, XADD, XCLAIM, XDEL, XGROUP, XTRIM};
26use crate::cmd::strings::*;
27use crate::{Event, EventHandler};
28
29pub mod connection;
30pub mod hashes;
31pub mod hyperloglog;
32pub mod keys;
33pub mod lists;
34pub mod pub_sub;
35pub mod scripting;
36pub mod server;
37pub mod sets;
38pub mod sorted_sets;
39pub mod streams;
40pub mod strings;
41
42/// 所有支持的Redis命令
43///
44/// 不在此枚举中的Redis命令均不支持
45#[derive(Debug)]
46pub enum Command<'a> {
47    APPEND(&'a APPEND<'a>),
48    BITFIELD(&'a BITFIELD<'a>),
49    BITOP(&'a BITOP<'a>),
50    BRPOPLPUSH(&'a BRPOPLPUSH<'a>),
51    DECR(&'a DECR<'a>),
52    DECRBY(&'a DECRBY<'a>),
53    DEL(&'a DEL<'a>),
54    EVAL(&'a EVAL<'a>),
55    EVALSHA(&'a EVALSHA<'a>),
56    EXPIRE(&'a EXPIRE<'a>),
57    EXPIREAT(&'a EXPIREAT<'a>),
58    EXEC,
59    FLUSHALL(&'a FLUSHALL),
60    FLUSHDB(&'a FLUSHDB),
61    GETSET(&'a GETSET<'a>),
62    HDEL(&'a HDEL<'a>),
63    HINCRBY(&'a HINCRBY<'a>),
64    HMSET(&'a HMSET<'a>),
65    HSET(&'a HSET<'a>),
66    HSETNX(&'a HSETNX<'a>),
67    INCR(&'a INCR<'a>),
68    INCRBY(&'a INCRBY<'a>),
69    LINSERT(&'a LINSERT<'a>),
70    LPOP(&'a LPOP<'a>),
71    LPUSH(&'a LPUSH<'a>),
72    LPUSHX(&'a LPUSHX<'a>),
73    LREM(&'a LREM<'a>),
74    LSET(&'a LSET<'a>),
75    LTRIM(&'a LTRIM<'a>),
76    MOVE(&'a MOVE<'a>),
77    MSET(&'a MSET<'a>),
78    MSETNX(&'a MSETNX<'a>),
79    MULTI,
80    PERSIST(&'a PERSIST<'a>),
81    PEXPIRE(&'a PEXPIRE<'a>),
82    PEXPIREAT(&'a PEXPIREAT<'a>),
83    PFADD(&'a PFADD<'a>),
84    PFCOUNT(&'a PFCOUNT<'a>),
85    PFMERGE(&'a PFMERGE<'a>),
86    PSETEX(&'a PSETEX<'a>),
87    PUBLISH(&'a PUBLISH<'a>),
88    RENAME(&'a RENAME<'a>),
89    RENAMENX(&'a RENAMENX<'a>),
90    RESTORE(&'a RESTORE<'a>),
91    RPOP(&'a RPOP<'a>),
92    RPOPLPUSH(&'a RPOPLPUSH<'a>),
93    RPUSH(&'a RPUSH<'a>),
94    RPUSHX(&'a RPUSHX<'a>),
95    SADD(&'a SADD<'a>),
96    SCRIPTFLUSH,
97    SCRIPTLOAD(&'a SCRIPTLOAD<'a>),
98    SDIFFSTORE(&'a SDIFFSTORE<'a>),
99    SET(&'a SET<'a>),
100    SETBIT(&'a SETBIT<'a>),
101    SETEX(&'a SETEX<'a>),
102    SETNX(&'a SETNX<'a>),
103    SELECT(&'a SELECT),
104    SETRANGE(&'a SETRANGE<'a>),
105    SINTERSTORE(&'a SINTERSTORE<'a>),
106    SMOVE(&'a SMOVE<'a>),
107    SORT(&'a SORT<'a>),
108    SREM(&'a SREM<'a>),
109    SUNIONSTORE(&'a SUNIONSTORE<'a>),
110    SWAPDB(&'a SWAPDB<'a>),
111    UNLINK(&'a UNLINK<'a>),
112    ZADD(&'a ZADD<'a>),
113    ZINCRBY(&'a ZINCRBY<'a>),
114    ZINTERSTORE(&'a ZINTERSTORE<'a>),
115    ZPOPMAX(&'a ZPOPMAX<'a>),
116    ZPOPMIN(&'a ZPOPMIN<'a>),
117    ZREM(&'a ZREM<'a>),
118    ZREMRANGEBYLEX(&'a ZREMRANGEBYLEX<'a>),
119    ZREMRANGEBYRANK(&'a ZREMRANGEBYRANK<'a>),
120    ZREMRANGEBYSCORE(&'a ZREMRANGEBYSCORE<'a>),
121    ZUNIONSTORE(&'a ZUNIONSTORE<'a>),
122    XACK(&'a XACK<'a>),
123    XADD(&'a XADD<'a>),
124    XCLAIM(&'a XCLAIM<'a>),
125    XDEL(&'a XDEL<'a>),
126    XGROUP(&'a XGROUP<'a>),
127    XTRIM(&'a XTRIM<'a>),
128    Other(RawCommand),
129}
130
131#[derive(Debug)]
132pub struct RawCommand {
133    pub name: String,
134    pub args: Vec<Vec<u8>>,
135}
136
137pub(crate) fn parse(data: Vec<Vec<u8>>, cmd_handler: &mut dyn EventHandler) {
138    let mut iter = data.iter();
139    if let Some(cmd_name) = iter.next() {
140        let cmd_name = String::from_utf8_lossy(cmd_name).to_uppercase();
141        match cmd_name.as_str() {
142            "APPEND" => {
143                let cmd = strings::parse_append(iter);
144                cmd_handler.handle(Event::AOF(Command::APPEND(&cmd)));
145            }
146            "BITFIELD" => {
147                let cmd = strings::parse_bitfield(iter);
148                cmd_handler.handle(Event::AOF(Command::BITFIELD(&cmd)));
149            }
150            "BITOP" => {
151                let cmd = strings::parse_bitop(iter);
152                cmd_handler.handle(Event::AOF(Command::BITOP(&cmd)));
153            }
154            "BRPOPLPUSH" => {
155                let cmd = lists::parse_brpoplpush(iter);
156                cmd_handler.handle(Event::AOF(Command::BRPOPLPUSH(&cmd)));
157            }
158            "DEL" => {
159                let cmd = keys::parse_del(iter);
160                cmd_handler.handle(Event::AOF(Command::DEL(&cmd)));
161            }
162            "DECR" => {
163                let cmd = strings::parse_decr(iter);
164                cmd_handler.handle(Event::AOF(Command::DECR(&cmd)));
165            }
166            "DECRBY" => {
167                let cmd = strings::parse_decrby(iter);
168                cmd_handler.handle(Event::AOF(Command::DECRBY(&cmd)));
169            }
170            "EVAL" => {
171                let cmd = scripting::parse_eval(iter);
172                cmd_handler.handle(Event::AOF(Command::EVAL(&cmd)));
173            }
174            "EVALSHA" => {
175                let cmd = scripting::parse_evalsha(iter);
176                cmd_handler.handle(Event::AOF(Command::EVALSHA(&cmd)));
177            }
178            "EXPIRE" => {
179                let cmd = keys::parse_expire(iter);
180                cmd_handler.handle(Event::AOF(Command::EXPIRE(&cmd)));
181            }
182            "EXPIREAT" => {
183                let cmd = keys::parse_expireat(iter);
184                cmd_handler.handle(Event::AOF(Command::EXPIREAT(&cmd)));
185            }
186            "EXEC" => {
187                cmd_handler.handle(Event::AOF(Command::EXEC));
188            }
189            "FLUSHALL" => {
190                let cmd = server::parse_flushall(iter);
191                cmd_handler.handle(Event::AOF(Command::FLUSHALL(&cmd)));
192            }
193            "FLUSHDB" => {
194                let cmd = server::parse_flushdb(iter);
195                cmd_handler.handle(Event::AOF(Command::FLUSHDB(&cmd)));
196            }
197            "GETSET" => {
198                let cmd = strings::parse_getset(iter);
199                cmd_handler.handle(Event::AOF(Command::GETSET(&cmd)));
200            }
201            "HDEL" => {
202                let cmd = hashes::parse_hdel(iter);
203                cmd_handler.handle(Event::AOF(Command::HDEL(&cmd)));
204            }
205            "HINCRBY" => {
206                let cmd = hashes::parse_hincrby(iter);
207                cmd_handler.handle(Event::AOF(Command::HINCRBY(&cmd)));
208            }
209            "HMSET" => {
210                let cmd = hashes::parse_hmset(iter);
211                cmd_handler.handle(Event::AOF(Command::HMSET(&cmd)));
212            }
213            "HSET" => {
214                let cmd = hashes::parse_hset(iter);
215                cmd_handler.handle(Event::AOF(Command::HSET(&cmd)));
216            }
217            "HSETNX" => {
218                let cmd = hashes::parse_hsetnx(iter);
219                cmd_handler.handle(Event::AOF(Command::HSETNX(&cmd)));
220            }
221            "INCR" => {
222                let cmd = strings::parse_incr(iter);
223                cmd_handler.handle(Event::AOF(Command::INCR(&cmd)));
224            }
225            "INCRBY" => {
226                let cmd = strings::parse_incrby(iter);
227                cmd_handler.handle(Event::AOF(Command::INCRBY(&cmd)));
228            }
229            "LINSERT" => {
230                let cmd = lists::parse_linsert(iter);
231                cmd_handler.handle(Event::AOF(Command::LINSERT(&cmd)));
232            }
233            "LPOP" => {
234                let cmd = lists::parse_lpop(iter);
235                cmd_handler.handle(Event::AOF(Command::LPOP(&cmd)));
236            }
237            "LPUSH" => {
238                let cmd = lists::parse_lpush(iter);
239                cmd_handler.handle(Event::AOF(Command::LPUSH(&cmd)));
240            }
241            "LPUSHX" => {
242                let cmd = lists::parse_lpushx(iter);
243                cmd_handler.handle(Event::AOF(Command::LPUSHX(&cmd)));
244            }
245            "LREM" => {
246                let cmd = lists::parse_lrem(iter);
247                cmd_handler.handle(Event::AOF(Command::LREM(&cmd)));
248            }
249            "LSET" => {
250                let cmd = lists::parse_lset(iter);
251                cmd_handler.handle(Event::AOF(Command::LSET(&cmd)));
252            }
253            "LTRIM" => {
254                let cmd = lists::parse_ltrim(iter);
255                cmd_handler.handle(Event::AOF(Command::LTRIM(&cmd)));
256            }
257            "RENAME" => {
258                let cmd = keys::parse_rename(iter);
259                cmd_handler.handle(Event::AOF(Command::RENAME(&cmd)));
260            }
261            "RENAMENX" => {
262                let cmd = keys::parse_renamenx(iter);
263                cmd_handler.handle(Event::AOF(Command::RENAMENX(&cmd)));
264            }
265            "RESTORE" => {
266                let cmd = keys::parse_restore(iter);
267                cmd_handler.handle(Event::AOF(Command::RESTORE(&cmd)));
268            }
269            "RPOP" => {
270                let cmd = lists::parse_rpop(iter);
271                cmd_handler.handle(Event::AOF(Command::RPOP(&cmd)));
272            }
273            "RPOPLPUSH" => {
274                let cmd = lists::parse_rpoplpush(iter);
275                cmd_handler.handle(Event::AOF(Command::RPOPLPUSH(&cmd)));
276            }
277            "RPUSH" => {
278                let cmd = lists::parse_rpush(iter);
279                cmd_handler.handle(Event::AOF(Command::RPUSH(&cmd)));
280            }
281            "RPUSHX" => {
282                let cmd = lists::parse_rpushx(iter);
283                cmd_handler.handle(Event::AOF(Command::RPUSHX(&cmd)));
284            }
285            "SADD" => {
286                let cmd = sets::parse_sadd(iter);
287                cmd_handler.handle(Event::AOF(Command::SADD(&cmd)));
288            }
289            "SCRIPT" => {
290                let cmd = iter.next().unwrap();
291                let cmd = String::from_utf8_lossy(cmd).to_uppercase();
292                if &cmd == "LOAD" {
293                    let cmd = scripting::parse_script_load(iter);
294                    cmd_handler.handle(Event::AOF(Command::SCRIPTLOAD(&cmd)));
295                } else if &cmd == "FLUSH" {
296                    cmd_handler.handle(Event::AOF(Command::SCRIPTFLUSH));
297                }
298            }
299            "SDIFFSTORE" => {
300                let cmd = sets::parse_sdiffstore(iter);
301                cmd_handler.handle(Event::AOF(Command::SDIFFSTORE(&cmd)));
302            }
303            "SMOVE" => {
304                let cmd = sets::parse_smove(iter);
305                cmd_handler.handle(Event::AOF(Command::SMOVE(&cmd)));
306            }
307            "SET" => {
308                let cmd = strings::parse_set(iter);
309                cmd_handler.handle(Event::AOF(Command::SET(&cmd)));
310            }
311            "SELECT" => {
312                let cmd = connection::parse_select(iter);
313                cmd_handler.handle(Event::AOF(Command::SELECT(&cmd)));
314            }
315            "SORT" => {
316                let cmd = keys::parse_sort(iter);
317                cmd_handler.handle(Event::AOF(Command::SORT(&cmd)));
318            }
319            "SREM" => {
320                let cmd = sets::parse_srem(iter);
321                cmd_handler.handle(Event::AOF(Command::SREM(&cmd)));
322            }
323            "SUNIONSTORE" => {
324                let cmd = sets::parse_sunionstore(iter);
325                cmd_handler.handle(Event::AOF(Command::SUNIONSTORE(&cmd)));
326            }
327            "SWAPDB" => {
328                let cmd = connection::parse_swapdb(iter);
329                cmd_handler.handle(Event::AOF(Command::SWAPDB(&cmd)));
330            }
331            "UNLINK" => {
332                let cmd = keys::parse_unlink(iter);
333                cmd_handler.handle(Event::AOF(Command::UNLINK(&cmd)));
334            }
335            "MOVE" => {
336                let cmd = keys::parse_move(iter);
337                cmd_handler.handle(Event::AOF(Command::MOVE(&cmd)));
338            }
339            "MSET" => {
340                let cmd = strings::parse_mset(iter);
341                cmd_handler.handle(Event::AOF(Command::MSET(&cmd)));
342            }
343            "MSETNX" => {
344                let cmd = strings::parse_msetnx(iter);
345                cmd_handler.handle(Event::AOF(Command::MSETNX(&cmd)));
346            }
347            "MULTI" => {
348                cmd_handler.handle(Event::AOF(Command::MULTI));
349            }
350            "PFADD" => {
351                let cmd = hyperloglog::parse_pfadd(iter);
352                cmd_handler.handle(Event::AOF(Command::PFADD(&cmd)));
353            }
354            "PFCOUNT" => {
355                let cmd = hyperloglog::parse_pfcount(iter);
356                cmd_handler.handle(Event::AOF(Command::PFCOUNT(&cmd)));
357            }
358            "PFMERGE" => {
359                let cmd = hyperloglog::parse_pfmerge(iter);
360                cmd_handler.handle(Event::AOF(Command::PFMERGE(&cmd)));
361            }
362            "SETEX" => {
363                let cmd = strings::parse_setex(iter);
364                cmd_handler.handle(Event::AOF(Command::SETEX(&cmd)));
365            }
366            "SETNX" => {
367                let cmd = strings::parse_setnx(iter);
368                cmd_handler.handle(Event::AOF(Command::SETNX(&cmd)));
369            }
370            "PSETEX" => {
371                let cmd = strings::parse_psetex(iter);
372                cmd_handler.handle(Event::AOF(Command::PSETEX(&cmd)));
373            }
374            "PUBLISH" => {
375                let cmd = pub_sub::parse_publish(iter);
376                cmd_handler.handle(Event::AOF(Command::PUBLISH(&cmd)));
377            }
378            "PEXPIRE" => {
379                let cmd = keys::parse_pexpire(iter);
380                cmd_handler.handle(Event::AOF(Command::PEXPIRE(&cmd)));
381            }
382            "PEXPIREAT" => {
383                let cmd = keys::parse_pexpireat(iter);
384                cmd_handler.handle(Event::AOF(Command::PEXPIREAT(&cmd)));
385            }
386            "PERSIST" => {
387                let cmd = keys::parse_persist(iter);
388                cmd_handler.handle(Event::AOF(Command::PERSIST(&cmd)));
389            }
390            "SETRANGE" => {
391                let cmd = strings::parse_setrange(iter);
392                cmd_handler.handle(Event::AOF(Command::SETRANGE(&cmd)));
393            }
394            "SETBIT" => {
395                let cmd = strings::parse_setbit(iter);
396                cmd_handler.handle(Event::AOF(Command::SETBIT(&cmd)));
397            }
398            "SINTERSTORE" => {
399                let cmd = sets::parse_sinterstore(iter);
400                cmd_handler.handle(Event::AOF(Command::SINTERSTORE(&cmd)));
401            }
402            "ZADD" => {
403                let cmd = sorted_sets::parse_zadd(iter);
404                cmd_handler.handle(Event::AOF(Command::ZADD(&cmd)));
405            }
406            "ZINCRBY" => {
407                let cmd = sorted_sets::parse_zincrby(iter);
408                cmd_handler.handle(Event::AOF(Command::ZINCRBY(&cmd)));
409            }
410            "ZINTERSTORE" => {
411                let cmd = sorted_sets::parse_zinterstore(iter);
412                cmd_handler.handle(Event::AOF(Command::ZINTERSTORE(&cmd)));
413            }
414            "ZPOPMAX" => {
415                let cmd = sorted_sets::parse_zpopmax(iter);
416                cmd_handler.handle(Event::AOF(Command::ZPOPMAX(&cmd)));
417            }
418            "ZPOPMIN" => {
419                let cmd = sorted_sets::parse_zpopmin(iter);
420                cmd_handler.handle(Event::AOF(Command::ZPOPMIN(&cmd)));
421            }
422            "ZREM" => {
423                let cmd = sorted_sets::parse_zrem(iter);
424                cmd_handler.handle(Event::AOF(Command::ZREM(&cmd)));
425            }
426            "ZREMRANGEBYLEX" => {
427                let cmd = sorted_sets::parse_zremrangebylex(iter);
428                cmd_handler.handle(Event::AOF(Command::ZREMRANGEBYLEX(&cmd)));
429            }
430            "ZREMRANGEBYRANK" => {
431                let cmd = sorted_sets::parse_zremrangebyrank(iter);
432                cmd_handler.handle(Event::AOF(Command::ZREMRANGEBYRANK(&cmd)));
433            }
434            "ZREMRANGEBYSCORE" => {
435                let cmd = sorted_sets::parse_zremrangebyscore(iter);
436                cmd_handler.handle(Event::AOF(Command::ZREMRANGEBYSCORE(&cmd)));
437            }
438            "ZUNIONSTORE" => {
439                let cmd = sorted_sets::parse_zunionstore(iter);
440                cmd_handler.handle(Event::AOF(Command::ZUNIONSTORE(&cmd)));
441            }
442            "XACK" => {
443                let cmd = streams::parse_xack(iter);
444                cmd_handler.handle(Event::AOF(Command::XACK(&cmd)));
445            }
446            "XADD" => {
447                let cmd = streams::parse_xadd(iter);
448                cmd_handler.handle(Event::AOF(Command::XADD(&cmd)));
449            }
450            "XCLAIM" => {
451                let cmd = streams::parse_xclaim(iter);
452                cmd_handler.handle(Event::AOF(Command::XCLAIM(&cmd)));
453            }
454            "XDEL" => {
455                let cmd = streams::parse_xdel(iter);
456                cmd_handler.handle(Event::AOF(Command::XDEL(&cmd)));
457            }
458            "XGROUP" => {
459                let cmd = streams::parse_xgroup(iter);
460                cmd_handler.handle(Event::AOF(Command::XGROUP(&cmd)));
461            }
462            "XTRIM" => {
463                let cmd = streams::parse_xtrim(iter);
464                cmd_handler.handle(Event::AOF(Command::XTRIM(&cmd)));
465            }
466            "PING" => {
467                // PING命令是由Redis master主动发送过来,判断下游节点是否活跃,不需要处理
468            }
469            _ => {
470                let mut args = Vec::new();
471                while let Some(arg) = iter.next() {
472                    args.push(arg.clone());
473                }
474                let cmd = RawCommand { name: cmd_name, args };
475                cmd_handler.handle(Event::AOF(Command::Other(cmd)))
476            }
477        };
478    }
479}