1use super::Args;
17use super::keyspec::*;
21use yo_common::parse_i64;
22
23#[derive(Debug, Clone, Copy)]
25pub struct Spec {
26 pub name: &'static str,
29 pub arity: i32,
32 pub flags: &'static [&'static str],
34 pub first_key: i32,
36 pub last_key: i32,
38 pub step: i32,
40 pub acl: &'static [&'static str],
46 pub since: &'static str,
48 pub complexity: &'static str,
50 pub summary: &'static str,
52 pub group: &'static str,
54 pub keys: &'static [KeySpec],
61}
62
63const AC_TX_FAST: &[&str] = &["@fast", "@transaction"];
66const AC_PUBSUB_SLOW: &[&str] = &["@pubsub", "@slow"];
69const AC_PUBSUB_FAST: &[&str] = &["@pubsub", "@fast"];
71const READ_FAST: &[&str] = &["readonly", "fast"];
73const WRITE_FAST_OOM: &[&str] = &["write", "denyoom", "fast"];
75const WRITE_OOM: &[&str] = &["write", "denyoom"];
77const WRITE_OOM_ADMIN: &[&str] = &["write", "denyoom", "admin"];
79const AC_READ_FAST: &[&str] = &["@read", "@string", "@fast"];
81const AC_BIT_READ_FAST: &[&str] = &["@read", "@bitmap", "@fast"];
83const AC_BIT_READ: &[&str] = &["@read", "@bitmap", "@slow"];
85const AC_BIT_WRITE: &[&str] = &["@write", "@bitmap", "@slow"];
87
88const AC_HLL_WRITE_FAST: &[&str] = &["@write", "@hyperloglog", "@fast"];
90const AC_HLL_WRITE: &[&str] = &["@write", "@hyperloglog", "@slow"];
92const AC_HLL_READ: &[&str] = &["@read", "@hyperloglog", "@slow"];
94const AC_HLL_ADMIN: &[&str] = &["@hyperloglog", "@admin", "@slow", "@dangerous"];
96const AC_READ_SLOW: &[&str] = &["@read", "@string", "@slow"];
98const AC_WRITE_FAST: &[&str] = &["@write", "@string", "@fast"];
100const AC_WRITE_SLOW: &[&str] = &["@write", "@string", "@slow"];
102const WRITE_FAST: &[&str] = &["write", "fast"];
104const AC_SET_READ_FAST: &[&str] = &["@read", "@set", "@fast"];
106const AC_SET_READ_SLOW: &[&str] = &["@read", "@set", "@slow"];
108const AC_SET_WRITE_FAST: &[&str] = &["@write", "@set", "@fast"];
110const AC_SET_WRITE_SLOW: &[&str] = &["@write", "@set", "@slow"];
113const AC_HASH_READ_FAST: &[&str] = &["@read", "@hash", "@fast"];
115const AC_HASH_READ_SLOW: &[&str] = &["@read", "@hash", "@slow"];
117const AC_HASH_WRITE_FAST: &[&str] = &["@write", "@hash", "@fast"];
119const AC_HASH_SLOW: &[&str] = &["@hash", "@slow"];
123const READ_SLOW: &[&str] = &["readonly"];
125const WRITE_SLOW: &[&str] = &["write"];
128const AC_LIST_READ_FAST: &[&str] = &["@read", "@list", "@fast"];
130const AC_LIST_READ_SLOW: &[&str] = &["@read", "@list", "@slow"];
132const AC_LIST_WRITE_FAST: &[&str] = &["@write", "@list", "@fast"];
135const AC_LIST_WRITE_SLOW: &[&str] = &["@write", "@list", "@slow"];
137const AC_LIST_WRITE_BLOCKING: &[&str] = &["@write", "@list", "@slow", "@blocking"];
140const AC_ZSET_READ_FAST: &[&str] = &["@read", "@sortedset", "@fast"];
142const AC_ZSET_READ_SLOW: &[&str] = &["@read", "@sortedset", "@slow"];
144const AC_ZSET_WRITE_FAST: &[&str] = &["@write", "@sortedset", "@fast"];
146const AC_ZSET_WRITE_SLOW: &[&str] = &["@write", "@sortedset", "@slow"];
149const AC_ZSET_BLOCKING_FAST: &[&str] = &["@write", "@sortedset", "@fast", "@blocking"];
152const AC_ZSET_BLOCKING_SLOW: &[&str] = &["@write", "@sortedset", "@slow", "@blocking"];
154const AC_GEO_READ: &[&str] = &["@read", "@geo", "@slow"];
159const AC_GEO_WRITE: &[&str] = &["@write", "@geo", "@slow"];
161const AC_NONE: &[&str] = &[];
172const VECTOR_READ: &[&str] = &["readonly", "module"];
175const VECTOR_READ_FAST: &[&str] = &["readonly", "module", "fast"];
178const VECTOR_WRITE_OOM: &[&str] = &["write", "denyoom", "module"];
180const VECTOR_WRITE: &[&str] = &["write", "module"];
182const VECTOR_WRITE_FAST: &[&str] = &["write", "module", "fast"];
185const AC_SEARCH: &[&str] = &["@search"];
190const AC_SEARCH_DROP: &[&str] = &["@write", "@slow", "@dangerous", "@search"];
194const AC_SEARCH_WRITE: &[&str] = &["@write", "@search"];
198const AC_SEARCH_LIST: &[&str] = &["@admin", "@slow", "@search"];
201const AC_SEARCH_ADMIN: &[&str] = &["@admin", "@search"];
205const AC_SEARCH_DEBUG: &[&str] = &["@admin", "@slow", "@dangerous", "@search"];
209const AC_SEARCH_TAGS: &[&str] = &["@read", "@slow", "@dangerous", "@search"];
214const AC_SEARCH_READ: &[&str] = &["@read", "@search"];
218const SEARCH_READ: &[&str] = &["readonly", "module"];
221const SEARCH_WRITE_OOM: &[&str] = &["write", "denyoom", "module"];
223const SEARCH_WRITE: &[&str] = &["write", "module"];
225const AC_JSON_READ: &[&str] = &["@read", "@json"];
229const AC_JSON_WRITE: &[&str] = &["@write", "@json"];
231const JSON_READ: &[&str] = &["readonly", "module"];
235const JSON_WRITE: &[&str] = &["write", "module"];
237const JSON_WRITE_OOM: &[&str] = &["write", "denyoom", "module"];
239const JSON_READ_MOVABLE: &[&str] = &["readonly", "module", "movablekeys"];
242const AC_BLOOM_READ: &[&str] = &["@read", "@bloom"];
246const AC_BLOOM_READ_FAST: &[&str] = &["@read", "@fast", "@bloom"];
249const AC_BLOOM_WRITE: &[&str] = &["@write", "@bloom"];
251const AC_BLOOM_WRITE_FAST: &[&str] = &["@write", "@fast", "@bloom"];
253const BLOOM_READ: &[&str] = &["readonly", "module", "fast"];
256const BLOOM_WRITE: &[&str] = &["write", "denyoom", "module"];
259const AC_CUCKOO_READ: &[&str] = &["@read", "@cuckoo"];
263const AC_CUCKOO_READ_FAST: &[&str] = &["@read", "@fast", "@cuckoo"];
265const AC_CUCKOO_WRITE: &[&str] = &["@write", "@cuckoo"];
267const AC_CUCKOO_WRITE_FAST: &[&str] = &["@write", "@fast", "@cuckoo"];
269const CUCKOO_READ: &[&str] = &["readonly", "module", "fast"];
271const CUCKOO_WRITE: &[&str] = &["write", "denyoom", "module"];
273const CUCKOO_DELETE: &[&str] = &["write", "module", "fast"];
276const AC_CMS_READ: &[&str] = &["@read", "@cms"];
280const AC_CMS_READ_FAST: &[&str] = &["@read", "@fast", "@cms"];
282const AC_CMS_WRITE: &[&str] = &["@write", "@cms"];
284const AC_CMS_WRITE_FAST: &[&str] = &["@write", "@fast", "@cms"];
286const CMS_READ: &[&str] = &["readonly", "module"];
288const CMS_WRITE: &[&str] = &["write", "denyoom", "module"];
292const AC_TOPK_READ: &[&str] = &["@read", "@topk"];
295const AC_TOPK_READ_FAST: &[&str] = &["@read", "@fast", "@topk"];
297const AC_TOPK_WRITE: &[&str] = &["@write", "@topk"];
299const AC_TOPK_WRITE_FAST: &[&str] = &["@write", "@fast", "@topk"];
301const TOPK_READ: &[&str] = &["readonly", "module"];
303const TOPK_WRITE: &[&str] = &["write", "denyoom", "module"];
307const AC_TDIGEST_READ_FAST: &[&str] = &["@read", "@fast", "@tdigest"];
311const AC_TDIGEST_READ: &[&str] = &["@read", "@tdigest"];
313const AC_TDIGEST_WRITE_FAST: &[&str] = &["@write", "@fast", "@tdigest"];
315const AC_TDIGEST_WRITE: &[&str] = &["@write", "@tdigest"];
317const TDIGEST_READ: &[&str] = &["readonly", "module"];
319const TDIGEST_WRITE: &[&str] = &["write", "denyoom", "module"];
322const TDIGEST_MERGE: &[&str] = &["write", "denyoom", "module", "movablekeys"];
325const AC_TS_READ_FAST: &[&str] = &["@read", "@fast", "@timeseries"];
328const AC_TS_WRITE: &[&str] = &["@write", "@timeseries"];
331const AC_TS_READ: &[&str] = &["@read", "@timeseries"];
334const AC_TS_WRITE_FAST: &[&str] = &["@write", "@fast", "@timeseries"];
337const TS_READ: &[&str] = &["readonly", "module"];
341const TS_READ_MOVABLE: &[&str] = &["readonly", "module", "movablekeys"];
344const TS_WRITE: &[&str] = &["write", "denyoom", "module"];
346const TS_DELETE: &[&str] = &["write", "module"];
349const TS_RULE: &[&str] = &["write", "module", "fast"];
353const AC_GRAPH_READ_FAST: &[&str] = &["@read", "@graph", "@fast"];
355const AC_GRAPH_READ_SLOW: &[&str] = &["@read", "@graph", "@slow"];
357const AC_GRAPH_WRITE_FAST: &[&str] = &["@write", "@graph", "@fast"];
359const AC_ARRAY_READ_FAST: &[&str] = &["@read", "@array", "@fast"];
360const AC_ARRAY_READ_SLOW: &[&str] = &["@read", "@array", "@slow"];
363const AC_ARRAY_WRITE_FAST: &[&str] = &["@write", "@array", "@fast"];
365const AC_ARRAY_WRITE_SLOW: &[&str] = &["@write", "@array", "@slow"];
368const AC_STREAM_READ_FAST: &[&str] = &["@read", "@stream", "@fast"];
370const AC_STREAM_READ_SLOW: &[&str] = &["@read", "@stream", "@slow"];
372const AC_STREAM_WRITE_FAST: &[&str] = &["@write", "@stream", "@fast"];
375const AC_STREAM_WRITE_SLOW: &[&str] = &["@write", "@stream", "@slow"];
377const AC_STREAM_BLOCKING_READ: &[&str] = &["@read", "@stream", "@slow", "@blocking"];
379const AC_STREAM_BLOCKING_WRITE: &[&str] = &["@write", "@stream", "@slow", "@blocking"];
382const AC_STREAM_CONTAINER: &[&str] = &["@slow"];
385const READ_BLOCKING_MOVABLE: &[&str] = &["readonly", "blocking", "movablekeys"];
388const WRITE_BLOCKING_MOVABLE: &[&str] = &["write", "blocking", "movablekeys"];
390const READ_MOVABLE: &[&str] = &["readonly", "movablekeys"];
393const WRITE_MOVABLE: &[&str] = &["write", "denyoom", "movablekeys"];
395const MIGRATE_FLAGS: &[&str] = &["write", "movablekeys"];
401const AC_CONN: &[&str] = &["@fast", "@connection"];
403const AC_KEY_READ: &[&str] = &["@keyspace", "@read", "@fast"];
405const AC_KEY_READ_SLOW: &[&str] = &["@keyspace", "@read", "@slow"];
407const AC_KEY_READ_ALL: &[&str] = &["@keyspace", "@read", "@slow", "@dangerous"];
410const AC_KEY_WRITE_SLOW: &[&str] = &["@keyspace", "@write", "@slow"];
415const AC_KEY_WRITE_FAST: &[&str] = &["@keyspace", "@write", "@fast"];
418const AC_KEY_FLUSH: &[&str] = &["@keyspace", "@write", "@slow", "@dangerous"];
420const AC_SWAPDB: &[&str] = &["@keyspace", "@write", "@fast", "@dangerous"];
424const AC_RESTORE: &[&str] = &["@keyspace", "@write", "@slow", "@dangerous"];
429const AC_WAIT: &[&str] = &["@slow", "@blocking", "@connection"];
434const AC_SORT_WRITE: &[&str] = &[
438 "@write",
439 "@set",
440 "@sortedset",
441 "@list",
442 "@slow",
443 "@dangerous",
444];
445const AC_SORT_READ: &[&str] = &[
447 "@read",
448 "@set",
449 "@sortedset",
450 "@list",
451 "@slow",
452 "@dangerous",
453];
454
455pub static SUBCATS: &[(&str, &str, &[&str])] = &[
473 ("acl", "deluser", AC_SUB_ADMIN),
474 ("acl", "dryrun", AC_SUB_ADMIN),
475 ("acl", "getuser", AC_SUB_ADMIN),
476 ("acl", "list", AC_SUB_ADMIN),
477 ("acl", "load", AC_SUB_ADMIN),
478 ("acl", "log", AC_SUB_ADMIN),
479 ("acl", "save", AC_SUB_ADMIN),
480 ("acl", "setuser", AC_SUB_ADMIN),
481 ("acl", "users", AC_SUB_ADMIN),
482 ("client", "caching", AC_SUB_CONNECTION),
483 ("client", "getname", AC_SUB_CONNECTION),
484 ("client", "getredir", AC_SUB_CONNECTION),
485 ("client", "help", AC_SUB_CONNECTION),
486 ("client", "id", AC_SUB_CONNECTION),
487 ("client", "info", AC_SUB_CONNECTION),
488 ("client", "kill", AC_SUB_ADMIN_CONNECTION),
489 ("client", "list", AC_SUB_ADMIN_CONNECTION),
490 ("client", "no-evict", AC_SUB_ADMIN_CONNECTION),
491 ("client", "no-touch", AC_SUB_CONNECTION),
492 ("client", "pause", AC_SUB_ADMIN_CONNECTION),
493 ("client", "reply", AC_SUB_CONNECTION),
494 ("client", "setinfo", AC_SUB_CONNECTION),
495 ("client", "setname", AC_SUB_CONNECTION),
496 ("client", "tracking", AC_SUB_CONNECTION),
497 ("client", "trackinginfo", AC_SUB_CONNECTION),
498 ("client", "unblock", AC_SUB_ADMIN_CONNECTION),
499 ("client", "unpause", AC_SUB_ADMIN_CONNECTION),
500 ("config", "get", AC_SUB_ADMIN),
501 ("config", "resetstat", AC_SUB_ADMIN),
502 ("config", "rewrite", AC_SUB_ADMIN),
503 ("config", "set", AC_SUB_ADMIN),
504 ("function", "delete", AC_SUB_SCRIPTING_WRITE),
505 ("function", "dump", AC_SUB_SCRIPTING),
506 ("function", "flush", AC_SUB_SCRIPTING_WRITE),
507 ("function", "help", AC_SUB_SCRIPTING),
508 ("function", "kill", AC_SUB_SCRIPTING),
509 ("function", "list", AC_SUB_SCRIPTING),
510 ("function", "load", AC_SUB_SCRIPTING_WRITE),
511 ("function", "restore", AC_SUB_SCRIPTING_WRITE),
512 ("function", "stats", AC_SUB_SCRIPTING),
513 ("object", "encoding", AC_SUB_KEYSPACE_READ),
514 ("object", "freq", AC_SUB_KEYSPACE_READ),
515 ("object", "help", AC_SUB_KEYSPACE),
516 ("object", "idletime", AC_SUB_KEYSPACE_READ),
517 ("object", "refcount", AC_SUB_KEYSPACE_READ),
518 ("pubsub", "channels", AC_SUB_PUBSUB),
519 ("pubsub", "numpat", AC_SUB_PUBSUB),
520 ("pubsub", "numsub", AC_SUB_PUBSUB),
521 ("pubsub", "shardchannels", AC_SUB_PUBSUB),
522 ("pubsub", "shardnumsub", AC_SUB_PUBSUB),
523 ("script", "debug", AC_SUB_SCRIPTING),
524 ("script", "exists", AC_SUB_SCRIPTING),
525 ("script", "flush", AC_SUB_SCRIPTING),
526 ("script", "help", AC_SUB_SCRIPTING),
527 ("script", "kill", AC_SUB_SCRIPTING),
528 ("script", "load", AC_SUB_SCRIPTING),
529 ("xgroup", "create", AC_SUB_STREAM_WRITE),
530 ("xgroup", "createconsumer", AC_SUB_STREAM_WRITE),
531 ("xgroup", "delconsumer", AC_SUB_STREAM_WRITE),
532 ("xgroup", "destroy", AC_SUB_STREAM_WRITE),
533 ("xgroup", "help", AC_SUB_STREAM),
534 ("xgroup", "setid", AC_SUB_STREAM_WRITE),
535 ("xinfo", "consumers", AC_SUB_STREAM_READ),
536 ("xinfo", "groups", AC_SUB_STREAM_READ),
537 ("xinfo", "help", AC_SUB_STREAM),
538 ("xinfo", "stream", AC_SUB_STREAM_READ),
539];
540
541const AC_SUB_ADMIN: &[&str] = &["@admin", "@dangerous"];
543const AC_SUB_CONNECTION: &[&str] = &["@connection"];
545const AC_SUB_ADMIN_CONNECTION: &[&str] = &["@admin", "@connection", "@dangerous"];
547const AC_SUB_SCRIPTING: &[&str] = &["@scripting"];
549const AC_SUB_SCRIPTING_WRITE: &[&str] = &["@scripting", "@write"];
551const AC_SUB_KEYSPACE: &[&str] = &["@keyspace"];
553const AC_SUB_KEYSPACE_READ: &[&str] = &["@keyspace", "@read"];
555const AC_SUB_PUBSUB: &[&str] = &["@pubsub"];
557const AC_SUB_STREAM: &[&str] = &["@stream"];
559const AC_SUB_STREAM_WRITE: &[&str] = &["@stream", "@write"];
561const AC_SUB_STREAM_READ: &[&str] = &["@read", "@stream"];
563
564pub static COMMANDS: &[Spec] = &[
566 Spec {
568 name: "set",
569 arity: -3,
570 flags: WRITE_OOM,
571 first_key: 1,
572 last_key: 1,
573 step: 1,
574 keys: &[SET_KEY],
575 acl: AC_WRITE_SLOW,
576 since: "1.0.0",
577 complexity: "O(1)",
578 summary: "Set a key to a string value, whatever it held before.",
579 group: "string",
580 },
581 Spec {
582 name: "get",
583 arity: 2,
584 flags: READ_FAST,
585 first_key: 1,
586 last_key: 1,
587 step: 1,
588 keys: &[RO_ACCESS_AT1],
589 acl: AC_READ_FAST,
590 since: "1.0.0",
591 complexity: "O(1)",
592 summary: "The string value of a key.",
593 group: "string",
594 },
595 Spec {
596 name: "getset",
597 arity: 3,
598 flags: WRITE_FAST_OOM,
599 first_key: 1,
600 last_key: 1,
601 step: 1,
602 keys: &[RW_ACCESS_UPDATE_AT1],
603 acl: AC_WRITE_FAST,
604 since: "1.0.0",
605 complexity: "O(1)",
606 summary: "Set a key and hand back what it held.",
607 group: "string",
608 },
609 Spec {
610 name: "getdel",
611 arity: 2,
612 flags: &["write", "fast"],
613 first_key: 1,
614 last_key: 1,
615 step: 1,
616 keys: &[RW_ACCESS_DELETE_AT1],
617 acl: AC_WRITE_FAST,
618 since: "6.2.0",
619 complexity: "O(1)",
620 summary: "Read a key and delete it in the same step.",
621 group: "string",
622 },
623 Spec {
624 name: "getex",
625 arity: -2,
626 flags: &["write", "fast"],
627 first_key: 1,
628 last_key: 1,
629 step: 1,
630 keys: &[RW_ACCESS_UPDATE_AT1_TTL],
631 acl: AC_WRITE_FAST,
632 since: "6.2.0",
633 complexity: "O(1)",
634 summary: "Read a key and change its deadline in the same step.",
635 group: "string",
636 },
637 Spec {
638 name: "setnx",
639 arity: 3,
640 flags: WRITE_FAST_OOM,
641 first_key: 1,
642 last_key: 1,
643 step: 1,
644 keys: &[OW_INSERT_AT1],
645 acl: AC_WRITE_FAST,
646 since: "1.0.0",
647 complexity: "O(1)",
648 summary: "Set a key only if it is not there.",
649 group: "string",
650 },
651 Spec {
652 name: "setex",
653 arity: 4,
654 flags: WRITE_OOM,
655 first_key: 1,
656 last_key: 1,
657 step: 1,
658 keys: &[OW_UPDATE_AT1],
659 acl: AC_WRITE_SLOW,
660 since: "2.0.0",
661 complexity: "O(1)",
662 summary: "Set a key and give it a deadline in seconds.",
663 group: "string",
664 },
665 Spec {
666 name: "psetex",
667 arity: 4,
668 flags: WRITE_OOM,
669 first_key: 1,
670 last_key: 1,
671 step: 1,
672 keys: &[OW_UPDATE_AT1],
673 acl: AC_WRITE_SLOW,
674 since: "2.6.0",
675 complexity: "O(1)",
676 summary: "Set a key and give it a deadline in milliseconds.",
677 group: "string",
678 },
679 Spec {
680 name: "mset",
681 arity: -3,
682 flags: WRITE_OOM,
683 first_key: 1,
684 last_key: -1,
685 step: 2,
686 keys: &[OW_UPDATE_AT1_RM1_2_0],
687 acl: AC_WRITE_SLOW,
688 since: "1.0.1",
689 complexity: "O(N) with N the number of keys",
690 summary: "Set several keys, all of them or none.",
691 group: "string",
692 },
693 Spec {
694 name: "msetnx",
695 arity: -3,
696 flags: WRITE_OOM,
697 first_key: 1,
698 last_key: -1,
699 step: 2,
700 keys: &[OW_INSERT_AT1_RM1_2_0],
701 acl: AC_WRITE_SLOW,
702 since: "1.0.1",
703 complexity: "O(N) with N the number of keys",
704 summary: "Set several keys only if none of them are there.",
705 group: "string",
706 },
707 Spec {
708 name: "mget",
709 arity: -2,
710 flags: READ_FAST,
711 first_key: 1,
712 last_key: -1,
713 step: 1,
714 keys: &[RO_ACCESS_AT1_RM1_1_0],
715 acl: AC_READ_FAST,
716 since: "1.0.0",
717 complexity: "O(N) with N the number of keys",
718 summary: "The values of several keys, in the order asked for.",
719 group: "string",
720 },
721 Spec {
722 name: "append",
723 arity: 3,
724 flags: WRITE_FAST_OOM,
725 first_key: 1,
726 last_key: 1,
727 step: 1,
728 keys: &[RW_INSERT_AT1],
729 acl: AC_WRITE_FAST,
730 since: "2.0.0",
731 complexity: "O(M) with M the length of the value being appended",
732 summary: "Add to the end of a string, creating it if it is not there.",
733 group: "string",
734 },
735 Spec {
736 name: "strlen",
737 arity: 2,
738 flags: READ_FAST,
739 first_key: 1,
740 last_key: 1,
741 step: 1,
742 keys: &[RO_AT1],
743 acl: AC_READ_FAST,
744 since: "2.2.0",
745 complexity: "O(1)",
746 summary: "How long a string value is, without reading it.",
747 group: "string",
748 },
749 Spec {
750 name: "setrange",
751 arity: 4,
752 flags: WRITE_OOM,
753 first_key: 1,
754 last_key: 1,
755 step: 1,
756 keys: &[RW_UPDATE_AT1],
757 acl: AC_WRITE_SLOW,
758 since: "2.2.0",
759 complexity: "O(M) with M the length of the replacement",
760 summary: "Overwrite part of a string at an offset, zero filling the gap.",
761 group: "string",
762 },
763 Spec {
764 name: "getrange",
765 arity: 4,
766 flags: &["readonly"],
767 first_key: 1,
768 last_key: 1,
769 step: 1,
770 keys: &[RO_ACCESS_AT1],
771 acl: AC_READ_SLOW,
772 since: "2.4.0",
773 complexity: "O(N) with N the length of the answer",
774 summary: "Part of a string, by an inclusive range that may count backwards.",
775 group: "string",
776 },
777 Spec {
778 name: "substr",
779 arity: 4,
780 flags: &["readonly"],
781 first_key: 1,
782 last_key: 1,
783 step: 1,
784 keys: &[RO_ACCESS_AT1],
785 acl: AC_READ_SLOW,
786 since: "1.0.0",
787 complexity: "O(N) with N the length of the answer",
788 summary: "GETRANGE under the name it had before 2.4.",
789 group: "string",
790 },
791 Spec {
792 name: "incr",
793 arity: 2,
794 flags: WRITE_FAST_OOM,
795 first_key: 1,
796 last_key: 1,
797 step: 1,
798 keys: &[RW_ACCESS_UPDATE_AT1],
799 acl: AC_WRITE_FAST,
800 since: "1.0.0",
801 complexity: "O(1)",
802 summary: "Add one, starting from zero if the key is not there.",
803 group: "string",
804 },
805 Spec {
806 name: "decr",
807 arity: 2,
808 flags: WRITE_FAST_OOM,
809 first_key: 1,
810 last_key: 1,
811 step: 1,
812 keys: &[RW_ACCESS_UPDATE_AT1],
813 acl: AC_WRITE_FAST,
814 since: "1.0.0",
815 complexity: "O(1)",
816 summary: "Take one away, starting from zero if the key is not there.",
817 group: "string",
818 },
819 Spec {
820 name: "incrby",
821 arity: 3,
822 flags: WRITE_FAST_OOM,
823 first_key: 1,
824 last_key: 1,
825 step: 1,
826 keys: &[RW_ACCESS_UPDATE_AT1],
827 acl: AC_WRITE_FAST,
828 since: "1.0.0",
829 complexity: "O(1)",
830 summary: "Add a number, starting from zero if the key is not there.",
831 group: "string",
832 },
833 Spec {
834 name: "decrby",
835 arity: 3,
836 flags: WRITE_FAST_OOM,
837 first_key: 1,
838 last_key: 1,
839 step: 1,
840 keys: &[RW_ACCESS_UPDATE_AT1],
841 acl: AC_WRITE_FAST,
842 since: "1.0.0",
843 complexity: "O(1)",
844 summary: "Take a number away, starting from zero if the key is not there.",
845 group: "string",
846 },
847 Spec {
848 name: "incrbyfloat",
849 arity: 3,
850 flags: WRITE_FAST_OOM,
851 first_key: 1,
852 last_key: 1,
853 step: 1,
854 keys: &[RW_ACCESS_UPDATE_AT1],
855 acl: AC_WRITE_FAST,
856 since: "2.6.0",
857 complexity: "O(1)",
858 summary: "Add a float, starting from zero if the key is not there.",
859 group: "string",
860 },
861 Spec {
862 name: "lcs",
863 arity: -3,
864 flags: &["readonly"],
865 first_key: 1,
866 last_key: 2,
867 step: 1,
868 keys: &[RO_ACCESS_AT1_R1_1_0],
869 acl: AC_READ_SLOW,
870 since: "7.0.0",
871 complexity: "O(N*M) with N and M the lengths of the two values",
872 summary: "The longest subsequence two string values have in common.",
873 group: "string",
874 },
875 Spec {
876 name: "msetex",
877 arity: -4,
878 flags: &["write", "denyoom", "movablekeys"],
879 first_key: 0,
880 last_key: 0,
881 step: 0,
882 keys: &[OW_UPDATE_AT1_COUNTED],
883 acl: AC_WRITE_SLOW,
884 since: "8.4.0",
885 complexity: "O(N) with N the number of keys",
886 summary: "Set several keys with one deadline and one condition over all of them.",
887 group: "string",
888 },
889 Spec {
890 name: "delex",
891 arity: -2,
892 flags: &["write", "fast"],
893 first_key: 1,
894 last_key: 1,
895 step: 1,
896 keys: &[DELEX_KEY],
897 acl: AC_WRITE_FAST,
898 since: "8.4.0",
899 complexity: "O(1) by value, O(N) by digest",
900 summary: "Delete a key only if it still holds what the caller thinks.",
901 group: "string",
902 },
903 Spec {
904 name: "digest",
905 arity: 2,
906 flags: READ_FAST,
907 first_key: 1,
908 last_key: 1,
909 step: 1,
910 keys: &[RO_ACCESS_AT1],
911 acl: AC_READ_FAST,
912 since: "8.4.0",
913 complexity: "O(N) with N the length of the value",
914 summary: "The XXH3 of a string value, as sixteen hex characters.",
915 group: "string",
916 },
917 Spec {
918 name: "increx",
919 arity: -2,
920 flags: WRITE_FAST_OOM,
921 first_key: 1,
922 last_key: 1,
923 step: 1,
924 keys: &[RW_ACCESS_UPDATE_AT1],
925 acl: AC_WRITE_FAST,
926 since: "8.8.0",
927 complexity: "O(1)",
928 summary: "Count, with a bound, a saturation policy and a deadline.",
929 group: "string",
930 },
931 Spec {
933 name: "setbit",
934 arity: 4,
935 flags: WRITE_OOM,
936 first_key: 1,
937 last_key: 1,
938 step: 1,
939 keys: &[RW_ACCESS_UPDATE_AT1],
940 acl: AC_BIT_WRITE,
941 since: "2.2.0",
942 complexity: "O(1)",
943 summary: "Set one bit of a string, growing it to reach the offset.",
944 group: "bitmap",
945 },
946 Spec {
947 name: "getbit",
948 arity: 3,
949 flags: READ_FAST,
950 first_key: 1,
951 last_key: 1,
952 step: 1,
953 keys: &[RO_ACCESS_AT1],
954 acl: AC_BIT_READ_FAST,
955 since: "2.2.0",
956 complexity: "O(1)",
957 summary: "Read one bit of a string, or nought past its end.",
958 group: "bitmap",
959 },
960 Spec {
961 name: "bitcount",
962 arity: -2,
963 flags: &["readonly"],
964 first_key: 1,
965 last_key: 1,
966 step: 1,
967 keys: &[RO_ACCESS_AT1],
968 acl: AC_BIT_READ,
969 since: "2.6.0",
970 complexity: "O(N)",
971 summary: "Count the set bits of a string, or of a range of it.",
972 group: "bitmap",
973 },
974 Spec {
975 name: "bitpos",
976 arity: -3,
977 flags: &["readonly"],
978 first_key: 1,
979 last_key: 1,
980 step: 1,
981 keys: &[RO_ACCESS_AT1],
982 acl: AC_BIT_READ,
983 since: "2.8.7",
984 complexity: "O(N)",
985 summary: "Find the first bit set to one or nought in a string.",
986 group: "bitmap",
987 },
988 Spec {
989 name: "bitop",
990 arity: -4,
991 flags: WRITE_OOM,
992 first_key: 2,
993 last_key: -1,
994 step: 1,
995 keys: &[OW_UPDATE_AT2, RO_ACCESS_AT3_RM1_1_0],
996 acl: AC_BIT_WRITE,
997 since: "2.6.0",
998 complexity: "O(N) with N the length of the longest source",
999 summary: "Combine strings bit by bit and store the result.",
1000 group: "bitmap",
1001 },
1002 Spec {
1003 name: "bitfield",
1004 arity: -2,
1005 flags: WRITE_OOM,
1006 first_key: 1,
1007 last_key: 1,
1008 step: 1,
1009 keys: &[BITFIELD_KEY],
1010 acl: AC_BIT_WRITE,
1011 since: "3.2.0",
1012 complexity: "O(1) per subcommand",
1013 summary: "Read and write packed integer fields inside a string.",
1014 group: "bitmap",
1015 },
1016 Spec {
1017 name: "bitfield_ro",
1018 arity: -2,
1019 flags: READ_FAST,
1020 first_key: 1,
1021 last_key: 1,
1022 step: 1,
1023 keys: &[RO_ACCESS_AT1],
1024 acl: AC_BIT_READ_FAST,
1025 since: "6.0.0",
1026 complexity: "O(1) per subcommand",
1027 summary: "The read only half of BITFIELD, for a replica to answer.",
1028 group: "bitmap",
1029 },
1030 Spec {
1032 name: "pfadd",
1033 arity: -2,
1034 flags: WRITE_OOM,
1035 first_key: 1,
1036 last_key: 1,
1037 step: 1,
1038 keys: &[RW_INSERT_AT1],
1039 acl: AC_HLL_WRITE_FAST,
1040 since: "2.8.9",
1041 complexity: "O(1) an element",
1042 summary: "Add elements to a sketch, answering whether it changed.",
1043 group: "hyperloglog",
1044 },
1045 Spec {
1046 name: "pfcount",
1047 arity: -2,
1048 flags: &["readonly"],
1049 first_key: 1,
1050 last_key: -1,
1051 step: 1,
1052 keys: &[RW_ACCESS_AT1_RM1_1_0],
1053 acl: AC_HLL_READ,
1054 since: "2.8.9",
1055 complexity: "O(1) for one key, O(N) for N of them",
1056 summary: "Estimate how many distinct elements the sketches hold.",
1057 group: "hyperloglog",
1058 },
1059 Spec {
1060 name: "pfmerge",
1061 arity: -2,
1062 flags: WRITE_OOM,
1063 first_key: 1,
1064 last_key: -1,
1065 step: 1,
1066 keys: &[RW_ACCESS_INSERT_AT1, RO_ACCESS_AT2_RM1_1_0],
1067 acl: AC_HLL_WRITE,
1068 since: "2.8.9",
1069 complexity: "O(N) in the number of sketches",
1070 summary: "Merge sketches into the first one, which is a union.",
1071 group: "hyperloglog",
1072 },
1073 Spec {
1074 name: "pfdebug",
1075 arity: 3,
1076 flags: WRITE_OOM_ADMIN,
1077 first_key: 2,
1078 last_key: 2,
1079 step: 1,
1080 keys: &[RW_ACCESS_AT2],
1081 acl: AC_HLL_ADMIN,
1082 since: "2.8.9",
1083 complexity: "O(N)",
1084 summary: "Look inside a sketch, and in one case convert it.",
1085 group: "hyperloglog",
1086 },
1087 Spec {
1088 name: "pfselftest",
1089 arity: 1,
1090 flags: &["admin"],
1091 first_key: 0,
1092 last_key: 0,
1093 step: 0,
1094 keys: &[],
1095 acl: AC_HLL_ADMIN,
1096 since: "2.8.9",
1097 complexity: "O(1)",
1098 summary: "Check the sketch code, which our tests do at build time.",
1099 group: "hyperloglog",
1100 },
1101 Spec {
1103 name: "sadd",
1104 arity: -3,
1105 flags: WRITE_FAST_OOM,
1106 first_key: 1,
1107 last_key: 1,
1108 step: 1,
1109 keys: &[RW_INSERT_AT1],
1110 acl: AC_SET_WRITE_FAST,
1111 since: "1.0.0",
1112 complexity: "O(N) with N the number of members being added",
1113 summary: "Add members to a set, creating it if it is not there.",
1114 group: "set",
1115 },
1116 Spec {
1117 name: "srem",
1118 arity: -3,
1119 flags: WRITE_FAST,
1120 first_key: 1,
1121 last_key: 1,
1122 step: 1,
1123 keys: &[RW_DELETE_AT1],
1124 acl: AC_SET_WRITE_FAST,
1125 since: "1.0.0",
1126 complexity: "O(N) with N the number of members being removed",
1127 summary: "Take members out of a set, deleting the key if none are left.",
1128 group: "set",
1129 },
1130 Spec {
1131 name: "scard",
1132 arity: 2,
1133 flags: READ_FAST,
1134 first_key: 1,
1135 last_key: 1,
1136 step: 1,
1137 keys: &[RO_AT1],
1138 acl: AC_SET_READ_FAST,
1139 since: "1.0.0",
1140 complexity: "O(1)",
1141 summary: "How many members a set has.",
1142 group: "set",
1143 },
1144 Spec {
1145 name: "sismember",
1146 arity: 3,
1147 flags: READ_FAST,
1148 first_key: 1,
1149 last_key: 1,
1150 step: 1,
1151 keys: &[RO_AT1],
1152 acl: AC_SET_READ_FAST,
1153 since: "1.0.0",
1154 complexity: "O(1)",
1155 summary: "Whether a member is in a set.",
1156 group: "set",
1157 },
1158 Spec {
1159 name: "smismember",
1160 arity: -3,
1161 flags: READ_FAST,
1162 first_key: 1,
1163 last_key: 1,
1164 step: 1,
1165 keys: &[RO_ACCESS_AT1],
1166 acl: AC_SET_READ_FAST,
1167 since: "6.2.0",
1168 complexity: "O(N) with N the number of members being asked about",
1169 summary: "Whether each of several members is in a set, in the order asked.",
1170 group: "set",
1171 },
1172 Spec {
1173 name: "smembers",
1174 arity: 2,
1175 flags: &["readonly"],
1176 first_key: 1,
1177 last_key: 1,
1178 step: 1,
1179 keys: &[RO_ACCESS_AT1],
1180 acl: AC_SET_READ_SLOW,
1181 since: "1.0.0",
1182 complexity: "O(N) with N the size of the set",
1183 summary: "Every member of a set.",
1184 group: "set",
1185 },
1186 Spec {
1187 name: "spop",
1188 arity: -2,
1189 flags: WRITE_FAST,
1190 first_key: 1,
1191 last_key: 1,
1192 step: 1,
1193 keys: &[RW_ACCESS_DELETE_AT1],
1194 acl: AC_SET_WRITE_FAST,
1195 since: "1.0.0",
1196 complexity: "O(1) without a count, O(N) with one",
1197 summary: "Take members out of a set at random and hand them back.",
1198 group: "set",
1199 },
1200 Spec {
1201 name: "srandmember",
1202 arity: -2,
1203 flags: &["readonly"],
1204 first_key: 1,
1205 last_key: 1,
1206 step: 1,
1207 keys: &[RO_ACCESS_AT1],
1208 acl: AC_SET_READ_SLOW,
1209 since: "1.0.0",
1210 complexity: "O(1) without a count, O(N) with one",
1211 summary: "Members of a set at random, leaving the set as it was.",
1212 group: "set",
1213 },
1214 Spec {
1215 name: "smove",
1216 arity: 4,
1217 flags: WRITE_FAST,
1218 first_key: 1,
1219 last_key: 2,
1220 step: 1,
1221 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
1222 acl: AC_SET_WRITE_FAST,
1223 since: "1.0.0",
1224 complexity: "O(1)",
1225 summary: "Move one member from one set to another.",
1226 group: "set",
1227 },
1228 Spec {
1229 name: "sscan",
1230 arity: -3,
1231 flags: &["readonly"],
1232 first_key: 1,
1233 last_key: 1,
1234 step: 1,
1235 keys: &[RO_ACCESS_AT1],
1236 acl: AC_SET_READ_SLOW,
1237 since: "2.8.0",
1238 complexity: "O(1) a call, O(N) for a whole iteration",
1239 summary: "Walk part of a set and say where to carry on from.",
1240 group: "set",
1241 },
1242 Spec {
1243 name: "sinter",
1244 arity: -2,
1245 flags: &["readonly"],
1246 first_key: 1,
1247 last_key: -1,
1248 step: 1,
1249 keys: &[RO_ACCESS_AT1_RM1_1_0],
1250 acl: AC_SET_READ_SLOW,
1251 since: "1.0.0",
1252 complexity: "O(N*M) worst case, N the smallest set and M the number of sets",
1253 summary: "The members every one of these sets has.",
1254 group: "set",
1255 },
1256 Spec {
1257 name: "sintercard",
1258 arity: -3,
1259 flags: READ_MOVABLE,
1265 first_key: 0,
1266 last_key: 0,
1267 step: 0,
1268 keys: &[RO_ACCESS_AT1_COUNTED],
1269 acl: AC_SET_READ_SLOW,
1270 since: "7.0.0",
1271 complexity: "O(N*M) worst case, N the smallest set and M the number of sets",
1272 summary: "How many members every one of these sets has, up to a limit.",
1273 group: "set",
1274 },
1275 Spec {
1276 name: "sinterstore",
1277 arity: -3,
1278 flags: WRITE_OOM,
1279 first_key: 1,
1280 last_key: -1,
1281 step: 1,
1282 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2_RM1_1_0],
1283 acl: AC_SET_WRITE_SLOW,
1284 since: "1.0.0",
1285 complexity: "O(N*M) worst case, N the smallest set and M the number of sets",
1286 summary: "Store the members every one of these sets has.",
1287 group: "set",
1288 },
1289 Spec {
1290 name: "sunion",
1291 arity: -2,
1292 flags: &["readonly"],
1293 first_key: 1,
1294 last_key: -1,
1295 step: 1,
1296 keys: &[RO_ACCESS_AT1_RM1_1_0],
1297 acl: AC_SET_READ_SLOW,
1298 since: "1.0.0",
1299 complexity: "O(N) in the total number of members",
1300 summary: "The members any of these sets has, each once.",
1301 group: "set",
1302 },
1303 Spec {
1304 name: "sunionstore",
1305 arity: -3,
1306 flags: WRITE_OOM,
1307 first_key: 1,
1308 last_key: -1,
1309 step: 1,
1310 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2_RM1_1_0],
1311 acl: AC_SET_WRITE_SLOW,
1312 since: "1.0.0",
1313 complexity: "O(N) in the total number of members",
1314 summary: "Store the members any of these sets has.",
1315 group: "set",
1316 },
1317 Spec {
1318 name: "sdiff",
1319 arity: -2,
1320 flags: &["readonly"],
1321 first_key: 1,
1322 last_key: -1,
1323 step: 1,
1324 keys: &[RO_ACCESS_AT1_RM1_1_0],
1325 acl: AC_SET_READ_SLOW,
1326 since: "1.0.0",
1327 complexity: "O(N) in the total number of members",
1328 summary: "The members of the first set that no later set has.",
1329 group: "set",
1330 },
1331 Spec {
1332 name: "sdiffstore",
1333 arity: -3,
1334 flags: WRITE_OOM,
1335 first_key: 1,
1336 last_key: -1,
1337 step: 1,
1338 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2_RM1_1_0],
1339 acl: AC_SET_WRITE_SLOW,
1340 since: "1.0.0",
1341 complexity: "O(N) in the total number of members",
1342 summary: "Store the members of the first set that no later set has.",
1343 group: "set",
1344 },
1345 Spec {
1349 name: "sunioncard",
1350 arity: -3,
1351 flags: READ_MOVABLE,
1352 first_key: 0,
1353 last_key: 0,
1354 step: 0,
1355 keys: &[RO_ACCESS_AT1_COUNTED],
1356 acl: AC_SET_READ_SLOW,
1357 since: "8.10.0",
1358 complexity: "O(N) in the total number of members",
1359 summary: "How many members any of these sets has, up to a limit.",
1360 group: "set",
1361 },
1362 Spec {
1363 name: "sdiffcard",
1364 arity: -3,
1365 flags: READ_MOVABLE,
1366 first_key: 0,
1367 last_key: 0,
1368 step: 0,
1369 keys: &[RO_ACCESS_AT1_COUNTED],
1370 acl: AC_SET_READ_SLOW,
1371 since: "8.10.0",
1372 complexity: "O(N) in the total number of members",
1373 summary: "How many members the first set has that no later set has, up to a limit.",
1374 group: "set",
1375 },
1376 Spec {
1378 name: "hset",
1379 arity: -4,
1380 flags: WRITE_FAST_OOM,
1381 first_key: 1,
1382 last_key: 1,
1383 step: 1,
1384 keys: &[RW_UPDATE_AT1],
1385 acl: AC_HASH_WRITE_FAST,
1386 since: "2.0.0",
1387 complexity: "O(N) with N the number of pairs being written",
1388 summary: "Write fields into a hash, creating it if it is not there.",
1389 group: "hash",
1390 },
1391 Spec {
1392 name: "hsetnx",
1393 arity: 4,
1394 flags: WRITE_FAST_OOM,
1395 first_key: 1,
1396 last_key: 1,
1397 step: 1,
1398 keys: &[RW_INSERT_AT1],
1399 acl: AC_HASH_WRITE_FAST,
1400 since: "2.0.0",
1401 complexity: "O(1)",
1402 summary: "Write a field only if the hash does not have it already.",
1403 group: "hash",
1404 },
1405 Spec {
1408 name: "hmset",
1409 arity: -4,
1410 flags: WRITE_FAST_OOM,
1411 first_key: 1,
1412 last_key: 1,
1413 step: 1,
1414 keys: &[RW_UPDATE_AT1],
1415 acl: AC_HASH_WRITE_FAST,
1416 since: "2.0.0",
1417 complexity: "O(N) with N the number of pairs being written",
1418 summary: "Write fields into a hash and answer OK. Use HSET.",
1419 group: "hash",
1420 },
1421 Spec {
1422 name: "hget",
1423 arity: 3,
1424 flags: READ_FAST,
1425 first_key: 1,
1426 last_key: 1,
1427 step: 1,
1428 keys: &[RO_ACCESS_AT1],
1429 acl: AC_HASH_READ_FAST,
1430 since: "2.0.0",
1431 complexity: "O(1)",
1432 summary: "The value of one field of a hash.",
1433 group: "hash",
1434 },
1435 Spec {
1436 name: "hmget",
1437 arity: -3,
1438 flags: READ_FAST,
1439 first_key: 1,
1440 last_key: 1,
1441 step: 1,
1442 keys: &[RO_ACCESS_AT1],
1443 acl: AC_HASH_READ_FAST,
1444 since: "2.0.0",
1445 complexity: "O(N) with N the number of fields asked for",
1446 summary: "The values of several fields, one reply entry each.",
1447 group: "hash",
1448 },
1449 Spec {
1450 name: "hdel",
1451 arity: -3,
1452 flags: WRITE_FAST,
1453 first_key: 1,
1454 last_key: 1,
1455 step: 1,
1456 keys: &[RW_DELETE_AT1],
1457 acl: AC_HASH_WRITE_FAST,
1458 since: "2.0.0",
1459 complexity: "O(N) with N the number of fields being removed",
1460 summary: "Take fields out of a hash, deleting the key if none are left.",
1461 group: "hash",
1462 },
1463 Spec {
1464 name: "hlen",
1465 arity: 2,
1466 flags: READ_FAST,
1467 first_key: 1,
1468 last_key: 1,
1469 step: 1,
1470 keys: &[RO_AT1],
1471 acl: AC_HASH_READ_FAST,
1472 since: "2.0.0",
1473 complexity: "O(1)",
1474 summary: "How many fields a hash has.",
1475 group: "hash",
1476 },
1477 Spec {
1478 name: "hexists",
1479 arity: 3,
1480 flags: READ_FAST,
1481 first_key: 1,
1482 last_key: 1,
1483 step: 1,
1484 keys: &[RO_AT1],
1485 acl: AC_HASH_READ_FAST,
1486 since: "2.0.0",
1487 complexity: "O(1)",
1488 summary: "Whether a hash has a field.",
1489 group: "hash",
1490 },
1491 Spec {
1492 name: "hstrlen",
1493 arity: 3,
1494 flags: READ_FAST,
1495 first_key: 1,
1496 last_key: 1,
1497 step: 1,
1498 keys: &[RO_AT1],
1499 acl: AC_HASH_READ_FAST,
1500 since: "3.2.0",
1501 complexity: "O(1)",
1502 summary: "How many bytes a field's value is, without sending it.",
1503 group: "hash",
1504 },
1505 Spec {
1506 name: "hgetall",
1507 arity: 2,
1508 flags: &["readonly"],
1509 first_key: 1,
1510 last_key: 1,
1511 step: 1,
1512 keys: &[RO_ACCESS_AT1],
1513 acl: AC_HASH_READ_SLOW,
1514 since: "2.0.0",
1515 complexity: "O(N) in the size of the hash",
1516 summary: "Every field and value, as a map on RESP3.",
1517 group: "hash",
1518 },
1519 Spec {
1520 name: "hkeys",
1521 arity: 2,
1522 flags: &["readonly"],
1523 first_key: 1,
1524 last_key: 1,
1525 step: 1,
1526 keys: &[RO_ACCESS_AT1],
1527 acl: AC_HASH_READ_SLOW,
1528 since: "2.0.0",
1529 complexity: "O(N) in the size of the hash",
1530 summary: "Every field of a hash.",
1531 group: "hash",
1532 },
1533 Spec {
1534 name: "hvals",
1535 arity: 2,
1536 flags: &["readonly"],
1537 first_key: 1,
1538 last_key: 1,
1539 step: 1,
1540 keys: &[RO_ACCESS_AT1],
1541 acl: AC_HASH_READ_SLOW,
1542 since: "2.0.0",
1543 complexity: "O(N) in the size of the hash",
1544 summary: "Every value of a hash.",
1545 group: "hash",
1546 },
1547 Spec {
1548 name: "hincrby",
1549 arity: 4,
1550 flags: WRITE_FAST_OOM,
1551 first_key: 1,
1552 last_key: 1,
1553 step: 1,
1554 keys: &[RW_ACCESS_UPDATE_AT1],
1555 acl: AC_HASH_WRITE_FAST,
1556 since: "2.0.0",
1557 complexity: "O(1)",
1558 summary: "Add an integer to a field, treating a missing one as zero.",
1559 group: "hash",
1560 },
1561 Spec {
1562 name: "hincrbyfloat",
1563 arity: 4,
1564 flags: WRITE_FAST_OOM,
1565 first_key: 1,
1566 last_key: 1,
1567 step: 1,
1568 keys: &[RW_ACCESS_UPDATE_AT1],
1569 acl: AC_HASH_WRITE_FAST,
1570 since: "2.6.0",
1571 complexity: "O(1)",
1572 summary: "Add a float to a field, treating a missing one as zero.",
1573 group: "hash",
1574 },
1575 Spec {
1576 name: "hrandfield",
1577 arity: -2,
1578 flags: &["readonly"],
1579 first_key: 1,
1580 last_key: 1,
1581 step: 1,
1582 keys: &[RO_ACCESS_AT1],
1583 acl: AC_HASH_READ_SLOW,
1584 since: "6.2.0",
1585 complexity: "O(1) without a count, O(N) with one",
1586 summary: "Fields of a hash at random, leaving the hash as it was.",
1587 group: "hash",
1588 },
1589 Spec {
1590 name: "hscan",
1591 arity: -3,
1592 flags: &["readonly"],
1593 first_key: 1,
1594 last_key: 1,
1595 step: 1,
1596 keys: &[RO_ACCESS_AT1],
1597 acl: AC_HASH_READ_SLOW,
1598 since: "2.8.0",
1599 complexity: "O(1) a call, O(N) for a whole iteration",
1600 summary: "Walk part of a hash and say where to carry on from.",
1601 group: "hash",
1602 },
1603 Spec {
1604 name: "hexpire",
1605 arity: -6,
1606 flags: WRITE_FAST,
1607 first_key: 1,
1608 last_key: 1,
1609 step: 1,
1610 keys: &[RW_UPDATE_AT1],
1611 acl: AC_HASH_WRITE_FAST,
1612 since: "7.4.0",
1613 complexity: "O(N) with N the number of fields named",
1614 summary: "Put a deadline in seconds on hash fields.",
1615 group: "hash",
1616 },
1617 Spec {
1618 name: "hpexpire",
1619 arity: -6,
1620 flags: WRITE_FAST,
1621 first_key: 1,
1622 last_key: 1,
1623 step: 1,
1624 keys: &[RW_UPDATE_AT1],
1625 acl: AC_HASH_WRITE_FAST,
1626 since: "7.4.0",
1627 complexity: "O(N) with N the number of fields named",
1628 summary: "Put a deadline in milliseconds on hash fields.",
1629 group: "hash",
1630 },
1631 Spec {
1632 name: "hexpireat",
1633 arity: -6,
1634 flags: WRITE_FAST,
1635 first_key: 1,
1636 last_key: 1,
1637 step: 1,
1638 keys: &[RW_UPDATE_AT1],
1639 acl: AC_HASH_WRITE_FAST,
1640 since: "7.4.0",
1641 complexity: "O(N) with N the number of fields named",
1642 summary: "Put an absolute deadline in unix seconds on hash fields.",
1643 group: "hash",
1644 },
1645 Spec {
1646 name: "hpexpireat",
1647 arity: -6,
1648 flags: WRITE_FAST,
1649 first_key: 1,
1650 last_key: 1,
1651 step: 1,
1652 keys: &[RW_UPDATE_AT1],
1653 acl: AC_HASH_WRITE_FAST,
1654 since: "7.4.0",
1655 complexity: "O(N) with N the number of fields named",
1656 summary: "Put an absolute deadline in unix milliseconds on hash fields.",
1657 group: "hash",
1658 },
1659 Spec {
1660 name: "httl",
1661 arity: -5,
1662 flags: READ_FAST,
1663 first_key: 1,
1664 last_key: 1,
1665 step: 1,
1666 keys: &[RO_ACCESS_AT1],
1667 acl: AC_HASH_READ_FAST,
1668 since: "7.4.0",
1669 complexity: "O(N) with N the number of fields named",
1670 summary: "How long hash fields have left, in seconds.",
1671 group: "hash",
1672 },
1673 Spec {
1674 name: "hpttl",
1675 arity: -5,
1676 flags: READ_FAST,
1677 first_key: 1,
1678 last_key: 1,
1679 step: 1,
1680 keys: &[RO_ACCESS_AT1],
1681 acl: AC_HASH_READ_FAST,
1682 since: "7.4.0",
1683 complexity: "O(N) with N the number of fields named",
1684 summary: "How long hash fields have left, in milliseconds.",
1685 group: "hash",
1686 },
1687 Spec {
1688 name: "hexpiretime",
1689 arity: -5,
1690 flags: READ_FAST,
1691 first_key: 1,
1692 last_key: 1,
1693 step: 1,
1694 keys: &[RO_ACCESS_AT1],
1695 acl: AC_HASH_READ_FAST,
1696 since: "7.4.0",
1697 complexity: "O(N) with N the number of fields named",
1698 summary: "When hash fields fall due, in unix seconds.",
1699 group: "hash",
1700 },
1701 Spec {
1702 name: "hpexpiretime",
1703 arity: -5,
1704 flags: READ_FAST,
1705 first_key: 1,
1706 last_key: 1,
1707 step: 1,
1708 keys: &[RO_ACCESS_AT1],
1709 acl: AC_HASH_READ_FAST,
1710 since: "7.4.0",
1711 complexity: "O(N) with N the number of fields named",
1712 summary: "When hash fields fall due, in unix milliseconds.",
1713 group: "hash",
1714 },
1715 Spec {
1716 name: "hpersist",
1717 arity: -5,
1718 flags: WRITE_FAST,
1719 first_key: 1,
1720 last_key: 1,
1721 step: 1,
1722 keys: &[RW_UPDATE_AT1],
1723 acl: AC_HASH_WRITE_FAST,
1724 since: "7.4.0",
1725 complexity: "O(N) with N the number of fields named",
1726 summary: "Take the deadlines off hash fields.",
1727 group: "hash",
1728 },
1729 Spec {
1730 name: "hgetdel",
1731 arity: -5,
1732 flags: WRITE_FAST,
1733 first_key: 1,
1734 last_key: 1,
1735 step: 1,
1736 keys: &[RW_ACCESS_DELETE_AT1],
1737 acl: AC_HASH_WRITE_FAST,
1738 since: "8.0.0",
1739 complexity: "O(N) with N the number of fields named",
1740 summary: "Read hash fields and delete them.",
1741 group: "hash",
1742 },
1743 Spec {
1744 name: "hgetex",
1745 arity: -5,
1746 flags: WRITE_FAST,
1747 first_key: 1,
1748 last_key: 1,
1749 step: 1,
1750 keys: &[RW_ACCESS_UPDATE_AT1_TTL],
1751 acl: AC_HASH_WRITE_FAST,
1752 since: "8.0.0",
1753 complexity: "O(N) with N the number of fields named",
1754 summary: "Read hash fields and set their deadlines.",
1755 group: "hash",
1756 },
1757 Spec {
1758 name: "hsetex",
1759 arity: -6,
1760 flags: WRITE_FAST_OOM,
1761 first_key: 1,
1762 last_key: 1,
1763 step: 1,
1764 keys: &[RW_UPDATE_AT1],
1765 acl: AC_HASH_WRITE_FAST,
1766 since: "8.0.0",
1767 complexity: "O(N) with N the number of fields being set",
1768 summary: "Set hash fields and their deadlines together.",
1769 group: "hash",
1770 },
1771 Spec {
1775 name: "himport",
1776 arity: -2,
1777 flags: &[],
1778 first_key: 0,
1779 last_key: 0,
1780 step: 0,
1781 keys: &[],
1782 acl: AC_HASH_SLOW,
1783 since: "8.10.0",
1784 complexity: "Depends on subcommand.",
1785 summary: "A container for session-based hash import commands using fieldsets.",
1786 group: "hash",
1787 },
1788 Spec {
1790 name: "lpush",
1791 arity: -3,
1792 flags: WRITE_FAST_OOM,
1793 first_key: 1,
1794 last_key: 1,
1795 step: 1,
1796 keys: &[RW_INSERT_AT1],
1797 acl: AC_LIST_WRITE_FAST,
1798 since: "1.0.0",
1799 complexity: "O(N) with N the number of elements pushed",
1800 summary: "Push elements onto the head of a list.",
1801 group: "list",
1802 },
1803 Spec {
1804 name: "rpush",
1805 arity: -3,
1806 flags: WRITE_FAST_OOM,
1807 first_key: 1,
1808 last_key: 1,
1809 step: 1,
1810 keys: &[RW_INSERT_AT1],
1811 acl: AC_LIST_WRITE_FAST,
1812 since: "1.0.0",
1813 complexity: "O(N) with N the number of elements pushed",
1814 summary: "Push elements onto the tail of a list.",
1815 group: "list",
1816 },
1817 Spec {
1818 name: "lpushx",
1819 arity: -3,
1820 flags: WRITE_FAST_OOM,
1821 first_key: 1,
1822 last_key: 1,
1823 step: 1,
1824 keys: &[RW_INSERT_AT1],
1825 acl: AC_LIST_WRITE_FAST,
1826 since: "2.2.0",
1827 complexity: "O(N) with N the number of elements pushed",
1828 summary: "Push elements onto the head of a list that already exists.",
1829 group: "list",
1830 },
1831 Spec {
1832 name: "rpushx",
1833 arity: -3,
1834 flags: WRITE_FAST_OOM,
1835 first_key: 1,
1836 last_key: 1,
1837 step: 1,
1838 keys: &[RW_INSERT_AT1],
1839 acl: AC_LIST_WRITE_FAST,
1840 since: "2.2.0",
1841 complexity: "O(N) with N the number of elements pushed",
1842 summary: "Push elements onto the tail of a list that already exists.",
1843 group: "list",
1844 },
1845 Spec {
1846 name: "lpop",
1847 arity: -2,
1848 flags: WRITE_FAST,
1849 first_key: 1,
1850 last_key: 1,
1851 step: 1,
1852 keys: &[RW_ACCESS_DELETE_AT1],
1853 acl: AC_LIST_WRITE_FAST,
1854 since: "1.0.0",
1855 complexity: "O(N) with N the count asked for",
1856 summary: "Take elements off the head of a list.",
1857 group: "list",
1858 },
1859 Spec {
1860 name: "rpop",
1861 arity: -2,
1862 flags: WRITE_FAST,
1863 first_key: 1,
1864 last_key: 1,
1865 step: 1,
1866 keys: &[RW_ACCESS_DELETE_AT1],
1867 acl: AC_LIST_WRITE_FAST,
1868 since: "1.0.0",
1869 complexity: "O(N) with N the count asked for",
1870 summary: "Take elements off the tail of a list.",
1871 group: "list",
1872 },
1873 Spec {
1874 name: "llen",
1875 arity: 2,
1876 flags: READ_FAST,
1877 first_key: 1,
1878 last_key: 1,
1879 step: 1,
1880 keys: &[RO_AT1],
1881 acl: AC_LIST_READ_FAST,
1882 since: "1.0.0",
1883 complexity: "O(1)",
1884 summary: "How many elements a list holds.",
1885 group: "list",
1886 },
1887 Spec {
1888 name: "lrange",
1889 arity: 4,
1890 flags: READ_SLOW,
1891 first_key: 1,
1892 last_key: 1,
1893 step: 1,
1894 keys: &[RO_ACCESS_AT1],
1895 acl: AC_LIST_READ_SLOW,
1896 since: "1.0.0",
1897 complexity: "O(S+N) with S the offset of the first element and N the range",
1898 summary: "Read a range of a list, both ends included.",
1899 group: "list",
1900 },
1901 Spec {
1902 name: "lindex",
1903 arity: 3,
1904 flags: READ_SLOW,
1905 first_key: 1,
1906 last_key: 1,
1907 step: 1,
1908 keys: &[RO_ACCESS_AT1],
1909 acl: AC_LIST_READ_SLOW,
1910 since: "1.0.0",
1911 complexity: "O(N) with N the distance to the index from the nearer end",
1912 summary: "Read one element of a list by index.",
1913 group: "list",
1914 },
1915 Spec {
1916 name: "lset",
1917 arity: 4,
1918 flags: WRITE_OOM,
1919 first_key: 1,
1920 last_key: 1,
1921 step: 1,
1922 keys: &[RW_UPDATE_AT1],
1923 acl: AC_LIST_WRITE_SLOW,
1924 since: "1.0.0",
1925 complexity: "O(N) with N the distance to the index from the nearer end",
1926 summary: "Replace one element of a list by index.",
1927 group: "list",
1928 },
1929 Spec {
1930 name: "linsert",
1931 arity: 5,
1932 flags: WRITE_OOM,
1933 first_key: 1,
1934 last_key: 1,
1935 step: 1,
1936 keys: &[RW_INSERT_AT1],
1937 acl: AC_LIST_WRITE_SLOW,
1938 since: "2.2.0",
1939 complexity: "O(N) with N the distance to the pivot from the head",
1940 summary: "Insert an element before or after another one.",
1941 group: "list",
1942 },
1943 Spec {
1944 name: "lrem",
1945 arity: 4,
1946 flags: WRITE_SLOW,
1947 first_key: 1,
1948 last_key: 1,
1949 step: 1,
1950 keys: &[RW_DELETE_AT1],
1951 acl: AC_LIST_WRITE_SLOW,
1952 since: "1.0.0",
1953 complexity: "O(N) with N the length of the list",
1954 summary: "Remove elements equal to a value from a list.",
1955 group: "list",
1956 },
1957 Spec {
1958 name: "ltrim",
1959 arity: 4,
1960 flags: WRITE_SLOW,
1961 first_key: 1,
1962 last_key: 1,
1963 step: 1,
1964 keys: &[RW_DELETE_AT1],
1965 acl: AC_LIST_WRITE_SLOW,
1966 since: "1.0.0",
1967 complexity: "O(N) with N the number of elements thrown away",
1968 summary: "Keep a range of a list and throw the rest away.",
1969 group: "list",
1970 },
1971 Spec {
1972 name: "lpos",
1973 arity: -3,
1974 flags: READ_SLOW,
1975 first_key: 1,
1976 last_key: 1,
1977 step: 1,
1978 keys: &[RO_ACCESS_AT1],
1979 acl: AC_LIST_READ_SLOW,
1980 since: "6.0.6",
1981 complexity: "O(N) with N the length of the list",
1982 summary: "Find where a value sits in a list.",
1983 group: "list",
1984 },
1985 Spec {
1986 name: "rpoplpush",
1987 arity: 3,
1988 flags: WRITE_OOM,
1989 first_key: 1,
1990 last_key: 2,
1991 step: 1,
1992 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
1993 acl: AC_LIST_WRITE_SLOW,
1994 since: "1.2.0",
1995 complexity: "O(1)",
1996 summary: "Move an element from the tail of one list to the head of another.",
1997 group: "list",
1998 },
1999 Spec {
2000 name: "lmove",
2001 arity: 5,
2002 flags: WRITE_OOM,
2003 first_key: 1,
2004 last_key: 2,
2005 step: 1,
2006 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
2007 acl: AC_LIST_WRITE_SLOW,
2008 since: "6.2.0",
2009 complexity: "O(1)",
2010 summary: "Move an element from either end of one list to either end of another.",
2011 group: "list",
2012 },
2013 Spec {
2014 name: "lmovem",
2015 arity: -5,
2016 flags: WRITE_OOM,
2017 first_key: 1,
2018 last_key: 2,
2019 step: 1,
2020 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
2021 acl: AC_LIST_WRITE_SLOW,
2022 since: "8.10.0",
2023 complexity: "O(N) in the number of elements moved",
2024 summary: "Move several elements from either end of one list to either end of another.",
2025 group: "list",
2026 },
2027 Spec {
2032 name: "lmpop",
2033 arity: -4,
2034 flags: &["write", "movablekeys"],
2035 first_key: 0,
2036 last_key: 0,
2037 step: 0,
2038 keys: &[RW_ACCESS_DELETE_AT1_COUNTED],
2039 acl: AC_LIST_WRITE_SLOW,
2040 since: "7.0.0",
2041 complexity: "O(N+M) with N the number of keys and M the count popped",
2042 summary: "Pop from the first of several lists that has anything in it.",
2043 group: "list",
2044 },
2045 Spec {
2053 name: "blpop",
2054 arity: -3,
2055 flags: &["write", "blocking"],
2056 first_key: 1,
2057 last_key: -2,
2058 step: 1,
2059 keys: &[RW_ACCESS_DELETE_AT1_RM2_1_0],
2060 acl: AC_LIST_WRITE_BLOCKING,
2061 since: "2.0.0",
2062 complexity: "O(N) with N the number of keys named",
2063 summary: "Pop the head of the first list that has anything, waiting if none does.",
2064 group: "list",
2065 },
2066 Spec {
2067 name: "brpop",
2068 arity: -3,
2069 flags: &["write", "blocking"],
2070 first_key: 1,
2071 last_key: -2,
2072 step: 1,
2073 keys: &[RW_ACCESS_DELETE_AT1_RM2_1_0],
2074 acl: AC_LIST_WRITE_BLOCKING,
2075 since: "2.0.0",
2076 complexity: "O(N) with N the number of keys named",
2077 summary: "Pop the tail of the first list that has anything, waiting if none does.",
2078 group: "list",
2079 },
2080 Spec {
2083 name: "blmove",
2084 arity: 6,
2085 flags: &["write", "denyoom", "blocking"],
2086 first_key: 1,
2087 last_key: 2,
2088 step: 1,
2089 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
2090 acl: AC_LIST_WRITE_BLOCKING,
2091 since: "6.2.0",
2092 complexity: "O(1)",
2093 summary: "Move an element between two lists, waiting for one to arrive.",
2094 group: "list",
2095 },
2096 Spec {
2097 name: "blmovem",
2098 arity: -6,
2099 flags: &["write", "denyoom", "blocking"],
2100 first_key: 1,
2101 last_key: 2,
2102 step: 1,
2103 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
2104 acl: AC_LIST_WRITE_BLOCKING,
2105 since: "8.10.0",
2106 complexity: "O(N) in the number of elements moved",
2107 summary: "Move several elements between two lists, waiting for them to arrive.",
2108 group: "list",
2109 },
2110 Spec {
2111 name: "brpoplpush",
2112 arity: 4,
2113 flags: &["write", "denyoom", "blocking"],
2114 first_key: 1,
2115 last_key: 2,
2116 step: 1,
2117 keys: &[RW_ACCESS_DELETE_AT1, RW_INSERT_AT2],
2118 acl: AC_LIST_WRITE_BLOCKING,
2119 since: "2.2.0",
2120 complexity: "O(1)",
2121 summary: "Move a tail element to another list's head, waiting for one to arrive.",
2122 group: "list",
2123 },
2124 Spec {
2126 name: "blmpop",
2127 arity: -5,
2128 flags: &["write", "blocking", "movablekeys"],
2129 first_key: 0,
2130 last_key: 0,
2131 step: 0,
2132 keys: &[RW_ACCESS_DELETE_AT2_COUNTED],
2133 acl: AC_LIST_WRITE_BLOCKING,
2134 since: "7.0.0",
2135 complexity: "O(N+M) with N the number of keys and M the count popped",
2136 summary: "Pop from the first of several lists that has anything, waiting if none does.",
2137 group: "list",
2138 },
2139 Spec {
2141 name: "zadd",
2142 arity: -4,
2143 flags: WRITE_FAST_OOM,
2144 first_key: 1,
2145 last_key: 1,
2146 step: 1,
2147 keys: &[RW_UPDATE_AT1],
2148 acl: AC_ZSET_WRITE_FAST,
2149 since: "1.2.0",
2150 complexity: "O(log(N)) for each member added",
2151 summary: "Add members with scores, or move the scores of members already there.",
2152 group: "zset",
2153 },
2154 Spec {
2155 name: "zincrby",
2156 arity: 4,
2157 flags: WRITE_FAST_OOM,
2158 first_key: 1,
2159 last_key: 1,
2160 step: 1,
2161 keys: &[RW_ACCESS_UPDATE_AT1],
2162 acl: AC_ZSET_WRITE_FAST,
2163 since: "1.2.0",
2164 complexity: "O(log(N))",
2165 summary: "Add to a member's score, creating the member at zero if it is not there.",
2166 group: "zset",
2167 },
2168 Spec {
2169 name: "zcard",
2170 arity: 2,
2171 flags: READ_FAST,
2172 first_key: 1,
2173 last_key: 1,
2174 step: 1,
2175 keys: &[RO_AT1],
2176 acl: AC_ZSET_READ_FAST,
2177 since: "1.2.0",
2178 complexity: "O(1)",
2179 summary: "How many members a sorted set has.",
2180 group: "zset",
2181 },
2182 Spec {
2183 name: "zscore",
2184 arity: 3,
2185 flags: READ_FAST,
2186 first_key: 1,
2187 last_key: 1,
2188 step: 1,
2189 keys: &[RO_ACCESS_AT1],
2190 acl: AC_ZSET_READ_FAST,
2191 since: "1.2.0",
2192 complexity: "O(1)",
2193 summary: "A member's score, or nothing if it is not there.",
2194 group: "zset",
2195 },
2196 Spec {
2197 name: "zmscore",
2198 arity: -3,
2199 flags: READ_FAST,
2200 first_key: 1,
2201 last_key: 1,
2202 step: 1,
2203 keys: &[RO_ACCESS_AT1],
2204 acl: AC_ZSET_READ_FAST,
2205 since: "6.2.0",
2206 complexity: "O(N) with N the number of members asked about",
2207 summary: "The scores of several members in one round trip.",
2208 group: "zset",
2209 },
2210 Spec {
2211 name: "zrem",
2212 arity: -3,
2213 flags: WRITE_FAST,
2214 first_key: 1,
2215 last_key: 1,
2216 step: 1,
2217 keys: &[RW_DELETE_AT1],
2218 acl: AC_ZSET_WRITE_FAST,
2219 since: "1.2.0",
2220 complexity: "O(M*log(N)) with M the number of members removed",
2221 summary: "Remove members, deleting the key if the last one goes.",
2222 group: "zset",
2223 },
2224 Spec {
2225 name: "zrank",
2226 arity: -3,
2227 flags: READ_FAST,
2228 first_key: 1,
2229 last_key: 1,
2230 step: 1,
2231 keys: &[RO_ACCESS_AT1],
2232 acl: AC_ZSET_READ_FAST,
2233 since: "2.0.0",
2234 complexity: "O(log(N))",
2235 summary: "Where a member sits counting up from the lowest score.",
2236 group: "zset",
2237 },
2238 Spec {
2239 name: "zrevrank",
2240 arity: -3,
2241 flags: READ_FAST,
2242 first_key: 1,
2243 last_key: 1,
2244 step: 1,
2245 keys: &[RO_ACCESS_AT1],
2246 acl: AC_ZSET_READ_FAST,
2247 since: "2.0.0",
2248 complexity: "O(log(N))",
2249 summary: "Where a member sits counting down from the highest score.",
2250 group: "zset",
2251 },
2252 Spec {
2253 name: "zcount",
2254 arity: 4,
2255 flags: READ_FAST,
2256 first_key: 1,
2257 last_key: 1,
2258 step: 1,
2259 keys: &[RO_ACCESS_AT1],
2260 acl: AC_ZSET_READ_FAST,
2261 since: "2.0.0",
2262 complexity: "O(log(N))",
2263 summary: "How many members have scores between two bounds.",
2264 group: "zset",
2265 },
2266 Spec {
2267 name: "zlexcount",
2268 arity: 4,
2269 flags: READ_FAST,
2270 first_key: 1,
2271 last_key: 1,
2272 step: 1,
2273 keys: &[RO_ACCESS_AT1],
2274 acl: AC_ZSET_READ_FAST,
2275 since: "2.8.9",
2276 complexity: "O(log(N))",
2277 summary: "How many members fall between two members, by name.",
2278 group: "zset",
2279 },
2280 Spec {
2281 name: "zrange",
2282 arity: -4,
2283 flags: READ_SLOW,
2284 first_key: 1,
2285 last_key: 1,
2286 step: 1,
2287 keys: &[RO_ACCESS_AT1],
2288 acl: AC_ZSET_READ_SLOW,
2289 since: "1.2.0",
2290 complexity: "O(log(N)+M) with M the number of members answered",
2291 summary: "A window of members, by rank or by score or by name, either way round.",
2292 group: "zset",
2293 },
2294 Spec {
2295 name: "zrevrange",
2296 arity: -4,
2297 flags: READ_SLOW,
2298 first_key: 1,
2299 last_key: 1,
2300 step: 1,
2301 keys: &[RO_ACCESS_AT1],
2302 acl: AC_ZSET_READ_SLOW,
2303 since: "1.2.0",
2304 complexity: "O(log(N)+M) with M the number of members answered",
2305 summary: "A window by rank, counting down from the highest score.",
2306 group: "zset",
2307 },
2308 Spec {
2309 name: "zrangebyscore",
2310 arity: -4,
2311 flags: READ_SLOW,
2312 first_key: 1,
2313 last_key: 1,
2314 step: 1,
2315 keys: &[RO_ACCESS_AT1],
2316 acl: AC_ZSET_READ_SLOW,
2317 since: "1.0.5",
2318 complexity: "O(log(N)+M) with M the number of members answered",
2319 summary: "The members whose scores fall between two bounds.",
2320 group: "zset",
2321 },
2322 Spec {
2323 name: "zrevrangebyscore",
2324 arity: -4,
2325 flags: READ_SLOW,
2326 first_key: 1,
2327 last_key: 1,
2328 step: 1,
2329 keys: &[RO_ACCESS_AT1],
2330 acl: AC_ZSET_READ_SLOW,
2331 since: "2.2.0",
2332 complexity: "O(log(N)+M) with M the number of members answered",
2333 summary: "The same window as ZRANGEBYSCORE, highest score first and named high end first.",
2334 group: "zset",
2335 },
2336 Spec {
2337 name: "zrangebylex",
2338 arity: -4,
2339 flags: READ_SLOW,
2340 first_key: 1,
2341 last_key: 1,
2342 step: 1,
2343 keys: &[RO_ACCESS_AT1],
2344 acl: AC_ZSET_READ_SLOW,
2345 since: "2.8.9",
2346 complexity: "O(log(N)+M) with M the number of members answered",
2347 summary: "The members that fall between two names, for a set where every score is the same.",
2348 group: "zset",
2349 },
2350 Spec {
2351 name: "zrevrangebylex",
2352 arity: -4,
2353 flags: READ_SLOW,
2354 first_key: 1,
2355 last_key: 1,
2356 step: 1,
2357 keys: &[RO_ACCESS_AT1],
2358 acl: AC_ZSET_READ_SLOW,
2359 since: "2.8.9",
2360 complexity: "O(log(N)+M) with M the number of members answered",
2361 summary: "The same window as ZRANGEBYLEX, backwards and named high end first.",
2362 group: "zset",
2363 },
2364 Spec {
2365 name: "zrangestore",
2366 arity: -5,
2367 flags: WRITE_OOM,
2368 first_key: 1,
2369 last_key: 2,
2370 step: 1,
2371 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2],
2372 acl: AC_ZSET_WRITE_SLOW,
2373 since: "6.2.0",
2374 complexity: "O(log(N)+M) with M the number of members stored",
2375 summary: "Write a window of one sorted set into another key.",
2376 group: "zset",
2377 },
2378 Spec {
2379 name: "zremrangebyrank",
2380 arity: 4,
2381 flags: WRITE_SLOW,
2382 first_key: 1,
2383 last_key: 1,
2384 step: 1,
2385 keys: &[RW_DELETE_AT1],
2386 acl: AC_ZSET_WRITE_SLOW,
2387 since: "2.0.0",
2388 complexity: "O(log(N)+M) with M the number of members removed",
2389 summary: "Remove the members in a range of ranks.",
2390 group: "zset",
2391 },
2392 Spec {
2393 name: "zremrangebyscore",
2394 arity: 4,
2395 flags: WRITE_SLOW,
2396 first_key: 1,
2397 last_key: 1,
2398 step: 1,
2399 keys: &[RW_DELETE_AT1],
2400 acl: AC_ZSET_WRITE_SLOW,
2401 since: "1.2.0",
2402 complexity: "O(log(N)+M) with M the number of members removed",
2403 summary: "Remove the members whose scores fall between two bounds.",
2404 group: "zset",
2405 },
2406 Spec {
2407 name: "zremrangebylex",
2408 arity: 4,
2409 flags: WRITE_SLOW,
2410 first_key: 1,
2411 last_key: 1,
2412 step: 1,
2413 keys: &[RW_DELETE_AT1],
2414 acl: AC_ZSET_WRITE_SLOW,
2415 since: "2.8.9",
2416 complexity: "O(log(N)+M) with M the number of members removed",
2417 summary: "Remove the members that fall between two names.",
2418 group: "zset",
2419 },
2420 Spec {
2421 name: "zunion",
2422 arity: -3,
2423 flags: READ_MOVABLE,
2424 first_key: 0,
2425 last_key: 0,
2426 step: 0,
2427 keys: &[RO_ACCESS_AT1_COUNTED],
2428 acl: AC_ZSET_READ_SLOW,
2429 since: "6.2.0",
2430 complexity: "O(N)+O(M*log(M)) with N the total number of members and M the number in the answer",
2431 summary: "Every member of these sorted sets, with the scores combined.",
2432 group: "zset",
2433 },
2434 Spec {
2435 name: "zinter",
2436 arity: -3,
2437 flags: READ_MOVABLE,
2438 first_key: 0,
2439 last_key: 0,
2440 step: 0,
2441 keys: &[RO_ACCESS_AT1_COUNTED],
2442 acl: AC_ZSET_READ_SLOW,
2443 since: "6.2.0",
2444 complexity: "O(N)+O(M*log(M)) with N the total number of members and M the number in the answer",
2445 summary: "Only the members all of these sorted sets have, with the scores combined.",
2446 group: "zset",
2447 },
2448 Spec {
2449 name: "zdiff",
2450 arity: -3,
2451 flags: READ_MOVABLE,
2452 first_key: 0,
2453 last_key: 0,
2454 step: 0,
2455 keys: &[RO_ACCESS_AT1_COUNTED],
2456 acl: AC_ZSET_READ_SLOW,
2457 since: "6.2.0",
2458 complexity: "O(N)+O(M*log(M)) with N the total number of members and M the number in the answer",
2459 summary: "The members of the first that none of the rest have.",
2460 group: "zset",
2461 },
2462 Spec {
2463 name: "zunionstore",
2464 arity: -4,
2465 flags: WRITE_MOVABLE,
2466 first_key: 1,
2467 last_key: 1,
2468 step: 1,
2469 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2_COUNTED],
2470 acl: AC_ZSET_WRITE_SLOW,
2471 since: "2.0.0",
2472 complexity: "O(N)+O(M*log(M)) with N the total number of members and M the number in the answer",
2473 summary: "Store the union in another key and say how big it is.",
2474 group: "zset",
2475 },
2476 Spec {
2477 name: "zinterstore",
2478 arity: -4,
2479 flags: WRITE_MOVABLE,
2480 first_key: 1,
2481 last_key: 1,
2482 step: 1,
2483 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2_COUNTED],
2484 acl: AC_ZSET_WRITE_SLOW,
2485 since: "2.0.0",
2486 complexity: "O(N)+O(M*log(M)) with N the total number of members and M the number in the answer",
2487 summary: "Store the intersection in another key and say how big it is.",
2488 group: "zset",
2489 },
2490 Spec {
2491 name: "zdiffstore",
2492 arity: -4,
2493 flags: WRITE_MOVABLE,
2494 first_key: 1,
2495 last_key: 1,
2496 step: 1,
2497 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2_COUNTED],
2498 acl: AC_ZSET_WRITE_SLOW,
2499 since: "6.2.0",
2500 complexity: "O(N)+O(M*log(M)) with N the total number of members and M the number in the answer",
2501 summary: "Store the difference in another key and say how big it is.",
2502 group: "zset",
2503 },
2504 Spec {
2505 name: "zintercard",
2506 arity: -3,
2507 flags: READ_MOVABLE,
2508 first_key: 0,
2509 last_key: 0,
2510 step: 0,
2511 keys: &[RO_ACCESS_AT1_COUNTED],
2512 acl: AC_ZSET_READ_SLOW,
2513 since: "7.0.0",
2514 complexity: "O(N*M) worst case, N the smallest input and M the number of inputs",
2515 summary: "How many members the intersection would have, without building it.",
2516 group: "zset",
2517 },
2518 Spec {
2519 name: "zrandmember",
2520 arity: -2,
2521 flags: READ_SLOW,
2522 first_key: 1,
2523 last_key: 1,
2524 step: 1,
2525 keys: &[RO_ACCESS_AT1],
2526 acl: AC_ZSET_READ_SLOW,
2527 since: "6.2.0",
2528 complexity: "O(N) with N the number of members drawn",
2529 summary: "Draw members at random, with or without replacement.",
2530 group: "zset",
2531 },
2532 Spec {
2533 name: "zscan",
2534 arity: -3,
2535 flags: READ_SLOW,
2536 first_key: 1,
2537 last_key: 1,
2538 step: 1,
2539 keys: &[RO_ACCESS_AT1],
2540 acl: AC_ZSET_READ_SLOW,
2541 since: "2.8.0",
2542 complexity: "O(1) per call, O(N) over a full walk",
2543 summary: "Walk the members and their scores a batch at a time.",
2544 group: "zset",
2545 },
2546 Spec {
2549 name: "zpopmin",
2550 arity: -2,
2551 flags: WRITE_FAST,
2552 first_key: 1,
2553 last_key: 1,
2554 step: 1,
2555 keys: &[RW_ACCESS_DELETE_AT1],
2556 acl: AC_ZSET_WRITE_FAST,
2557 since: "5.0.0",
2558 complexity: "O(log(N)*M) with M the number of members popped",
2559 summary: "Take the lowest scoring members off and answer them.",
2560 group: "zset",
2561 },
2562 Spec {
2563 name: "zpopmax",
2564 arity: -2,
2565 flags: WRITE_FAST,
2566 first_key: 1,
2567 last_key: 1,
2568 step: 1,
2569 keys: &[RW_ACCESS_DELETE_AT1],
2570 acl: AC_ZSET_WRITE_FAST,
2571 since: "5.0.0",
2572 complexity: "O(log(N)*M) with M the number of members popped",
2573 summary: "Take the highest scoring members off and answer them.",
2574 group: "zset",
2575 },
2576 Spec {
2579 name: "zmpop",
2580 arity: -4,
2581 flags: &["write", "movablekeys"],
2582 first_key: 0,
2583 last_key: 0,
2584 step: 0,
2585 keys: &[RW_ACCESS_DELETE_AT1_COUNTED],
2586 acl: AC_ZSET_WRITE_SLOW,
2587 since: "7.0.0",
2588 complexity: "O(K) + O(M*log(N)) with K the keys named and M the count popped",
2589 summary: "Pop from the first of several sorted sets that has anything in it.",
2590 group: "zset",
2591 },
2592 Spec {
2595 name: "bzpopmin",
2596 arity: -3,
2597 flags: &["write", "blocking", "fast"],
2598 first_key: 1,
2599 last_key: -2,
2600 step: 1,
2601 keys: &[RW_ACCESS_DELETE_AT1_RM2_1_0],
2602 acl: AC_ZSET_BLOCKING_FAST,
2603 since: "5.0.0",
2604 complexity: "O(log(N)) with N the size of the sorted set that answers",
2605 summary: "Take the lowest scoring member off the first sorted set that has one, waiting if none does.",
2606 group: "zset",
2607 },
2608 Spec {
2609 name: "bzpopmax",
2610 arity: -3,
2611 flags: &["write", "blocking", "fast"],
2612 first_key: 1,
2613 last_key: -2,
2614 step: 1,
2615 keys: &[RW_ACCESS_DELETE_AT1_RM2_1_0],
2616 acl: AC_ZSET_BLOCKING_FAST,
2617 since: "5.0.0",
2618 complexity: "O(log(N)) with N the size of the sorted set that answers",
2619 summary: "Take the highest scoring member off the first sorted set that has one, waiting if none does.",
2620 group: "zset",
2621 },
2622 Spec {
2623 name: "bzmpop",
2624 arity: -5,
2625 flags: &["write", "blocking", "movablekeys"],
2626 first_key: 0,
2627 last_key: 0,
2628 step: 0,
2629 keys: &[RW_ACCESS_DELETE_AT2_COUNTED],
2630 acl: AC_ZSET_BLOCKING_SLOW,
2631 since: "7.0.0",
2632 complexity: "O(K) + O(M*log(N)) with K the keys named and M the count popped",
2633 summary: "Pop from the first of several sorted sets that has anything, waiting if none does.",
2634 group: "zset",
2635 },
2636 Spec {
2638 name: "geoadd",
2639 arity: -5,
2640 flags: WRITE_OOM,
2641 first_key: 1,
2642 last_key: 1,
2643 step: 1,
2644 keys: &[RW_UPDATE_AT1],
2645 acl: AC_GEO_WRITE,
2646 since: "3.2.0",
2647 complexity: "O(log(N)) per point added",
2648 summary: "Add places to a geo key, which is a sorted set of position hashes.",
2649 group: "geo",
2650 },
2651 Spec {
2652 name: "geopos",
2653 arity: -2,
2654 flags: READ_SLOW,
2655 first_key: 1,
2656 last_key: 1,
2657 step: 1,
2658 keys: &[RO_ACCESS_AT1],
2659 acl: AC_GEO_READ,
2660 since: "3.2.0",
2661 complexity: "O(1) per member asked about",
2662 summary: "Answer where each member is, as a longitude and a latitude.",
2663 group: "geo",
2664 },
2665 Spec {
2666 name: "geodist",
2667 arity: -4,
2668 flags: READ_SLOW,
2669 first_key: 1,
2670 last_key: 1,
2671 step: 1,
2672 keys: &[RO_ACCESS_AT1],
2673 acl: AC_GEO_READ,
2674 since: "3.2.0",
2675 complexity: "O(1)",
2676 summary: "Answer how far apart two members are, in the unit asked for.",
2677 group: "geo",
2678 },
2679 Spec {
2680 name: "geohash",
2681 arity: -2,
2682 flags: READ_SLOW,
2683 first_key: 1,
2684 last_key: 1,
2685 step: 1,
2686 keys: &[RO_ACCESS_AT1],
2687 acl: AC_GEO_READ,
2688 since: "3.2.0",
2689 complexity: "O(1) per member asked about",
2690 summary: "Answer each member's position as a standard eleven character geohash.",
2691 group: "geo",
2692 },
2693 Spec {
2694 name: "geosearch",
2695 arity: -7,
2696 flags: READ_SLOW,
2697 first_key: 1,
2698 last_key: 1,
2699 step: 1,
2700 keys: &[RO_ACCESS_AT1],
2701 acl: AC_GEO_READ,
2702 since: "6.2.0",
2703 complexity: "O(N+log(M)) with N the members in the boxes searched",
2704 summary: "Find the members inside a circle or a rectangle around a point.",
2705 group: "geo",
2706 },
2707 Spec {
2708 name: "geosearchstore",
2709 arity: -8,
2710 flags: WRITE_OOM,
2711 first_key: 1,
2712 last_key: 2,
2713 step: 1,
2714 keys: &[OW_UPDATE_AT1, RO_ACCESS_AT2],
2715 acl: AC_GEO_WRITE,
2716 since: "6.2.0",
2717 complexity: "O(N+log(M)) with N the members in the boxes searched",
2718 summary: "Run a search and write what it found into another key.",
2719 group: "geo",
2720 },
2721 Spec {
2722 name: "georadius",
2723 arity: -6,
2724 flags: WRITE_MOVABLE,
2725 first_key: 1,
2726 last_key: 1,
2727 step: 1,
2728 keys: &[RO_ACCESS_AT1, GEORADIUS_STORE, GEORADIUS_STOREDIST],
2729 acl: AC_GEO_WRITE,
2730 since: "3.2.0",
2731 complexity: "O(N+log(M)) with N the members in the boxes searched",
2732 summary: "The older spelling of a circular search, which can also store.",
2733 group: "geo",
2734 },
2735 Spec {
2736 name: "georadius_ro",
2737 arity: -6,
2738 flags: READ_SLOW,
2739 first_key: 1,
2740 last_key: 1,
2741 step: 1,
2742 keys: &[RO_ACCESS_AT1],
2743 acl: AC_GEO_READ,
2744 since: "3.2.10",
2745 complexity: "O(N+log(M)) with N the members in the boxes searched",
2746 summary: "GEORADIUS without the store options, so a replica can serve it.",
2747 group: "geo",
2748 },
2749 Spec {
2750 name: "georadiusbymember",
2751 arity: -5,
2752 flags: WRITE_MOVABLE,
2753 first_key: 1,
2754 last_key: 1,
2755 step: 1,
2756 keys: &[RO_ACCESS_AT1, BYMEMBER_STORE, BYMEMBER_STOREDIST],
2757 acl: AC_GEO_WRITE,
2758 since: "3.2.0",
2759 complexity: "O(N+log(M)) with N the members in the boxes searched",
2760 summary: "The same search centred on a member rather than on a point.",
2761 group: "geo",
2762 },
2763 Spec {
2764 name: "georadiusbymember_ro",
2765 arity: -5,
2766 flags: READ_SLOW,
2767 first_key: 1,
2768 last_key: 1,
2769 step: 1,
2770 keys: &[RO_ACCESS_AT1],
2771 acl: AC_GEO_READ,
2772 since: "3.2.10",
2773 complexity: "O(N+log(M)) with N the members in the boxes searched",
2774 summary: "GEORADIUSBYMEMBER without the store options.",
2775 group: "geo",
2776 },
2777 Spec {
2779 name: "g.nadd",
2780 arity: -3,
2781 flags: WRITE_FAST_OOM,
2782 first_key: 1,
2783 last_key: 1,
2784 step: 1,
2785 keys: &[RW_ACCESS_UPDATE_AT1],
2786 acl: AC_GRAPH_WRITE_FAST,
2787 since: "8.8.0",
2788 complexity: "O(N) with N the fields written",
2789 summary: "Write a node and its properties, creating it if it is new.",
2790 group: "graph",
2791 },
2792 Spec {
2793 name: "g.nget",
2794 arity: 3,
2795 flags: READ_FAST,
2796 first_key: 1,
2797 last_key: 1,
2798 step: 1,
2799 keys: &[RO_ACCESS_AT1],
2800 acl: AC_GRAPH_READ_FAST,
2801 since: "8.8.0",
2802 complexity: "O(N) with N the fields on the node",
2803 summary: "Every property on a node.",
2804 group: "graph",
2805 },
2806 Spec {
2807 name: "g.ndel",
2808 arity: 3,
2809 flags: WRITE_FAST,
2810 first_key: 1,
2811 last_key: 1,
2812 step: 1,
2813 keys: &[RW_ACCESS_UPDATE_AT1],
2814 acl: AC_GRAPH_WRITE_FAST,
2815 since: "8.8.0",
2816 complexity: "O(E) with E the edges on the node",
2817 summary: "Delete a node and every edge that touches it.",
2818 group: "graph",
2819 },
2820 Spec {
2821 name: "g.eadd",
2822 arity: -5,
2823 flags: WRITE_FAST_OOM,
2824 first_key: 1,
2825 last_key: 1,
2826 step: 1,
2827 keys: &[RW_ACCESS_UPDATE_AT1],
2828 acl: AC_GRAPH_WRITE_FAST,
2829 since: "8.8.0",
2830 complexity: "O(D) with D the outgoing degree under the label",
2831 summary: "Write an edge and its properties, creating either end if it is new.",
2832 group: "graph",
2833 },
2834 Spec {
2835 name: "g.edel",
2836 arity: 5,
2837 flags: WRITE_FAST,
2838 first_key: 1,
2839 last_key: 1,
2840 step: 1,
2841 keys: &[RW_ACCESS_UPDATE_AT1],
2842 acl: AC_GRAPH_WRITE_FAST,
2843 since: "8.8.0",
2844 complexity: "O(D) with D the outgoing degree under the label",
2845 summary: "Delete one edge between two nodes under a label.",
2846 group: "graph",
2847 },
2848 Spec {
2849 name: "g.out",
2850 arity: -4,
2851 flags: READ_FAST,
2852 first_key: 1,
2853 last_key: 1,
2854 step: 1,
2855 keys: &[RO_ACCESS_AT1],
2856 acl: AC_GRAPH_READ_FAST,
2857 since: "8.8.0",
2858 complexity: "O(N) with N the page asked for",
2859 summary: "Outgoing neighbours under a label, a page at a time.",
2860 group: "graph",
2861 },
2862 Spec {
2863 name: "g.in",
2864 arity: -4,
2865 flags: READ_FAST,
2866 first_key: 1,
2867 last_key: 1,
2868 step: 1,
2869 keys: &[RO_ACCESS_AT1],
2870 acl: AC_GRAPH_READ_FAST,
2871 since: "8.8.0",
2872 complexity: "O(N) with N the page asked for",
2873 summary: "Incoming neighbours under a label, a page at a time.",
2874 group: "graph",
2875 },
2876 Spec {
2877 name: "g.deg",
2878 arity: -4,
2879 flags: READ_FAST,
2880 first_key: 1,
2881 last_key: 1,
2882 step: 1,
2883 keys: &[RO_ACCESS_AT1],
2884 acl: AC_GRAPH_READ_FAST,
2885 since: "8.8.0",
2886 complexity: "O(1)",
2887 summary: "How many edges a node has under a label.",
2888 group: "graph",
2889 },
2890 Spec {
2891 name: "g.neigh",
2892 arity: -4,
2893 flags: READ_SLOW,
2894 first_key: 1,
2895 last_key: 1,
2896 step: 1,
2897 keys: &[RO_ACCESS_AT1],
2898 acl: AC_GRAPH_READ_SLOW,
2899 since: "8.8.0",
2900 complexity: "O(V + E) over the ball the depth reaches",
2901 summary: "Everything reachable within a depth, each node once.",
2902 group: "graph",
2903 },
2904 Spec {
2905 name: "g.path",
2906 arity: -4,
2907 flags: READ_SLOW,
2908 first_key: 1,
2909 last_key: 1,
2910 step: 1,
2911 keys: &[RO_ACCESS_AT1],
2912 acl: AC_GRAPH_READ_SLOW,
2913 since: "8.8.0",
2914 complexity: "O(b^(d/2)) with b the branching factor and d the distance",
2915 summary: "A shortest path between two nodes, searched from both ends.",
2916 group: "graph",
2917 },
2918 Spec {
2920 name: "json.set",
2921 arity: -4,
2922 flags: JSON_WRITE_OOM,
2923 first_key: 1,
2924 last_key: 1,
2925 step: 1,
2926 keys: &[RW_ACCESS_UPDATE_AT1],
2927 acl: AC_JSON_WRITE,
2928 since: "1.0.0",
2929 complexity: "O(N) with N the size of the document",
2930 summary: "Set the value at a path, creating the document at the root.",
2931 group: "json",
2932 },
2933 Spec {
2934 name: "json.mset",
2935 arity: -4,
2936 flags: JSON_WRITE_OOM,
2937 first_key: 1,
2938 last_key: -1,
2939 step: 3,
2940 keys: &[RW_ACCESS_UPDATE_AT1_RM1_3_0],
2941 acl: AC_JSON_WRITE,
2942 since: "2.6.0",
2943 complexity: "O(K*N) with K the keys and N the size of each document",
2944 summary: "Set the value at a path in each of several documents.",
2945 group: "json",
2946 },
2947 Spec {
2948 name: "json.merge",
2949 arity: -4,
2950 flags: JSON_WRITE_OOM,
2951 first_key: 1,
2952 last_key: 1,
2953 step: 1,
2954 keys: &[RW_ACCESS_UPDATE_AT1],
2955 acl: AC_JSON_WRITE,
2956 since: "2.6.0",
2957 complexity: "O(N) with N the size of the document",
2958 summary: "Apply an RFC 7386 merge patch at a path.",
2959 group: "json",
2960 },
2961 Spec {
2962 name: "json.get",
2963 arity: -2,
2964 flags: JSON_READ,
2965 first_key: 1,
2966 last_key: 1,
2967 step: 1,
2968 keys: &[RO_ACCESS_AT1],
2969 acl: AC_JSON_READ,
2970 since: "1.0.0",
2971 complexity: "O(N) with N the size of what the paths matched",
2972 summary: "The values one or more paths match, as JSON text.",
2973 group: "json",
2974 },
2975 Spec {
2976 name: "json.mget",
2977 arity: -3,
2978 flags: JSON_READ,
2979 first_key: 1,
2980 last_key: -2,
2981 step: 1,
2982 keys: &[RO_ACCESS_AT1_RM2_1_0],
2983 acl: AC_JSON_READ,
2984 since: "1.0.0",
2985 complexity: "O(K*N) with K the keys and N the size of each document",
2986 summary: "One path against several documents, one answer per key.",
2987 group: "json",
2988 },
2989 Spec {
2990 name: "json.del",
2991 arity: -2,
2992 flags: JSON_WRITE,
2993 first_key: 1,
2994 last_key: 1,
2995 step: 1,
2996 keys: &[RW_ACCESS_UPDATE_AT1],
2997 acl: AC_JSON_WRITE,
2998 since: "1.0.0",
2999 complexity: "O(N) with N the size of the document",
3000 summary: "Remove what a path matched, or the key when it is the root.",
3001 group: "json",
3002 },
3003 Spec {
3004 name: "json.forget",
3005 arity: -2,
3006 flags: JSON_WRITE,
3007 first_key: 1,
3008 last_key: 1,
3009 step: 1,
3010 keys: &[RW_ACCESS_UPDATE_AT1],
3011 acl: AC_JSON_WRITE,
3012 since: "1.0.0",
3013 complexity: "O(N) with N the size of the document",
3014 summary: "The same command as JSON.DEL, under its other name.",
3015 group: "json",
3016 },
3017 Spec {
3018 name: "json.type",
3019 arity: -2,
3020 flags: JSON_READ,
3021 first_key: 1,
3022 last_key: 1,
3023 step: 1,
3024 keys: &[RO_ACCESS_AT1],
3025 acl: AC_JSON_READ,
3026 since: "1.0.0",
3027 complexity: "O(N) with N the size of the document",
3028 summary: "The JSON type of what a path matched.",
3029 group: "json",
3030 },
3031 Spec {
3032 name: "json.toggle",
3033 arity: 3,
3034 flags: JSON_WRITE,
3035 first_key: 1,
3036 last_key: 1,
3037 step: 1,
3038 keys: &[RW_ACCESS_UPDATE_AT1],
3039 acl: AC_JSON_WRITE,
3040 since: "2.0.0",
3041 complexity: "O(N) with N the size of the document",
3042 summary: "Flip every boolean a path matched.",
3043 group: "json",
3044 },
3045 Spec {
3046 name: "json.clear",
3047 arity: -2,
3048 flags: JSON_WRITE,
3049 first_key: 1,
3050 last_key: 1,
3051 step: 1,
3052 keys: &[RW_ACCESS_UPDATE_AT1],
3053 acl: AC_JSON_WRITE,
3054 since: "2.0.0",
3055 complexity: "O(N) with N the size of the document",
3056 summary: "Empty the containers and zero the numbers a path matched.",
3057 group: "json",
3058 },
3059 Spec {
3060 name: "json.arrlen",
3061 arity: -2,
3062 flags: JSON_READ,
3063 first_key: 1,
3064 last_key: 1,
3065 step: 1,
3066 keys: &[RO_ACCESS_AT1],
3067 acl: AC_JSON_READ,
3068 since: "1.0.0",
3069 complexity: "O(1)",
3070 summary: "How many elements are in the arrays a path matched.",
3071 group: "json",
3072 },
3073 Spec {
3074 name: "json.objlen",
3075 arity: -2,
3076 flags: JSON_READ,
3077 first_key: 1,
3078 last_key: 1,
3079 step: 1,
3080 keys: &[RO_ACCESS_AT1],
3081 acl: AC_JSON_READ,
3082 since: "1.0.0",
3083 complexity: "O(1)",
3084 summary: "How many members are in the objects a path matched.",
3085 group: "json",
3086 },
3087 Spec {
3088 name: "json.strlen",
3089 arity: -2,
3090 flags: JSON_READ,
3091 first_key: 1,
3092 last_key: 1,
3093 step: 1,
3094 keys: &[RO_ACCESS_AT1],
3095 acl: AC_JSON_READ,
3096 since: "1.0.0",
3097 complexity: "O(1)",
3098 summary: "How long the strings a path matched are, in bytes.",
3099 group: "json",
3100 },
3101 Spec {
3102 name: "json.objkeys",
3103 arity: -2,
3104 flags: JSON_READ,
3105 first_key: 1,
3106 last_key: 1,
3107 step: 1,
3108 keys: &[RO_ACCESS_AT1],
3109 acl: AC_JSON_READ,
3110 since: "1.0.0",
3111 complexity: "O(N) with N the number of members",
3112 summary: "The keys of the objects a path matched.",
3113 group: "json",
3114 },
3115 Spec {
3116 name: "json.arrappend",
3117 arity: -3,
3118 flags: JSON_WRITE_OOM,
3119 first_key: 1,
3120 last_key: 1,
3121 step: 1,
3122 keys: &[RW_ACCESS_UPDATE_AT1],
3123 acl: AC_JSON_WRITE,
3124 since: "1.0.0",
3125 complexity: "O(N) with N the size of the document",
3126 summary: "Add values to the end of the arrays a path matched.",
3127 group: "json",
3128 },
3129 Spec {
3130 name: "json.arrinsert",
3131 arity: -5,
3132 flags: JSON_WRITE_OOM,
3133 first_key: 1,
3134 last_key: 1,
3135 step: 1,
3136 keys: &[RW_ACCESS_UPDATE_AT1],
3137 acl: AC_JSON_WRITE,
3138 since: "1.0.0",
3139 complexity: "O(N) with N the size of the document",
3140 summary: "Put values into the arrays a path matched, at an index.",
3141 group: "json",
3142 },
3143 Spec {
3144 name: "json.arrtrim",
3145 arity: 5,
3146 flags: JSON_WRITE,
3147 first_key: 1,
3148 last_key: 1,
3149 step: 1,
3150 keys: &[RW_ACCESS_UPDATE_AT1],
3151 acl: AC_JSON_WRITE,
3152 since: "1.0.0",
3153 complexity: "O(N) with N the size of the document",
3154 summary: "Keep only a run of the arrays a path matched.",
3155 group: "json",
3156 },
3157 Spec {
3158 name: "json.arrpop",
3159 arity: -2,
3160 flags: JSON_WRITE,
3161 first_key: 1,
3162 last_key: 1,
3163 step: 1,
3164 keys: &[RW_ACCESS_UPDATE_AT1],
3165 acl: AC_JSON_WRITE,
3166 since: "1.0.0",
3167 complexity: "O(N) with N the size of the document",
3168 summary: "Take one element out of the arrays a path matched.",
3169 group: "json",
3170 },
3171 Spec {
3172 name: "json.arrindex",
3173 arity: -4,
3174 flags: JSON_READ,
3175 first_key: 1,
3176 last_key: 1,
3177 step: 1,
3178 keys: &[RO_ACCESS_AT1],
3179 acl: AC_JSON_READ,
3180 since: "1.0.0",
3181 complexity: "O(N) with N the number of elements",
3182 summary: "Where a value first sits in the arrays a path matched.",
3183 group: "json",
3184 },
3185 Spec {
3186 name: "json.numincrby",
3187 arity: 4,
3188 flags: JSON_WRITE,
3189 first_key: 1,
3190 last_key: 1,
3191 step: 1,
3192 keys: &[RW_ACCESS_UPDATE_AT1],
3193 acl: AC_JSON_WRITE,
3194 since: "1.0.0",
3195 complexity: "O(N) with N the size of the document",
3196 summary: "Add to every number a path matched.",
3197 group: "json",
3198 },
3199 Spec {
3200 name: "json.nummultby",
3201 arity: 4,
3202 flags: JSON_WRITE,
3203 first_key: 1,
3204 last_key: 1,
3205 step: 1,
3206 keys: &[RW_ACCESS_UPDATE_AT1],
3207 acl: AC_JSON_WRITE,
3208 since: "1.0.0",
3209 complexity: "O(N) with N the size of the document",
3210 summary: "Multiply every number a path matched.",
3211 group: "json",
3212 },
3213 Spec {
3214 name: "json.numpowby",
3215 arity: 4,
3216 flags: JSON_WRITE,
3217 first_key: 1,
3218 last_key: 1,
3219 step: 1,
3220 keys: &[RW_ACCESS_UPDATE_AT1],
3221 acl: AC_JSON_WRITE,
3222 since: "1.0.0",
3223 complexity: "O(N) with N the size of the document",
3224 summary: "Raise every number a path matched to a power.",
3225 group: "json",
3226 },
3227 Spec {
3228 name: "json.strappend",
3229 arity: -3,
3230 flags: JSON_WRITE_OOM,
3231 first_key: 1,
3232 last_key: 1,
3233 step: 1,
3234 keys: &[RW_ACCESS_UPDATE_AT1],
3235 acl: AC_JSON_WRITE,
3236 since: "1.0.0",
3237 complexity: "O(N) with N the size of the document",
3238 summary: "Add to the end of every string a path matched.",
3239 group: "json",
3240 },
3241 Spec {
3242 name: "json.resp",
3243 arity: -2,
3244 flags: JSON_READ,
3245 first_key: 1,
3246 last_key: 1,
3247 step: 1,
3248 keys: &[RO_ACCESS_AT1],
3249 acl: AC_JSON_READ,
3250 since: "1.0.0",
3251 complexity: "O(N) with N the size of what the path matched",
3252 summary: "What a path matched, as RESP types rather than as JSON text.",
3253 group: "json",
3254 },
3255 Spec {
3256 name: "json.debug",
3257 arity: -2,
3258 flags: JSON_READ_MOVABLE,
3259 first_key: 0,
3260 last_key: 0,
3261 step: 0,
3262 keys: &[],
3263 acl: AC_JSON_READ,
3264 since: "1.0.0",
3265 complexity: "O(N) with N the size of what the path matched",
3266 summary: "How much memory a document takes, and the help for that.",
3267 group: "json",
3268 },
3269 Spec {
3271 name: "VADD",
3272 arity: -5,
3273 flags: VECTOR_WRITE_OOM,
3274 first_key: 1,
3275 last_key: 1,
3276 step: 1,
3277 keys: &[RW_ACCESS_UPDATE_AT1],
3278 acl: AC_NONE,
3279 since: "8.0.0",
3280 complexity: "O(P*D) with P the partitions probed and D the dimension",
3281 summary: "Add a vector to a vector set under an element name.",
3282 group: "vector",
3283 },
3284 Spec {
3285 name: "VSIM",
3286 arity: -4,
3287 flags: VECTOR_READ,
3288 first_key: 1,
3289 last_key: 1,
3290 step: 1,
3291 keys: &[RW_ACCESS_UPDATE_AT1],
3292 acl: AC_NONE,
3293 since: "8.0.0",
3294 complexity: "O(P*D) with P the partitions probed and D the dimension",
3295 summary: "The elements nearest a vector or nearest another element.",
3296 group: "vector",
3297 },
3298 Spec {
3299 name: "VREM",
3300 arity: 3,
3301 flags: VECTOR_WRITE,
3302 first_key: 1,
3303 last_key: 1,
3304 step: 1,
3305 keys: &[RW_ACCESS_UPDATE_AT1],
3306 acl: AC_NONE,
3307 since: "8.0.0",
3308 complexity: "O(1)",
3309 summary: "Remove an element and its vector from a vector set.",
3310 group: "vector",
3311 },
3312 Spec {
3313 name: "VCARD",
3314 arity: 2,
3315 flags: VECTOR_READ_FAST,
3316 first_key: 1,
3317 last_key: 1,
3318 step: 1,
3319 keys: &[RW_ACCESS_UPDATE_AT1],
3320 acl: AC_NONE,
3321 since: "8.0.0",
3322 complexity: "O(1)",
3323 summary: "How many elements a vector set holds.",
3324 group: "vector",
3325 },
3326 Spec {
3327 name: "VDIM",
3328 arity: 2,
3329 flags: VECTOR_READ_FAST,
3330 first_key: 1,
3331 last_key: 1,
3332 step: 1,
3333 keys: &[RW_ACCESS_UPDATE_AT1],
3334 acl: AC_NONE,
3335 since: "8.0.0",
3336 complexity: "O(1)",
3337 summary: "How many dimensions the vectors in a vector set have.",
3338 group: "vector",
3339 },
3340 Spec {
3341 name: "VEMB",
3342 arity: -3,
3343 flags: VECTOR_READ_FAST,
3344 first_key: 1,
3345 last_key: 1,
3346 step: 1,
3347 keys: &[RW_ACCESS_UPDATE_AT1],
3348 acl: AC_NONE,
3349 since: "8.0.0",
3350 complexity: "O(D) with D the dimension",
3351 summary: "The vector an element went in with.",
3352 group: "vector",
3353 },
3354 Spec {
3355 name: "VINFO",
3356 arity: 2,
3357 flags: VECTOR_READ_FAST,
3358 first_key: 1,
3359 last_key: 1,
3360 step: 1,
3361 keys: &[RW_ACCESS_UPDATE_AT1],
3362 acl: AC_NONE,
3363 since: "8.0.0",
3364 complexity: "O(N) with N the elements, for the attribute count",
3365 summary: "What a vector set is and how its index is tuned.",
3366 group: "vector",
3367 },
3368 Spec {
3369 name: "VISMEMBER",
3370 arity: 3,
3371 flags: VECTOR_READ,
3372 first_key: 1,
3373 last_key: 1,
3374 step: 1,
3375 keys: &[RW_ACCESS_UPDATE_AT1],
3376 acl: AC_NONE,
3377 since: "8.0.0",
3378 complexity: "O(1)",
3379 summary: "Whether an element is in a vector set.",
3380 group: "vector",
3381 },
3382 Spec {
3383 name: "VRANDMEMBER",
3384 arity: -2,
3385 flags: VECTOR_READ,
3386 first_key: 1,
3387 last_key: 1,
3388 step: 1,
3389 keys: &[RW_ACCESS_UPDATE_AT1],
3390 acl: AC_NONE,
3391 since: "8.0.0",
3392 complexity: "O(1) for one, O(N) for a positive count",
3393 summary: "Random elements of a vector set.",
3394 group: "vector",
3395 },
3396 Spec {
3397 name: "VLINKS",
3398 arity: -3,
3399 flags: VECTOR_READ_FAST,
3400 first_key: 1,
3401 last_key: 1,
3402 step: 1,
3403 keys: &[RW_ACCESS_UPDATE_AT1],
3404 acl: AC_NONE,
3405 since: "8.0.0",
3406 complexity: "O(P*D) with P the partitions probed and D the dimension",
3407 summary: "The elements an element is stored next to.",
3408 group: "vector",
3409 },
3410 Spec {
3411 name: "VSETATTR",
3412 arity: 4,
3413 flags: VECTOR_WRITE_FAST,
3414 first_key: 1,
3415 last_key: 1,
3416 step: 1,
3417 keys: &[RW_ACCESS_UPDATE_AT1],
3418 acl: AC_NONE,
3419 since: "8.0.0",
3420 complexity: "O(1)",
3421 summary: "Set the attribute string on an element, or clear it.",
3422 group: "vector",
3423 },
3424 Spec {
3425 name: "VGETATTR",
3426 arity: 3,
3427 flags: VECTOR_READ_FAST,
3428 first_key: 1,
3429 last_key: 1,
3430 step: 1,
3431 keys: &[RW_ACCESS_UPDATE_AT1],
3432 acl: AC_NONE,
3433 since: "8.0.0",
3434 complexity: "O(1)",
3435 summary: "The attribute string on an element.",
3436 group: "vector",
3437 },
3438 Spec {
3439 name: "VRANGE",
3440 arity: -4,
3441 flags: VECTOR_READ,
3442 first_key: 1,
3443 last_key: 1,
3444 step: 1,
3445 keys: &[RW_ACCESS_UPDATE_AT1],
3446 acl: AC_NONE,
3447 since: "8.4.0",
3448 complexity: "O(N log N) with N the elements the range covers",
3449 summary: "The elements of a vector set whose names fall in a range.",
3450 group: "vector",
3451 },
3452 Spec {
3462 name: "FT.CREATE",
3463 arity: -5,
3464 flags: SEARCH_WRITE_OOM,
3465 first_key: 0,
3466 last_key: 0,
3467 step: 0,
3468 keys: &[],
3469 acl: AC_SEARCH,
3470 since: "1.0.0",
3471 complexity: "O(K) with K the fields declared, plus O(N) over the keyspace when the initial scan runs",
3472 summary: "Create an index over the keys with a prefix, with the given schema.",
3473 group: "search",
3474 },
3475 Spec {
3476 name: "FT._CREATEIFNX",
3477 arity: -5,
3478 flags: SEARCH_WRITE_OOM,
3479 first_key: 0,
3480 last_key: 0,
3481 step: 0,
3482 keys: &[],
3483 acl: AC_SEARCH,
3484 since: "1.0.0",
3485 complexity: "O(K) with K the fields declared, plus O(N) over the keyspace when the initial scan runs",
3486 summary: "Create an index, and say nothing if one of that name is already there.",
3487 group: "search",
3488 },
3489 Spec {
3490 name: "FT.ALTER",
3491 arity: -6,
3492 flags: SEARCH_WRITE_OOM,
3493 first_key: 0,
3494 last_key: 0,
3495 step: 0,
3496 keys: &[],
3497 acl: AC_SEARCH,
3498 since: "1.0.0",
3499 complexity: "O(N) over the keys the index follows, when the fields are backfilled",
3500 summary: "Add fields to an index's schema.",
3501 group: "search",
3502 },
3503 Spec {
3504 name: "FT._ALTERIFNX",
3505 arity: -6,
3506 flags: SEARCH_WRITE_OOM,
3507 first_key: 0,
3508 last_key: 0,
3509 step: 0,
3510 keys: &[],
3511 acl: AC_SEARCH,
3512 since: "1.0.0",
3513 complexity: "O(N) over the keys the index follows, when the fields are backfilled",
3514 summary: "Add fields to a schema, and say nothing about the ones already there.",
3515 group: "search",
3516 },
3517 Spec {
3518 name: "FT.DROPINDEX",
3519 arity: -2,
3520 flags: SEARCH_WRITE,
3521 first_key: 0,
3522 last_key: 0,
3523 step: 0,
3524 keys: &[],
3525 acl: AC_SEARCH_DROP,
3526 since: "2.0.0",
3527 complexity: "O(1), or O(N) over the documents when DD is given",
3528 summary: "Take an index away, and its documents with it when DD is given.",
3529 group: "search",
3530 },
3531 Spec {
3532 name: "FT._DROPINDEXIFX",
3533 arity: -2,
3534 flags: SEARCH_WRITE,
3535 first_key: 0,
3536 last_key: 0,
3537 step: 0,
3538 keys: &[],
3539 acl: AC_SEARCH_DROP,
3540 since: "2.0.0",
3541 complexity: "O(1), or O(N) over the documents when DD is given",
3542 summary: "Take an index away, and say nothing when there is none of that name.",
3543 group: "search",
3544 },
3545 Spec {
3546 name: "FT.DROP",
3547 arity: -1,
3548 flags: SEARCH_WRITE,
3549 first_key: 0,
3550 last_key: 0,
3551 step: 0,
3552 keys: &[],
3553 acl: AC_SEARCH_DROP,
3554 since: "1.0.0",
3555 complexity: "O(1)",
3556 summary: "Take an index away. Deprecated, and FT.DROPINDEX is the name to use.",
3557 group: "search",
3558 },
3559 Spec {
3560 name: "FT._DROPIFX",
3561 arity: -1,
3562 flags: SEARCH_WRITE,
3563 first_key: 0,
3564 last_key: 0,
3565 step: 0,
3566 keys: &[],
3567 acl: AC_SEARCH_WRITE,
3568 since: "1.0.0",
3569 complexity: "O(1)",
3570 summary: "Take an index away and say nothing when there is none. Deprecated.",
3571 group: "search",
3572 },
3573 Spec {
3574 name: "FT.INFO",
3575 arity: 2,
3576 flags: SEARCH_READ,
3577 first_key: 0,
3578 last_key: 0,
3579 step: 0,
3580 keys: &[],
3581 acl: AC_SEARCH,
3582 since: "1.0.0",
3583 complexity: "O(1)",
3584 summary: "Everything the server knows about one index.",
3585 group: "search",
3586 },
3587 Spec {
3588 name: "FT._LIST",
3589 arity: -1,
3590 flags: SEARCH_READ,
3591 first_key: 0,
3592 last_key: 0,
3593 step: 0,
3594 keys: &[],
3595 acl: AC_SEARCH_LIST,
3596 since: "2.0.0",
3597 complexity: "O(N) with N the indexes on the server",
3598 summary: "Every index on the server, by name.",
3599 group: "search",
3600 },
3601 Spec {
3602 name: "FT.CONFIG",
3603 arity: -2,
3604 flags: SEARCH_READ,
3605 first_key: 0,
3606 last_key: 0,
3607 step: 0,
3608 keys: &[],
3609 acl: AC_SEARCH_ADMIN,
3610 since: "1.0.0",
3611 complexity: "O(1)",
3612 summary: "Read, write or describe the search module's settings.",
3613 group: "search",
3614 },
3615 Spec {
3616 name: "_FT.DEBUG",
3617 arity: -2,
3618 flags: SEARCH_READ,
3619 first_key: 0,
3620 last_key: 0,
3621 step: 0,
3622 keys: &[],
3623 acl: AC_SEARCH_DEBUG,
3624 since: "1.0.0",
3625 complexity: "O(N) with N the size of whatever is being dumped.",
3626 summary: "Read an index's own structures back.",
3627 group: "search",
3628 },
3629 Spec {
3630 name: "FT.ALIASADD",
3631 arity: 3,
3632 flags: SEARCH_WRITE_OOM,
3633 first_key: 0,
3634 last_key: 0,
3635 step: 0,
3636 keys: &[],
3637 acl: AC_SEARCH,
3638 since: "1.0.0",
3639 complexity: "O(1)",
3640 summary: "Point another name at an index.",
3641 group: "search",
3642 },
3643 Spec {
3644 name: "FT._ALIASADDIFNX",
3645 arity: 3,
3646 flags: SEARCH_WRITE_OOM,
3647 first_key: 0,
3648 last_key: 0,
3649 step: 0,
3650 keys: &[],
3651 acl: AC_SEARCH,
3652 since: "1.0.0",
3653 complexity: "O(1)",
3654 summary: "Point another name at an index, and say nothing if it is taken.",
3655 group: "search",
3656 },
3657 Spec {
3658 name: "FT.ALIASDEL",
3659 arity: 2,
3660 flags: SEARCH_WRITE,
3661 first_key: 0,
3662 last_key: 0,
3663 step: 0,
3664 keys: &[],
3665 acl: AC_SEARCH,
3666 since: "1.0.0",
3667 complexity: "O(1)",
3668 summary: "Take an alias away.",
3669 group: "search",
3670 },
3671 Spec {
3672 name: "FT._ALIASDELIFX",
3673 arity: 2,
3674 flags: SEARCH_WRITE,
3675 first_key: 0,
3676 last_key: 0,
3677 step: 0,
3678 keys: &[],
3679 acl: AC_SEARCH,
3680 since: "1.0.0",
3681 complexity: "O(1)",
3682 summary: "Take an alias away, and say nothing when there is none.",
3683 group: "search",
3684 },
3685 Spec {
3686 name: "FT.ALIASUPDATE",
3687 arity: 3,
3688 flags: SEARCH_WRITE_OOM,
3689 first_key: 0,
3690 last_key: 0,
3691 step: 0,
3692 keys: &[],
3693 acl: AC_SEARCH,
3694 since: "1.0.0",
3695 complexity: "O(1)",
3696 summary: "Move an alias to another index, adding it when it was not there.",
3697 group: "search",
3698 },
3699 Spec {
3700 name: "FT.ALIASLIST",
3701 arity: 2,
3702 flags: SEARCH_READ,
3703 first_key: 0,
3704 last_key: 0,
3705 step: 0,
3706 keys: &[],
3707 acl: AC_SEARCH,
3708 since: "8.10.0",
3709 complexity: "O(N) with N the aliases pointing at the index",
3710 summary: "The aliases pointing at one index.",
3711 group: "search",
3712 },
3713 Spec {
3714 name: "FT.SEARCH",
3715 arity: -3,
3716 flags: SEARCH_READ,
3717 first_key: 0,
3718 last_key: 0,
3719 step: 0,
3720 keys: &[],
3721 acl: AC_SEARCH,
3722 since: "1.0.0",
3723 complexity: "O(N) with N the documents the query matches",
3724 summary: "The documents a query answers, with their fields.",
3725 group: "search",
3726 },
3727 Spec {
3728 name: "FT.AGGREGATE",
3729 arity: -3,
3730 flags: SEARCH_READ,
3731 first_key: 0,
3732 last_key: 0,
3733 step: 0,
3734 keys: &[],
3735 acl: AC_SEARCH,
3736 since: "1.1.0",
3737 complexity: "O(N) with N the documents the query matches",
3738 summary: "The properties a query answers, run through a pipeline.",
3739 group: "search",
3740 },
3741 Spec {
3742 name: "FT.HYBRID",
3743 arity: -7,
3744 flags: SEARCH_READ,
3745 first_key: 0,
3746 last_key: 0,
3747 step: 0,
3748 keys: &[],
3749 acl: AC_SEARCH,
3750 since: "8.4.0",
3751 complexity: "O(N) with N the documents either branch matches",
3752 summary: "A text query and a vector query over one index, folded into one ranking.",
3753 group: "search",
3754 },
3755 Spec {
3756 name: "FT.PROFILE",
3757 arity: -5,
3758 flags: SEARCH_READ,
3759 first_key: 0,
3760 last_key: 0,
3761 step: 0,
3762 keys: &[],
3763 acl: AC_SEARCH_READ,
3764 since: "2.2.0",
3765 complexity: "O(N) with N the documents the query matches",
3766 summary: "A search or an aggregation with the working shown.",
3767 group: "search",
3768 },
3769 Spec {
3770 name: "FT.CURSOR",
3771 arity: -2,
3772 flags: SEARCH_READ,
3773 first_key: 0,
3774 last_key: 0,
3775 step: 0,
3776 keys: &[],
3777 acl: AC_SEARCH,
3778 since: "1.1.0",
3779 complexity: "O(1)",
3780 summary: "The next chunk of an answer a cursor was left open on.",
3781 group: "search",
3782 },
3783 Spec {
3784 name: "FT.EXPLAIN",
3785 arity: -3,
3786 flags: SEARCH_READ,
3787 first_key: 0,
3788 last_key: 0,
3789 step: 0,
3790 keys: &[],
3791 acl: AC_SEARCH,
3792 since: "1.0.0",
3793 complexity: "O(1)",
3794 summary: "The tree a query parses into, as text.",
3795 group: "search",
3796 },
3797 Spec {
3798 name: "FT.EXPLAINCLI",
3799 arity: -3,
3800 flags: SEARCH_READ,
3801 first_key: 0,
3802 last_key: 0,
3803 step: 0,
3804 keys: &[],
3805 acl: AC_SEARCH,
3806 since: "1.0.0",
3807 complexity: "O(1)",
3808 summary: "The tree a query parses into, one line per reply element.",
3809 group: "search",
3810 },
3811 Spec {
3812 name: "FT.TAGVALS",
3813 arity: 3,
3814 flags: SEARCH_READ,
3815 first_key: 0,
3816 last_key: 0,
3817 step: 0,
3818 keys: &[],
3819 acl: AC_SEARCH_TAGS,
3820 since: "1.0.0",
3821 complexity: "O(N)",
3822 summary: "Every distinct value a tag field holds.",
3823 group: "search",
3824 },
3825 Spec {
3826 name: "FT.DICTADD",
3827 arity: -3,
3828 flags: SEARCH_WRITE_OOM,
3829 first_key: 0,
3830 last_key: 0,
3831 step: 0,
3832 keys: &[],
3833 acl: AC_SEARCH,
3834 since: "1.4.0",
3835 complexity: "O(1)",
3836 summary: "Put terms into a dictionary, making it if it is not there.",
3837 group: "search",
3838 },
3839 Spec {
3840 name: "FT.DICTDEL",
3841 arity: -3,
3842 flags: SEARCH_WRITE,
3843 first_key: 0,
3844 last_key: 0,
3845 step: 0,
3846 keys: &[],
3847 acl: AC_SEARCH,
3848 since: "1.4.0",
3849 complexity: "O(1)",
3850 summary: "Take terms back out of a dictionary.",
3851 group: "search",
3852 },
3853 Spec {
3854 name: "FT.DICTDUMP",
3855 arity: 2,
3856 flags: SEARCH_READ,
3857 first_key: 0,
3858 last_key: 0,
3859 step: 0,
3860 keys: &[],
3861 acl: AC_SEARCH,
3862 since: "1.4.0",
3863 complexity: "O(N)",
3864 summary: "Every term in a dictionary.",
3865 group: "search",
3866 },
3867 Spec {
3868 name: "FT.SYNUPDATE",
3869 arity: -4,
3870 flags: SEARCH_WRITE_OOM,
3871 first_key: 0,
3872 last_key: 0,
3873 step: 0,
3874 keys: &[],
3875 acl: AC_SEARCH,
3876 since: "1.2.0",
3877 complexity: "O(1)",
3878 summary: "Put terms in a synonym group.",
3879 group: "search",
3880 },
3881 Spec {
3882 name: "FT.SYNDUMP",
3883 arity: 2,
3884 flags: SEARCH_READ,
3885 first_key: 0,
3886 last_key: 0,
3887 step: 0,
3888 keys: &[],
3889 acl: AC_SEARCH,
3890 since: "1.2.0",
3891 complexity: "O(1)",
3892 summary: "Every term an index treats as a synonym, and the groups it is in.",
3893 group: "search",
3894 },
3895 Spec {
3896 name: "FT.SPELLCHECK",
3897 arity: -3,
3898 flags: SEARCH_READ,
3899 first_key: 0,
3900 last_key: 0,
3901 step: 0,
3902 keys: &[],
3903 acl: AC_SEARCH,
3904 since: "1.4.0",
3905 complexity: "O(1)",
3906 summary: "Suggestions for the words in a query the index does not hold.",
3907 group: "search",
3908 },
3909 Spec {
3910 name: "FT.ADD",
3911 arity: -1,
3912 flags: SEARCH_WRITE_OOM,
3913 first_key: 2,
3914 last_key: 2,
3915 step: 1,
3916 keys: &[RW_ACCESS_UPDATE_AT2],
3917 acl: AC_SEARCH_WRITE,
3918 since: "1.0.0",
3919 complexity: "O(N) with N the tokens in the document",
3920 summary: "Write a hash and record what the index should think it is worth.",
3921 group: "search",
3922 },
3923 Spec {
3924 name: "FT.SAFEADD",
3925 arity: -1,
3926 flags: SEARCH_WRITE_OOM,
3927 first_key: 2,
3928 last_key: 2,
3929 step: 1,
3930 keys: &[RW_ACCESS_UPDATE_AT2],
3931 acl: AC_SEARCH_WRITE,
3932 since: "1.0.0",
3933 complexity: "O(N) with N the tokens in the document",
3934 summary: "The same write, under the name a cluster client used to send.",
3935 group: "search",
3936 },
3937 Spec {
3938 name: "FT.GET",
3939 arity: -1,
3940 flags: SEARCH_READ,
3941 first_key: 2,
3942 last_key: 2,
3943 step: 1,
3944 keys: &[RO_ACCESS_AT2],
3945 acl: AC_SEARCH_READ,
3946 since: "1.0.0",
3947 complexity: "O(1)",
3948 summary: "The hash under a key, when the index is holding it.",
3949 group: "search",
3950 },
3951 Spec {
3952 name: "FT.MGET",
3953 arity: -1,
3954 flags: SEARCH_READ,
3955 first_key: 0,
3956 last_key: 0,
3957 step: 0,
3958 keys: &[],
3959 acl: AC_SEARCH_READ,
3960 since: "1.0.0",
3961 complexity: "O(N) with N the keys asked about",
3962 summary: "The same, for as many keys as were named.",
3963 group: "search",
3964 },
3965 Spec {
3966 name: "FT.DEL",
3967 arity: -1,
3968 flags: SEARCH_WRITE,
3969 first_key: 2,
3970 last_key: 2,
3971 step: 1,
3972 keys: &[RW_ACCESS_UPDATE_AT2],
3973 acl: AC_SEARCH_WRITE,
3974 since: "1.0.0",
3975 complexity: "O(1)",
3976 summary: "Delete a key, with an index name in front of it.",
3977 group: "search",
3978 },
3979 Spec {
3980 name: "FT.SUGADD",
3981 arity: -4,
3982 flags: SEARCH_WRITE_OOM,
3983 first_key: 1,
3984 last_key: 1,
3985 step: 1,
3986 keys: &[RW_ACCESS_UPDATE_AT1],
3987 acl: AC_SEARCH_WRITE,
3988 since: "1.0.0",
3989 complexity: "O(1)",
3990 summary: "Put a suggestion in a dictionary, or change the one that is there.",
3991 group: "search",
3992 },
3993 Spec {
3994 name: "FT.SUGGET",
3995 arity: -3,
3996 flags: SEARCH_READ,
3997 first_key: 1,
3998 last_key: 1,
3999 step: 1,
4000 keys: &[RO_ACCESS_AT1],
4001 acl: AC_SEARCH_READ,
4002 since: "1.0.0",
4003 complexity: "O(N) with N the suggestions the prefix reaches",
4004 summary: "The best suggestions starting with a prefix.",
4005 group: "search",
4006 },
4007 Spec {
4008 name: "FT.SUGDEL",
4009 arity: 3,
4010 flags: SEARCH_WRITE,
4011 first_key: 1,
4012 last_key: 1,
4013 step: 1,
4014 keys: &[RW_ACCESS_UPDATE_AT1],
4015 acl: AC_SEARCH_WRITE,
4016 since: "1.0.0",
4017 complexity: "O(1)",
4018 summary: "Take a suggestion out of a dictionary.",
4019 group: "search",
4020 },
4021 Spec {
4022 name: "FT.SUGLEN",
4023 arity: 2,
4024 flags: SEARCH_READ,
4025 first_key: 1,
4026 last_key: 1,
4027 step: 1,
4028 keys: &[RO_ACCESS_AT1],
4029 acl: AC_SEARCH_READ,
4030 since: "1.0.0",
4031 complexity: "O(1)",
4032 summary: "How many suggestions a dictionary holds.",
4033 group: "search",
4034 },
4035 Spec {
4037 name: "bf.reserve",
4038 arity: -4,
4039 flags: BLOOM_WRITE,
4040 first_key: 1,
4041 last_key: 1,
4042 step: 1,
4043 keys: &[RW_ACCESS_UPDATE_AT1],
4044 acl: AC_BLOOM_WRITE_FAST,
4045 since: "1.0.0",
4046 complexity: "O(1)",
4047 summary: "Make an empty filter with a given capacity and error rate.",
4048 group: "bloom",
4049 },
4050 Spec {
4051 name: "bf.add",
4052 arity: 3,
4053 flags: BLOOM_WRITE,
4054 first_key: 1,
4055 last_key: 1,
4056 step: 1,
4057 keys: &[RW_ACCESS_UPDATE_AT1],
4058 acl: AC_BLOOM_WRITE,
4059 since: "1.0.0",
4060 complexity: "O(K) with K the number of hash functions",
4061 summary: "Add an item, making the filter if the key is free.",
4062 group: "bloom",
4063 },
4064 Spec {
4065 name: "bf.madd",
4066 arity: -3,
4067 flags: BLOOM_WRITE,
4068 first_key: 1,
4069 last_key: 1,
4070 step: 1,
4071 keys: &[RW_ACCESS_UPDATE_AT1],
4072 acl: AC_BLOOM_WRITE,
4073 since: "1.0.0",
4074 complexity: "O(N * K) with N the number of items",
4075 summary: "Add several items, making the filter if the key is free.",
4076 group: "bloom",
4077 },
4078 Spec {
4079 name: "bf.insert",
4080 arity: -4,
4081 flags: BLOOM_WRITE,
4082 first_key: 1,
4083 last_key: 1,
4084 step: 1,
4085 keys: &[RW_ACCESS_UPDATE_AT1],
4086 acl: AC_BLOOM_WRITE,
4087 since: "1.0.0",
4088 complexity: "O(N * K) with N the number of items",
4089 summary: "Add several items to a filter described in the same command.",
4090 group: "bloom",
4091 },
4092 Spec {
4093 name: "bf.exists",
4094 arity: 3,
4095 flags: BLOOM_READ,
4096 first_key: 1,
4097 last_key: 1,
4098 step: 1,
4099 keys: &[RO_ACCESS_AT1],
4100 acl: AC_BLOOM_READ,
4101 since: "1.0.0",
4102 complexity: "O(K) with K the number of hash functions",
4103 summary: "Whether an item is probably in the filter.",
4104 group: "bloom",
4105 },
4106 Spec {
4107 name: "bf.mexists",
4108 arity: -3,
4109 flags: BLOOM_READ,
4110 first_key: 1,
4111 last_key: 1,
4112 step: 1,
4113 keys: &[RO_ACCESS_AT1],
4114 acl: AC_BLOOM_READ,
4115 since: "1.0.0",
4116 complexity: "O(N * K) with N the number of items",
4117 summary: "Whether each of several items is probably in the filter.",
4118 group: "bloom",
4119 },
4120 Spec {
4121 name: "bf.scandump",
4122 arity: 3,
4123 flags: BLOOM_READ,
4124 first_key: 1,
4125 last_key: 1,
4126 step: 1,
4127 keys: &[RO_ACCESS_AT1],
4128 acl: AC_BLOOM_READ,
4129 since: "1.0.0",
4130 complexity: "O(N) with N the size of the chunk",
4131 summary: "One chunk of the filter, to be replayed into BF.LOADCHUNK.",
4132 group: "bloom",
4133 },
4134 Spec {
4135 name: "bf.loadchunk",
4136 arity: 4,
4137 flags: BLOOM_WRITE,
4138 first_key: 1,
4139 last_key: 1,
4140 step: 1,
4141 keys: &[RW_ACCESS_UPDATE_AT1],
4142 acl: AC_BLOOM_WRITE,
4143 since: "1.0.0",
4144 complexity: "O(N) with N the size of the chunk",
4145 summary: "Put back a chunk that BF.SCANDUMP handed out.",
4146 group: "bloom",
4147 },
4148 Spec {
4149 name: "bf.info",
4150 arity: -2,
4151 flags: BLOOM_READ,
4152 first_key: 1,
4153 last_key: 1,
4154 step: 1,
4155 keys: &[RO_ACCESS_AT1],
4156 acl: AC_BLOOM_READ_FAST,
4157 since: "1.0.0",
4158 complexity: "O(1)",
4159 summary: "The shape of the filter, or one field of it.",
4160 group: "bloom",
4161 },
4162 Spec {
4163 name: "bf.card",
4164 arity: 2,
4165 flags: BLOOM_READ,
4166 first_key: 1,
4167 last_key: 1,
4168 step: 1,
4169 keys: &[RO_ACCESS_AT1],
4170 acl: AC_BLOOM_READ_FAST,
4171 since: "2.4.4",
4172 complexity: "O(1)",
4173 summary: "How many items were added to the filter.",
4174 group: "bloom",
4175 },
4176 Spec {
4177 name: "bf.debug",
4178 arity: 2,
4179 flags: BLOOM_READ,
4180 first_key: 1,
4181 last_key: 1,
4182 step: 1,
4183 keys: &[RO_ACCESS_AT1],
4184 acl: AC_BLOOM_READ,
4185 since: "1.0.0",
4186 complexity: "O(1)",
4187 summary: "The chain and a line for each of its links.",
4188 group: "bloom",
4189 },
4190 Spec {
4192 name: "cf.reserve",
4193 arity: -3,
4194 flags: CUCKOO_WRITE,
4195 first_key: 1,
4196 last_key: 1,
4197 step: 1,
4198 keys: &[RW_ACCESS_UPDATE_AT1],
4199 acl: AC_CUCKOO_WRITE_FAST,
4200 since: "1.0.0",
4201 complexity: "O(1)",
4202 summary: "Make an empty filter with a given capacity.",
4203 group: "cuckoo",
4204 },
4205 Spec {
4206 name: "cf.add",
4207 arity: 3,
4208 flags: CUCKOO_WRITE,
4209 first_key: 1,
4210 last_key: 1,
4211 step: 1,
4212 keys: &[RW_ACCESS_UPDATE_AT1],
4213 acl: AC_CUCKOO_WRITE,
4214 since: "1.0.0",
4215 complexity: "O(1) amortised, O(N) when the chain has to grow",
4216 summary: "Add an item, making the filter if the key is free.",
4217 group: "cuckoo",
4218 },
4219 Spec {
4220 name: "cf.addnx",
4221 arity: 3,
4222 flags: CUCKOO_WRITE,
4223 first_key: 1,
4224 last_key: 1,
4225 step: 1,
4226 keys: &[RW_ACCESS_UPDATE_AT1],
4227 acl: AC_CUCKOO_WRITE,
4228 since: "1.0.0",
4229 complexity: "O(1) amortised, O(N) when the chain has to grow",
4230 summary: "Add an item unless the filter already has it.",
4231 group: "cuckoo",
4232 },
4233 Spec {
4234 name: "cf.insert",
4235 arity: -4,
4236 flags: CUCKOO_WRITE,
4237 first_key: 1,
4238 last_key: 1,
4239 step: 1,
4240 keys: &[RW_ACCESS_UPDATE_AT1],
4241 acl: AC_CUCKOO_WRITE,
4242 since: "1.0.0",
4243 complexity: "O(N) with N the number of items",
4244 summary: "Add several items to a filter described in the same command.",
4245 group: "cuckoo",
4246 },
4247 Spec {
4248 name: "cf.insertnx",
4249 arity: -4,
4250 flags: CUCKOO_WRITE,
4251 first_key: 1,
4252 last_key: 1,
4253 step: 1,
4254 keys: &[RW_ACCESS_UPDATE_AT1],
4255 acl: AC_CUCKOO_WRITE,
4256 since: "1.0.0",
4257 complexity: "O(N) with N the number of items",
4258 summary: "Add several items the filter does not already have.",
4259 group: "cuckoo",
4260 },
4261 Spec {
4262 name: "cf.exists",
4263 arity: 3,
4264 flags: CUCKOO_READ,
4265 first_key: 1,
4266 last_key: 1,
4267 step: 1,
4268 keys: &[RO_ACCESS_AT1],
4269 acl: AC_CUCKOO_READ,
4270 since: "1.0.0",
4271 complexity: "O(1)",
4272 summary: "Whether an item is probably in the filter.",
4273 group: "cuckoo",
4274 },
4275 Spec {
4276 name: "cf.mexists",
4277 arity: -3,
4278 flags: CUCKOO_READ,
4279 first_key: 1,
4280 last_key: 1,
4281 step: 1,
4282 keys: &[RO_ACCESS_AT1],
4283 acl: AC_CUCKOO_READ,
4284 since: "1.0.0",
4285 complexity: "O(N) with N the number of items",
4286 summary: "Whether each of several items is probably in the filter.",
4287 group: "cuckoo",
4288 },
4289 Spec {
4290 name: "cf.count",
4291 arity: 3,
4292 flags: CUCKOO_READ,
4293 first_key: 1,
4294 last_key: 1,
4295 step: 1,
4296 keys: &[RO_ACCESS_AT1],
4297 acl: AC_CUCKOO_READ,
4298 since: "1.0.0",
4299 complexity: "O(1)",
4300 summary: "How many copies of an item the filter thinks it has.",
4301 group: "cuckoo",
4302 },
4303 Spec {
4304 name: "cf.del",
4305 arity: 3,
4306 flags: CUCKOO_DELETE,
4307 first_key: 1,
4308 last_key: 1,
4309 step: 1,
4310 keys: &[RW_ACCESS_UPDATE_AT1],
4311 acl: AC_CUCKOO_WRITE,
4312 since: "1.0.0",
4313 complexity: "O(1)",
4314 summary: "Take one copy of an item out of the filter.",
4315 group: "cuckoo",
4316 },
4317 Spec {
4318 name: "cf.scandump",
4319 arity: 3,
4320 flags: CUCKOO_READ,
4321 first_key: 1,
4322 last_key: 1,
4323 step: 1,
4324 keys: &[RO_ACCESS_AT1],
4325 acl: AC_CUCKOO_READ,
4326 since: "1.0.0",
4327 complexity: "O(N) with N the size of the chunk",
4328 summary: "One chunk of the filter, to be replayed into CF.LOADCHUNK.",
4329 group: "cuckoo",
4330 },
4331 Spec {
4332 name: "cf.loadchunk",
4333 arity: 4,
4334 flags: CUCKOO_WRITE,
4335 first_key: 1,
4336 last_key: 1,
4337 step: 1,
4338 keys: &[RW_ACCESS_UPDATE_AT1],
4339 acl: AC_CUCKOO_WRITE,
4340 since: "1.0.0",
4341 complexity: "O(N) with N the size of the chunk",
4342 summary: "Put back a chunk that CF.SCANDUMP handed out.",
4343 group: "cuckoo",
4344 },
4345 Spec {
4346 name: "cf.info",
4347 arity: 2,
4348 flags: CUCKOO_READ,
4349 first_key: 1,
4350 last_key: 1,
4351 step: 1,
4352 keys: &[RO_ACCESS_AT1],
4353 acl: AC_CUCKOO_READ_FAST,
4354 since: "1.0.0",
4355 complexity: "O(1)",
4356 summary: "The shape of the chain.",
4357 group: "cuckoo",
4358 },
4359 Spec {
4360 name: "cf.debug",
4361 arity: 2,
4362 flags: CUCKOO_READ,
4363 first_key: 1,
4364 last_key: 1,
4365 step: 1,
4366 keys: &[RO_ACCESS_AT1],
4367 acl: AC_CUCKOO_READ,
4368 since: "1.0.0",
4369 complexity: "O(1)",
4370 summary: "The chain's geometry on one line.",
4371 group: "cuckoo",
4372 },
4373 Spec {
4374 name: "cf.compact",
4375 arity: -1,
4376 flags: CUCKOO_READ,
4377 first_key: 1,
4378 last_key: 1,
4379 step: 1,
4380 keys: &[RO_ACCESS_AT1],
4381 acl: AC_CUCKOO_READ,
4382 since: "1.0.0",
4383 complexity: "O(N) with N the number of items in the newer filters",
4384 summary: "Pull the newer filters down into the older ones.",
4385 group: "cuckoo",
4386 },
4387 Spec {
4389 name: "cms.initbydim",
4390 arity: 4,
4391 flags: CMS_WRITE,
4392 first_key: 1,
4393 last_key: 1,
4394 step: 1,
4395 keys: &[RW_ACCESS_UPDATE_AT1],
4396 acl: AC_CMS_WRITE_FAST,
4397 since: "2.0.0",
4398 complexity: "O(1)",
4399 summary: "Make an empty sketch of a given width and depth.",
4400 group: "cms",
4401 },
4402 Spec {
4403 name: "cms.initbyprob",
4404 arity: 4,
4405 flags: CMS_WRITE,
4406 first_key: 1,
4407 last_key: 1,
4408 step: 1,
4409 keys: &[RW_ACCESS_UPDATE_AT1],
4410 acl: AC_CMS_WRITE_FAST,
4411 since: "2.0.0",
4412 complexity: "O(1)",
4413 summary: "Make an empty sketch wide enough for a stated tolerance.",
4414 group: "cms",
4415 },
4416 Spec {
4417 name: "cms.incrby",
4418 arity: -4,
4419 flags: CMS_WRITE,
4420 first_key: 1,
4421 last_key: 1,
4422 step: 1,
4423 keys: &[RW_ACCESS_UPDATE_AT1],
4424 acl: AC_CMS_WRITE,
4425 since: "2.0.0",
4426 complexity: "O(N) with N the number of items",
4427 summary: "Add to the count of one or more items.",
4428 group: "cms",
4429 },
4430 Spec {
4431 name: "cms.query",
4432 arity: -3,
4433 flags: CMS_READ,
4434 first_key: 1,
4435 last_key: 1,
4436 step: 1,
4437 keys: &[RO_ACCESS_AT1],
4438 acl: AC_CMS_READ,
4439 since: "2.0.0",
4440 complexity: "O(N) with N the number of items",
4441 summary: "How many times the sketch has seen each item.",
4442 group: "cms",
4443 },
4444 Spec {
4445 name: "cms.merge",
4446 arity: -4,
4447 flags: CMS_WRITE,
4448 first_key: 1,
4449 last_key: 1,
4450 step: 1,
4451 keys: &[RW_ACCESS_UPDATE_AT1],
4452 acl: AC_CMS_WRITE,
4453 since: "2.0.0",
4454 complexity: "O(N * M) with N the sources and M the counters in one",
4455 summary: "Replace a sketch with the weighted sum of others.",
4456 group: "cms",
4457 },
4458 Spec {
4459 name: "cms.info",
4460 arity: 2,
4461 flags: CMS_READ,
4462 first_key: 1,
4463 last_key: 1,
4464 step: 1,
4465 keys: &[RO_ACCESS_AT1],
4466 acl: AC_CMS_READ_FAST,
4467 since: "2.0.0",
4468 complexity: "O(1)",
4469 summary: "The width, the depth and everything ever added.",
4470 group: "cms",
4471 },
4472 Spec {
4474 name: "topk.reserve",
4475 arity: -3,
4476 flags: TOPK_WRITE,
4477 first_key: 1,
4478 last_key: 1,
4479 step: 1,
4480 keys: &[RW_ACCESS_UPDATE_AT1],
4481 acl: AC_TOPK_WRITE_FAST,
4482 since: "2.0.0",
4483 complexity: "O(1)",
4484 summary: "Make an empty sketch that keeps the k commonest items.",
4485 group: "topk",
4486 },
4487 Spec {
4488 name: "topk.add",
4489 arity: -3,
4490 flags: TOPK_WRITE,
4491 first_key: 1,
4492 last_key: 1,
4493 step: 1,
4494 keys: &[RW_ACCESS_UPDATE_AT1],
4495 acl: AC_TOPK_WRITE,
4496 since: "2.0.0",
4497 complexity: "O(N * K) with N the items and K the depth",
4498 summary: "Count one occurrence of each item.",
4499 group: "topk",
4500 },
4501 Spec {
4502 name: "topk.incrby",
4503 arity: -4,
4504 flags: TOPK_WRITE,
4505 first_key: 1,
4506 last_key: 1,
4507 step: 1,
4508 keys: &[RW_ACCESS_UPDATE_AT1],
4509 acl: AC_TOPK_WRITE,
4510 since: "2.0.0",
4511 complexity: "O(N * K) with N the items and K the depth",
4512 summary: "Count a stated number of occurrences of each item.",
4513 group: "topk",
4514 },
4515 Spec {
4516 name: "topk.query",
4517 arity: -3,
4518 flags: TOPK_READ,
4519 first_key: 1,
4520 last_key: 1,
4521 step: 1,
4522 keys: &[RO_ACCESS_AT1],
4523 acl: AC_TOPK_READ,
4524 since: "2.0.0",
4525 complexity: "O(N * K) with N the items and K the kept count",
4526 summary: "Whether each item is one of the ones being kept.",
4527 group: "topk",
4528 },
4529 Spec {
4530 name: "topk.count",
4531 arity: -3,
4532 flags: TOPK_READ,
4533 first_key: 1,
4534 last_key: 1,
4535 step: 1,
4536 keys: &[RO_ACCESS_AT1],
4537 acl: AC_TOPK_READ,
4538 since: "2.0.0",
4539 complexity: "O(N * K) with N the items and K the depth",
4540 summary: "How many times the sketch thinks it has seen each item.",
4541 group: "topk",
4542 },
4543 Spec {
4544 name: "topk.list",
4545 arity: -2,
4546 flags: TOPK_READ,
4547 first_key: 1,
4548 last_key: 1,
4549 step: 1,
4550 keys: &[RO_ACCESS_AT1],
4551 acl: AC_TOPK_READ,
4552 since: "2.0.0",
4553 complexity: "O(K log K) with K the kept count",
4554 summary: "The kept items, heaviest first.",
4555 group: "topk",
4556 },
4557 Spec {
4558 name: "topk.info",
4559 arity: 2,
4560 flags: TOPK_READ,
4561 first_key: 1,
4562 last_key: 1,
4563 step: 1,
4564 keys: &[RO_ACCESS_AT1],
4565 acl: AC_TOPK_READ_FAST,
4566 since: "2.0.0",
4567 complexity: "O(1)",
4568 summary: "The four numbers the sketch was made with.",
4569 group: "topk",
4570 },
4571 Spec {
4573 name: "tdigest.create",
4574 arity: -2,
4575 flags: TDIGEST_WRITE,
4576 first_key: 1,
4577 last_key: 1,
4578 step: 1,
4579 keys: &[RW_ACCESS_UPDATE_AT1],
4580 acl: AC_TDIGEST_WRITE_FAST,
4581 since: "2.4.0",
4582 complexity: "O(1)",
4583 summary: "Make an empty digest of a stated compression.",
4584 group: "tdigest",
4585 },
4586 Spec {
4587 name: "tdigest.reset",
4588 arity: 2,
4589 flags: TDIGEST_WRITE,
4590 first_key: 1,
4591 last_key: 1,
4592 step: 1,
4593 keys: &[RW_ACCESS_UPDATE_AT1],
4594 acl: AC_TDIGEST_WRITE_FAST,
4595 since: "2.4.0",
4596 complexity: "O(1)",
4597 summary: "Throw away every sample and keep the shape.",
4598 group: "tdigest",
4599 },
4600 Spec {
4601 name: "tdigest.add",
4602 arity: -3,
4603 flags: TDIGEST_WRITE,
4604 first_key: 1,
4605 last_key: 1,
4606 step: 1,
4607 keys: &[RW_ACCESS_UPDATE_AT1],
4608 acl: AC_TDIGEST_WRITE,
4609 since: "2.4.0",
4610 complexity: "O(N) with N the number of samples",
4611 summary: "Add samples of weight one each.",
4612 group: "tdigest",
4613 },
4614 Spec {
4615 name: "tdigest.merge",
4616 arity: -4,
4617 flags: TDIGEST_MERGE,
4618 first_key: 1,
4619 last_key: 1,
4620 step: 1,
4621 keys: &[RW_ACCESS_UPDATE_AT1, RO_ACCESS_AT2_COUNTED],
4622 acl: AC_TDIGEST_WRITE,
4623 since: "2.4.0",
4624 complexity: "O(N) with N the number of centroids in the inputs",
4625 summary: "Fold digests together into one.",
4626 group: "tdigest",
4627 },
4628 Spec {
4629 name: "tdigest.min",
4630 arity: 2,
4631 flags: TDIGEST_READ,
4632 first_key: 1,
4633 last_key: 1,
4634 step: 1,
4635 keys: &[RO_ACCESS_AT1],
4636 acl: AC_TDIGEST_READ_FAST,
4637 since: "2.4.0",
4638 complexity: "O(1)",
4639 summary: "The smallest sample ever added.",
4640 group: "tdigest",
4641 },
4642 Spec {
4643 name: "tdigest.max",
4644 arity: 2,
4645 flags: TDIGEST_READ,
4646 first_key: 1,
4647 last_key: 1,
4648 step: 1,
4649 keys: &[RO_ACCESS_AT1],
4650 acl: AC_TDIGEST_READ_FAST,
4651 since: "2.4.0",
4652 complexity: "O(1)",
4653 summary: "The largest sample ever added.",
4654 group: "tdigest",
4655 },
4656 Spec {
4657 name: "tdigest.quantile",
4658 arity: -3,
4659 flags: TDIGEST_READ,
4660 first_key: 1,
4661 last_key: 1,
4662 step: 1,
4663 keys: &[RO_ACCESS_AT1],
4664 acl: AC_TDIGEST_READ_FAST,
4665 since: "2.4.0",
4666 complexity: "O(N) with N the number of centroids",
4667 summary: "The value each fraction of the samples falls under.",
4668 group: "tdigest",
4669 },
4670 Spec {
4671 name: "tdigest.cdf",
4672 arity: -3,
4673 flags: TDIGEST_READ,
4674 first_key: 1,
4675 last_key: 1,
4676 step: 1,
4677 keys: &[RO_ACCESS_AT1],
4678 acl: AC_TDIGEST_READ_FAST,
4679 since: "2.4.0",
4680 complexity: "O(N) with N the number of centroids",
4681 summary: "The fraction of the samples at or below each value.",
4682 group: "tdigest",
4683 },
4684 Spec {
4685 name: "tdigest.trimmed_mean",
4686 arity: 4,
4687 flags: TDIGEST_READ,
4688 first_key: 1,
4689 last_key: 1,
4690 step: 1,
4691 keys: &[RO_ACCESS_AT1],
4692 acl: AC_TDIGEST_READ,
4693 since: "2.4.0",
4694 complexity: "O(N) with N the number of centroids",
4695 summary: "The mean of what is left once both tails are cut.",
4696 group: "tdigest",
4697 },
4698 Spec {
4699 name: "tdigest.rank",
4700 arity: -3,
4701 flags: TDIGEST_READ,
4702 first_key: 1,
4703 last_key: 1,
4704 step: 1,
4705 keys: &[RO_ACCESS_AT1],
4706 acl: AC_TDIGEST_READ_FAST,
4707 since: "2.4.0",
4708 complexity: "O(N) with N the number of centroids",
4709 summary: "How many samples each value is above.",
4710 group: "tdigest",
4711 },
4712 Spec {
4713 name: "tdigest.revrank",
4714 arity: -3,
4715 flags: TDIGEST_READ,
4716 first_key: 1,
4717 last_key: 1,
4718 step: 1,
4719 keys: &[RO_ACCESS_AT1],
4720 acl: AC_TDIGEST_READ_FAST,
4721 since: "2.4.0",
4722 complexity: "O(N) with N the number of centroids",
4723 summary: "How many samples each value is below.",
4724 group: "tdigest",
4725 },
4726 Spec {
4727 name: "tdigest.byrank",
4728 arity: -3,
4729 flags: TDIGEST_READ,
4730 first_key: 1,
4731 last_key: 1,
4732 step: 1,
4733 keys: &[RO_ACCESS_AT1],
4734 acl: AC_TDIGEST_READ_FAST,
4735 since: "2.4.0",
4736 complexity: "O(N) with N the number of centroids",
4737 summary: "The value at each rank counting up from the smallest.",
4738 group: "tdigest",
4739 },
4740 Spec {
4741 name: "tdigest.byrevrank",
4742 arity: -3,
4743 flags: TDIGEST_READ,
4744 first_key: 1,
4745 last_key: 1,
4746 step: 1,
4747 keys: &[RO_ACCESS_AT1],
4748 acl: AC_TDIGEST_READ_FAST,
4749 since: "2.4.0",
4750 complexity: "O(N) with N the number of centroids",
4751 summary: "The value at each rank counting down from the largest.",
4752 group: "tdigest",
4753 },
4754 Spec {
4755 name: "tdigest.info",
4756 arity: 2,
4757 flags: TDIGEST_READ,
4758 first_key: 1,
4759 last_key: 1,
4760 step: 1,
4761 keys: &[RO_ACCESS_AT1],
4762 acl: AC_TDIGEST_READ_FAST,
4763 since: "2.4.0",
4764 complexity: "O(1)",
4765 summary: "The nine numbers the digest keeps about itself.",
4766 group: "tdigest",
4767 },
4768 Spec {
4770 name: "ts.create",
4771 arity: -2,
4772 flags: TS_WRITE,
4773 first_key: 1,
4774 last_key: 1,
4775 step: 1,
4776 keys: &[RW_ACCESS_UPDATE_AT1],
4777 acl: AC_TS_WRITE_FAST,
4778 since: "1.0.0",
4779 complexity: "O(1)",
4780 summary: "Make an empty series and say how it should behave.",
4781 group: "ts",
4782 },
4783 Spec {
4784 name: "ts.alter",
4785 arity: -2,
4786 flags: TS_WRITE,
4787 first_key: 1,
4788 last_key: 1,
4789 step: 1,
4790 keys: &[RW_ACCESS_UPDATE_AT1],
4791 acl: AC_TS_WRITE,
4792 since: "1.0.0",
4793 complexity: "O(N) with N the labels being set",
4794 summary: "Change how a series behaves, leaving what was not named alone.",
4795 group: "ts",
4796 },
4797 Spec {
4798 name: "ts.add",
4799 arity: -4,
4800 flags: TS_WRITE,
4801 first_key: 1,
4802 last_key: 1,
4803 step: 1,
4804 keys: &[RW_ACCESS_UPDATE_AT1],
4805 acl: AC_TS_WRITE,
4806 since: "1.0.0",
4807 complexity: "O(M) with M the samples in the chunk a backfill lands in",
4808 summary: "Put a sample in, making the series if it is not there.",
4809 group: "ts",
4810 },
4811 Spec {
4812 name: "ts.madd",
4813 arity: -4,
4814 flags: TS_WRITE,
4815 first_key: 1,
4816 last_key: -1,
4817 step: 3,
4818 keys: &[RW_ACCESS_UPDATE_AT1_RM1_3_0],
4819 acl: AC_TS_WRITE,
4820 since: "1.0.0",
4821 complexity: "O(N * M) with N the samples given",
4822 summary: "Put a sample in each of several series.",
4823 group: "ts",
4824 },
4825 Spec {
4826 name: "ts.incrby",
4827 arity: -3,
4828 flags: TS_WRITE,
4829 first_key: 1,
4830 last_key: 1,
4831 step: 1,
4832 keys: &[RW_ACCESS_UPDATE_AT1],
4833 acl: AC_TS_WRITE,
4834 since: "1.0.0",
4835 complexity: "O(M) with M the samples in the last chunk",
4836 summary: "Add to the newest value and store the answer.",
4837 group: "ts",
4838 },
4839 Spec {
4840 name: "ts.decrby",
4841 arity: -3,
4842 flags: TS_WRITE,
4843 first_key: 1,
4844 last_key: 1,
4845 step: 1,
4846 keys: &[RW_ACCESS_UPDATE_AT1],
4847 acl: AC_TS_WRITE,
4848 since: "1.0.0",
4849 complexity: "O(M) with M the samples in the last chunk",
4850 summary: "Take away from the newest value and store the answer.",
4851 group: "ts",
4852 },
4853 Spec {
4854 name: "ts.del",
4855 arity: 4,
4856 flags: TS_DELETE,
4857 first_key: 1,
4858 last_key: 1,
4859 step: 1,
4860 keys: &[RW_ACCESS_UPDATE_AT1],
4861 acl: AC_TS_WRITE,
4862 since: "1.6.0",
4863 complexity: "O(N) with N the samples in the span",
4864 summary: "Take out every sample between two timestamps.",
4865 group: "ts",
4866 },
4867 Spec {
4868 name: "ts.get",
4869 arity: -2,
4870 flags: TS_READ,
4871 first_key: 1,
4872 last_key: 1,
4873 step: 1,
4874 keys: &[RO_ACCESS_AT1],
4875 acl: AC_TS_READ_FAST,
4876 since: "1.0.0",
4877 complexity: "O(1)",
4878 summary: "The newest sample in a series.",
4879 group: "ts",
4880 },
4881 Spec {
4882 name: "ts.info",
4883 arity: -2,
4884 flags: TS_READ,
4885 first_key: 1,
4886 last_key: 1,
4887 step: 1,
4888 keys: &[RO_ACCESS_AT1],
4889 acl: AC_TS_READ_FAST,
4890 since: "1.0.0",
4891 complexity: "O(1)",
4892 summary: "The fourteen things a series says about itself.",
4893 group: "ts",
4894 },
4895 Spec {
4896 name: "ts.range",
4897 arity: -4,
4898 flags: TS_READ,
4899 first_key: 1,
4900 last_key: 1,
4901 step: 1,
4902 keys: &[RO_ACCESS_AT1],
4903 acl: AC_TS_READ,
4904 since: "1.0.0",
4905 complexity: "O(n/m+k) with n the samples, m the chunk size and k the samples in the span",
4906 summary: "The samples in a span, oldest first, in buckets if asked for.",
4907 group: "ts",
4908 },
4909 Spec {
4910 name: "ts.revrange",
4911 arity: -4,
4912 flags: TS_READ,
4913 first_key: 1,
4914 last_key: 1,
4915 step: 1,
4916 keys: &[RO_ACCESS_AT1],
4917 acl: AC_TS_READ,
4918 since: "1.4.0",
4919 complexity: "O(n/m+k) with n the samples, m the chunk size and k the samples in the span",
4920 summary: "The same span, newest first.",
4921 group: "ts",
4922 },
4923 Spec {
4924 name: "ts.nrange",
4925 arity: -5,
4926 flags: TS_READ_MOVABLE,
4927 first_key: 0,
4928 last_key: 0,
4929 step: 0,
4930 keys: &[RO_ACCESS_AT1_COUNTED],
4931 acl: AC_TS_READ,
4932 since: "8.10.0",
4933 complexity: "O(n/m+k) with n the samples, m the chunk size and k the samples in the span",
4934 summary: "The same span out of several series, lined up on the timestamps.",
4935 group: "ts",
4936 },
4937 Spec {
4938 name: "ts.nrevrange",
4939 arity: -5,
4940 flags: TS_READ_MOVABLE,
4941 first_key: 0,
4942 last_key: 0,
4943 step: 0,
4944 keys: &[RO_ACCESS_AT1_COUNTED],
4945 acl: AC_TS_READ,
4946 since: "8.10.0",
4947 complexity: "O(n/m+k) with n the samples, m the chunk size and k the samples in the span",
4948 summary: "The same rows, newest first.",
4949 group: "ts",
4950 },
4951 Spec {
4952 name: "ts.read",
4953 arity: -3,
4954 flags: TS_READ,
4955 first_key: 1,
4956 last_key: 1,
4957 step: 1,
4958 keys: &[RO_ACCESS_AT1],
4959 acl: AC_TS_READ,
4960 since: "8.10.0",
4961 complexity: "O(n/m+k) with n the samples, m the chunk size and k the samples answered",
4962 summary: "Every sample from a timestamp to the end of the series.",
4963 group: "ts",
4964 },
4965 Spec {
4966 name: "ts.queryindex",
4967 arity: -2,
4968 flags: TS_READ,
4969 first_key: 0,
4970 last_key: 0,
4971 step: 0,
4972 keys: &[],
4973 acl: AC_TS_READ,
4974 since: "1.0.0",
4975 complexity: "O(n) with n the series in the keyspace",
4976 summary: "The series a filter list takes, by key name.",
4977 group: "ts",
4978 },
4979 Spec {
4980 name: "ts.querylabels",
4981 arity: -2,
4982 flags: TS_READ,
4983 first_key: 0,
4984 last_key: 0,
4985 step: 0,
4986 keys: &[],
4987 acl: AC_TS_READ,
4988 since: "8.10.0",
4989 complexity: "O(n) with n the series in the keyspace",
4990 summary: "The label names in use, or the values one of them takes.",
4991 group: "ts",
4992 },
4993 Spec {
4994 name: "ts.mget",
4995 arity: -3,
4996 flags: TS_READ,
4997 first_key: 0,
4998 last_key: 0,
4999 step: 0,
5000 keys: &[],
5001 acl: AC_TS_READ,
5002 since: "1.0.0",
5003 complexity: "O(n) with n the series in the keyspace",
5004 summary: "The newest sample of every series a filter list takes.",
5005 group: "ts",
5006 },
5007 Spec {
5008 name: "ts.mrange",
5009 arity: -4,
5010 flags: TS_READ,
5011 first_key: 0,
5012 last_key: 0,
5013 step: 0,
5014 keys: &[],
5015 acl: AC_TS_READ,
5016 since: "1.0.0",
5017 complexity: "O(n) with n the series in the keyspace",
5018 summary: "A span out of every series a filter list takes, oldest first.",
5019 group: "ts",
5020 },
5021 Spec {
5022 name: "ts.mrevrange",
5023 arity: -4,
5024 flags: TS_READ,
5025 first_key: 0,
5026 last_key: 0,
5027 step: 0,
5028 keys: &[],
5029 acl: AC_TS_READ,
5030 since: "1.4.0",
5031 complexity: "O(n) with n the series in the keyspace",
5032 summary: "The same spans, newest first.",
5033 group: "ts",
5034 },
5035 Spec {
5036 name: "ts.createrule",
5037 arity: -5,
5038 flags: TS_RULE,
5039 first_key: 1,
5040 last_key: 2,
5041 step: 1,
5042 keys: &[RW_ACCESS_UPDATE_AT1_R1_1_0],
5043 acl: AC_TS_WRITE,
5044 since: "1.0.0",
5045 complexity: "O(1)",
5046 summary: "Fold one series into another as it is written to.",
5047 group: "ts",
5048 },
5049 Spec {
5050 name: "ts.deleterule",
5051 arity: 3,
5052 flags: TS_DELETE,
5053 first_key: 1,
5054 last_key: 2,
5055 step: 1,
5056 keys: &[RW_ACCESS_UPDATE_AT1_R1_1_0],
5057 acl: AC_TS_WRITE_FAST,
5058 since: "1.0.0",
5059 complexity: "O(1)",
5060 summary: "Stop folding one series into another.",
5061 group: "ts",
5062 },
5063 Spec {
5065 name: "arset",
5066 arity: -4,
5067 flags: WRITE_FAST_OOM,
5068 first_key: 1,
5069 last_key: 1,
5070 step: 1,
5071 keys: &[RW_UPDATE_AT1],
5072 acl: AC_ARRAY_WRITE_FAST,
5073 since: "8.8.0",
5074 complexity: "O(N) with N the number of values",
5075 summary: "Write values into consecutive positions from an index.",
5076 group: "array",
5077 },
5078 Spec {
5079 name: "armset",
5080 arity: -4,
5081 flags: WRITE_FAST_OOM,
5082 first_key: 1,
5083 last_key: 1,
5084 step: 1,
5085 keys: &[RW_UPDATE_AT1],
5086 acl: AC_ARRAY_WRITE_FAST,
5087 since: "8.8.0",
5088 complexity: "O(N) with N the number of pairs",
5089 summary: "Write index and value pairs, which need not be neighbours.",
5090 group: "array",
5091 },
5092 Spec {
5093 name: "arget",
5094 arity: 3,
5095 flags: READ_FAST,
5096 first_key: 1,
5097 last_key: 1,
5098 step: 1,
5099 keys: &[RO_ACCESS_AT1],
5100 acl: AC_ARRAY_READ_FAST,
5101 since: "8.8.0",
5102 complexity: "O(1)",
5103 summary: "The value at one index, or a null if nothing is there.",
5104 group: "array",
5105 },
5106 Spec {
5107 name: "armget",
5108 arity: -3,
5109 flags: READ_FAST,
5110 first_key: 1,
5111 last_key: 1,
5112 step: 1,
5113 keys: &[RO_ACCESS_AT1],
5114 acl: AC_ARRAY_READ_FAST,
5115 since: "8.8.0",
5116 complexity: "O(N) with N the number of indices",
5117 summary: "The values at the indices named, in the order named.",
5118 group: "array",
5119 },
5120 Spec {
5121 name: "argetrange",
5122 arity: 4,
5123 flags: READ_SLOW,
5124 first_key: 1,
5125 last_key: 1,
5126 step: 1,
5127 keys: &[RO_ACCESS_AT1],
5128 acl: AC_ARRAY_READ_SLOW,
5129 since: "8.8.0",
5130 complexity: "O(N) with N the length of the range",
5131 summary: "One reply per position between two indices, holes included.",
5132 group: "array",
5133 },
5134 Spec {
5135 name: "arlen",
5136 arity: 2,
5137 flags: READ_FAST,
5138 first_key: 1,
5139 last_key: 1,
5140 step: 1,
5141 keys: &[RO_ACCESS_AT1],
5142 acl: AC_ARRAY_READ_FAST,
5143 since: "8.8.0",
5144 complexity: "O(1)",
5145 summary: "The highest populated index plus one.",
5146 group: "array",
5147 },
5148 Spec {
5149 name: "arcount",
5150 arity: 2,
5151 flags: READ_FAST,
5152 first_key: 1,
5153 last_key: 1,
5154 step: 1,
5155 keys: &[RO_ACCESS_AT1],
5156 acl: AC_ARRAY_READ_FAST,
5157 since: "8.8.0",
5158 complexity: "O(1)",
5159 summary: "How many indices hold something.",
5160 group: "array",
5161 },
5162 Spec {
5163 name: "ardel",
5164 arity: -3,
5165 flags: WRITE_FAST,
5166 first_key: 1,
5167 last_key: 1,
5168 step: 1,
5169 keys: &[RW_DELETE_AT1],
5170 acl: AC_ARRAY_WRITE_FAST,
5171 since: "8.8.0",
5172 complexity: "O(N) with N the number of indices",
5173 summary: "Empty the indices named and say how many held something.",
5174 group: "array",
5175 },
5176 Spec {
5177 name: "ardelrange",
5178 arity: -4,
5179 flags: WRITE_SLOW,
5180 first_key: 1,
5181 last_key: 1,
5182 step: 1,
5183 keys: &[RW_DELETE_AT1],
5184 acl: AC_ARRAY_WRITE_SLOW,
5185 since: "8.8.0",
5186 complexity: "O(N) with N the elements touched, not the span asked for",
5187 summary: "Empty one or more ranges of indices.",
5188 group: "array",
5189 },
5190 Spec {
5191 name: "arinsert",
5192 arity: -3,
5193 flags: WRITE_FAST_OOM,
5194 first_key: 1,
5195 last_key: 1,
5196 step: 1,
5197 keys: &[RW_UPDATE_AT1],
5198 acl: AC_ARRAY_WRITE_FAST,
5199 since: "8.8.0",
5200 complexity: "O(N) with N the number of values",
5201 summary: "Append values at the insert cursor.",
5202 group: "array",
5203 },
5204 Spec {
5205 name: "arring",
5206 arity: -4,
5207 flags: WRITE_OOM,
5208 first_key: 1,
5209 last_key: 1,
5210 step: 1,
5211 keys: &[RW_UPDATE_AT1],
5212 acl: AC_ARRAY_WRITE_SLOW,
5213 since: "8.8.0",
5214 complexity: "O(N) with N the values, plus the ring size when it changes",
5215 summary: "Append values into a ring of the given size.",
5216 group: "array",
5217 },
5218 Spec {
5219 name: "arnext",
5220 arity: 2,
5221 flags: READ_FAST,
5222 first_key: 1,
5223 last_key: 1,
5224 step: 1,
5225 keys: &[RO_ACCESS_AT1],
5226 acl: AC_ARRAY_READ_FAST,
5227 since: "8.8.0",
5228 complexity: "O(1)",
5229 summary: "The index the next append would write to.",
5230 group: "array",
5231 },
5232 Spec {
5233 name: "arseek",
5234 arity: 3,
5235 flags: WRITE_FAST,
5236 first_key: 1,
5237 last_key: 1,
5238 step: 1,
5239 keys: &[RW_UPDATE_AT1],
5240 acl: AC_ARRAY_WRITE_FAST,
5241 since: "8.8.0",
5242 complexity: "O(1)",
5243 summary: "Point the insert cursor at an index.",
5244 group: "array",
5245 },
5246 Spec {
5247 name: "arlastitems",
5248 arity: -3,
5249 flags: READ_SLOW,
5250 first_key: 1,
5251 last_key: 1,
5252 step: 1,
5253 keys: &[RO_ACCESS_AT1],
5254 acl: AC_ARRAY_READ_SLOW,
5255 since: "8.8.0",
5256 complexity: "O(N) with N the count asked for",
5257 summary: "The newest positions from the insert cursor, holes included.",
5258 group: "array",
5259 },
5260 Spec {
5261 name: "arscan",
5262 arity: -4,
5263 flags: READ_SLOW,
5264 first_key: 1,
5265 last_key: 1,
5266 step: 1,
5267 keys: &[RO_ACCESS_AT1],
5268 acl: AC_ARRAY_READ_SLOW,
5269 since: "8.8.0",
5270 complexity: "O(N) with N the elements found, not the span asked for",
5271 summary: "Index and value pairs for what a range holds, skipping holes.",
5272 group: "array",
5273 },
5274 Spec {
5275 name: "argrep",
5276 arity: -6,
5277 flags: READ_SLOW,
5278 first_key: 1,
5279 last_key: 1,
5280 step: 1,
5281 keys: &[RO_ACCESS_AT1],
5282 acl: AC_ARRAY_READ_SLOW,
5283 since: "8.8.0",
5284 complexity: "O(P * C) with P the positions visited and C the cost of the predicates on one element",
5285 summary: "The indexes in a range whose elements answer a set of textual predicates.",
5286 group: "array",
5287 },
5288 Spec {
5289 name: "arop",
5290 arity: -5,
5291 flags: READ_SLOW,
5292 first_key: 1,
5293 last_key: 1,
5294 step: 1,
5295 keys: &[RO_ACCESS_AT1],
5296 acl: AC_ARRAY_READ_SLOW,
5297 since: "8.8.0",
5298 complexity: "O(N) with N the elements found, not the span asked for",
5299 summary: "One number out of a range, added up or compared or counted.",
5300 group: "array",
5301 },
5302 Spec {
5303 name: "arinfo",
5304 arity: -2,
5305 flags: READ_SLOW,
5306 first_key: 1,
5307 last_key: 1,
5308 step: 1,
5309 keys: &[RO_ACCESS_AT1],
5310 acl: AC_ARRAY_READ_SLOW,
5311 since: "8.8.0",
5312 complexity: "O(1), or O(N) with N the slices when FULL is given",
5313 summary: "The shape of the array, and what its slices look like.",
5314 group: "array",
5315 },
5316 Spec {
5318 name: "xadd",
5319 arity: -5,
5320 flags: WRITE_FAST_OOM,
5321 first_key: 1,
5322 last_key: 1,
5323 step: 1,
5324 keys: &[RW_UPDATE_AT1_TRIMMING],
5325 acl: AC_STREAM_WRITE_FAST,
5326 since: "5.0.0",
5327 complexity: "O(1) for the append, plus what a trim removes.",
5328 summary: "Append an entry and answer with the ID it got.",
5329 group: "stream",
5330 },
5331 Spec {
5332 name: "xlen",
5333 arity: 2,
5334 flags: READ_FAST,
5335 first_key: 1,
5336 last_key: 1,
5337 step: 1,
5338 keys: &[RO_AT1],
5339 acl: AC_STREAM_READ_FAST,
5340 since: "5.0.0",
5341 complexity: "O(1)",
5342 summary: "How many entries the stream holds.",
5343 group: "stream",
5344 },
5345 Spec {
5346 name: "xdel",
5347 arity: -3,
5348 flags: WRITE_FAST,
5349 first_key: 1,
5350 last_key: 1,
5351 step: 1,
5352 keys: &[RW_DELETE_AT1],
5353 acl: AC_STREAM_WRITE_FAST,
5354 since: "5.0.0",
5355 complexity: "O(1) per ID.",
5356 summary: "Remove entries by ID and say how many were there.",
5357 group: "stream",
5358 },
5359 Spec {
5360 name: "xdelex",
5361 arity: -5,
5362 flags: WRITE_FAST,
5363 first_key: 1,
5364 last_key: 1,
5365 step: 1,
5366 keys: &[RW_DELETE_AT1],
5367 acl: AC_STREAM_WRITE_FAST,
5368 since: "8.2.0",
5369 complexity: "O(1) per ID.",
5370 summary: "Remove entries by ID, saying what to do about the groups.",
5371 group: "stream",
5372 },
5373 Spec {
5374 name: "xackdel",
5375 arity: -6,
5376 flags: WRITE_FAST,
5377 first_key: 1,
5378 last_key: 1,
5379 step: 1,
5380 keys: &[RW_UPDATE_DELETE_AT1],
5381 acl: AC_STREAM_WRITE_FAST,
5382 since: "8.2.0",
5383 complexity: "O(1) per ID.",
5384 summary: "Acknowledge entries for a group and remove them.",
5385 group: "stream",
5386 },
5387 Spec {
5388 name: "xnack",
5389 arity: -7,
5390 flags: WRITE_FAST,
5391 first_key: 1,
5392 last_key: 1,
5393 step: 1,
5394 keys: &[RW_UPDATE_AT1],
5395 acl: AC_STREAM_WRITE_FAST,
5396 since: "8.8.0",
5397 complexity: "O(1) per ID.",
5398 summary: "Give entries back to the group for somebody else to claim.",
5399 group: "stream",
5400 },
5401 Spec {
5402 name: "xtrim",
5403 arity: -4,
5404 flags: WRITE_SLOW,
5405 first_key: 1,
5406 last_key: 1,
5407 step: 1,
5408 keys: &[RW_DELETE_AT1],
5409 acl: AC_STREAM_WRITE_SLOW,
5410 since: "5.0.0",
5411 complexity: "O(N) in the entries removed.",
5412 summary: "Cut the stream down to a length or a minimum ID.",
5413 group: "stream",
5414 },
5415 Spec {
5416 name: "xrange",
5417 arity: -4,
5418 flags: READ_SLOW,
5419 first_key: 1,
5420 last_key: 1,
5421 step: 1,
5422 keys: &[RO_ACCESS_AT1],
5423 acl: AC_STREAM_READ_SLOW,
5424 since: "5.0.0",
5425 complexity: "O(N) in the entries returned.",
5426 summary: "The entries between two IDs, oldest first.",
5427 group: "stream",
5428 },
5429 Spec {
5430 name: "xrevrange",
5431 arity: -4,
5432 flags: READ_SLOW,
5433 first_key: 1,
5434 last_key: 1,
5435 step: 1,
5436 keys: &[RO_ACCESS_AT1],
5437 acl: AC_STREAM_READ_SLOW,
5438 since: "5.0.0",
5439 complexity: "O(N) in the entries returned.",
5440 summary: "The entries between two IDs, newest first.",
5441 group: "stream",
5442 },
5443 Spec {
5444 name: "xread",
5445 arity: -4,
5446 flags: READ_BLOCKING_MOVABLE,
5447 first_key: 0,
5448 last_key: 0,
5449 step: 0,
5450 keys: &[XREAD_STREAMS],
5451 acl: AC_STREAM_BLOCKING_READ,
5452 since: "5.0.0",
5453 complexity: "O(N) in the entries returned.",
5454 summary: "Read from one or more streams, waiting if asked to.",
5455 group: "stream",
5456 },
5457 Spec {
5458 name: "xreadgroup",
5459 arity: -7,
5460 flags: WRITE_BLOCKING_MOVABLE,
5461 first_key: 0,
5462 last_key: 0,
5463 step: 0,
5464 keys: &[XREADGROUP_STREAMS],
5465 acl: AC_STREAM_BLOCKING_WRITE,
5466 since: "5.0.0",
5467 complexity: "O(N) in the entries returned.",
5468 summary: "Read as part of a consumer group, waiting if asked to.",
5469 group: "stream",
5470 },
5471 Spec {
5472 name: "xack",
5473 arity: -4,
5474 flags: WRITE_FAST,
5475 first_key: 1,
5476 last_key: 1,
5477 step: 1,
5478 keys: &[RW_UPDATE_AT1],
5479 acl: AC_STREAM_WRITE_FAST,
5480 since: "5.0.0",
5481 complexity: "O(1) per ID.",
5482 summary: "Drop entries from a group's pending list.",
5483 group: "stream",
5484 },
5485 Spec {
5486 name: "xsetid",
5487 arity: -3,
5488 flags: WRITE_FAST_OOM,
5489 first_key: 1,
5490 last_key: 1,
5491 step: 1,
5492 keys: &[RW_UPDATE_AT1],
5493 acl: AC_STREAM_WRITE_FAST,
5494 since: "5.0.0",
5495 complexity: "O(1)",
5496 summary: "Set the last ID, the entries added and the max deleted ID.",
5497 group: "stream",
5498 },
5499 Spec {
5500 name: "xgroup",
5501 arity: -2,
5502 flags: &[],
5503 first_key: 0,
5504 last_key: 0,
5505 step: 0,
5506 keys: &[],
5507 acl: AC_STREAM_CONTAINER,
5508 since: "5.0.0",
5509 complexity: "O(1) for all subcommands except DESTROY, which frees the group's pending list.",
5510 summary: "Make, move and unmake consumer groups.",
5511 group: "stream",
5512 },
5513 Spec {
5514 name: "xinfo",
5515 arity: -2,
5516 flags: &[],
5517 first_key: 0,
5518 last_key: 0,
5519 step: 0,
5520 keys: &[],
5521 acl: AC_STREAM_CONTAINER,
5522 since: "5.0.0",
5523 complexity: "O(1), or O(N) with N the entries and pending entries shown when FULL is given.",
5524 summary: "What a stream, its groups and its consumers look like.",
5525 group: "stream",
5526 },
5527 Spec {
5528 name: "xpending",
5529 arity: -3,
5530 flags: READ_SLOW,
5531 first_key: 1,
5532 last_key: 1,
5533 step: 1,
5534 keys: &[RO_ACCESS_AT1],
5535 acl: AC_STREAM_READ_SLOW,
5536 since: "5.0.0",
5537 complexity: "O(1) for the summary, O(N) in the entries returned for the list.",
5538 summary: "What a group has handed out and not had acknowledged.",
5539 group: "stream",
5540 },
5541 Spec {
5542 name: "xclaim",
5543 arity: -6,
5544 flags: WRITE_FAST,
5545 first_key: 1,
5546 last_key: 1,
5547 step: 1,
5548 keys: &[RW_UPDATE_AT1],
5549 acl: AC_STREAM_WRITE_FAST,
5550 since: "5.0.0",
5551 complexity: "O(1) per ID.",
5552 summary: "Move named pending entries to another consumer.",
5553 group: "stream",
5554 },
5555 Spec {
5556 name: "xautoclaim",
5557 arity: -6,
5558 flags: WRITE_FAST,
5559 first_key: 1,
5560 last_key: 1,
5561 step: 1,
5562 keys: &[RW_DELETE_AT1],
5563 acl: AC_STREAM_WRITE_FAST,
5564 since: "6.2.0",
5565 complexity: "O(1) per entry claimed, plus what it skips getting there.",
5566 summary: "Sweep a group's pending list and take what has gone idle.",
5567 group: "stream",
5568 },
5569 Spec {
5571 name: "del",
5572 arity: -2,
5573 flags: &["write"],
5574 first_key: 1,
5575 last_key: -1,
5576 step: 1,
5577 keys: &[RM_DELETE_AT1_RM1_1_0],
5578 acl: AC_KEY_WRITE_SLOW,
5579 since: "1.0.0",
5580 complexity: "O(N) in the number of keys.",
5581 summary: "Delete keys and say how many were there.",
5582 group: "keyspace",
5583 },
5584 Spec {
5585 name: "unlink",
5586 arity: -2,
5587 flags: &["write", "fast"],
5588 first_key: 1,
5589 last_key: -1,
5590 step: 1,
5591 keys: &[RM_DELETE_AT1_RM1_1_0],
5592 acl: AC_KEY_WRITE_FAST,
5593 since: "4.0.0",
5594 complexity: "O(1) per key, since the freeing is not on this thread.",
5595 summary: "Delete keys and free them out of the way of the reply.",
5596 group: "keyspace",
5597 },
5598 Spec {
5599 name: "exists",
5600 arity: -2,
5601 flags: READ_FAST,
5602 first_key: 1,
5603 last_key: -1,
5604 step: 1,
5605 keys: &[RO_AT1_RM1_1_0],
5606 acl: AC_KEY_READ,
5607 since: "1.0.0",
5608 complexity: "O(N) in the number of keys.",
5609 summary: "Count how many of these keys are there, naming one twice counting twice.",
5610 group: "keyspace",
5611 },
5612 Spec {
5613 name: "type",
5614 arity: 2,
5615 flags: READ_FAST,
5616 first_key: 1,
5617 last_key: 1,
5618 step: 1,
5619 keys: &[RO_AT1],
5620 acl: AC_KEY_READ,
5621 since: "1.0.0",
5622 complexity: "O(1)",
5623 summary: "What kind of value is under a key, or none.",
5624 group: "keyspace",
5625 },
5626 Spec {
5627 name: "touch",
5628 arity: -2,
5629 flags: READ_FAST,
5630 first_key: 1,
5631 last_key: -1,
5632 step: 1,
5633 keys: &[RO_AT1_RM1_1_0],
5634 acl: AC_KEY_READ,
5635 since: "3.2.1",
5636 complexity: "O(N) in the number of keys.",
5637 summary: "Count how many of these keys are there, and move them up the eviction order.",
5638 group: "keyspace",
5639 },
5640 Spec {
5644 name: "scan",
5645 arity: -2,
5646 flags: &["readonly"],
5647 first_key: 0,
5648 last_key: 0,
5649 step: 0,
5650 keys: &[],
5651 acl: AC_KEY_READ_SLOW,
5652 since: "2.8.0",
5653 complexity: "O(1) a call, O(N) for a whole iteration",
5654 summary: "Walk part of the keyspace and say where to carry on from.",
5655 group: "keyspace",
5656 },
5657 Spec {
5658 name: "keys",
5659 arity: 2,
5660 flags: &["readonly"],
5661 first_key: 0,
5662 last_key: 0,
5663 step: 0,
5664 keys: &[],
5665 acl: AC_KEY_READ_ALL,
5666 since: "1.0.0",
5667 complexity: "O(N) in the number of keys.",
5668 summary: "Every key matching a pattern, in one reply.",
5669 group: "keyspace",
5670 },
5671 Spec {
5672 name: "randomkey",
5673 arity: 1,
5674 flags: &["readonly"],
5675 first_key: 0,
5676 last_key: 0,
5677 step: 0,
5678 keys: &[],
5679 acl: AC_KEY_READ_SLOW,
5680 since: "1.0.0",
5681 complexity: "O(1)",
5682 summary: "One key from the database, chosen at random.",
5683 group: "keyspace",
5684 },
5685 Spec {
5688 name: "rename",
5689 arity: 3,
5690 flags: &["write"],
5691 first_key: 1,
5692 last_key: 2,
5693 step: 1,
5694 keys: &[RW_ACCESS_DELETE_AT1, OW_UPDATE_AT2],
5695 acl: AC_KEY_WRITE_SLOW,
5696 since: "1.0.0",
5697 complexity: "O(1)",
5698 summary: "Move a key to another name, over whatever was there.",
5699 group: "keyspace",
5700 },
5701 Spec {
5702 name: "renamenx",
5703 arity: 3,
5704 flags: WRITE_FAST,
5705 first_key: 1,
5706 last_key: 2,
5707 step: 1,
5708 keys: &[RW_ACCESS_DELETE_AT1, OW_INSERT_AT2],
5709 acl: AC_KEY_WRITE_FAST,
5710 since: "1.0.0",
5711 complexity: "O(1)",
5712 summary: "Move a key to another name, but only if that name is free.",
5713 group: "keyspace",
5714 },
5715 Spec {
5718 name: "copy",
5719 arity: -3,
5720 flags: &["write", "denyoom"],
5721 first_key: 1,
5722 last_key: 2,
5723 step: 1,
5724 keys: &[RO_ACCESS_AT1, OW_UPDATE_AT2],
5725 acl: AC_KEY_WRITE_SLOW,
5726 since: "6.2.0",
5727 complexity: "O(N) in the size of the value.",
5728 summary: "Copy a value to another key, in this database or another one.",
5729 group: "keyspace",
5730 },
5731 Spec {
5736 name: "move",
5737 arity: 3,
5738 flags: WRITE_FAST,
5739 first_key: 1,
5740 last_key: 1,
5741 step: 1,
5742 keys: &[RW_ACCESS_UPDATE_AT1],
5743 acl: AC_KEY_WRITE_FAST,
5744 since: "1.0.0",
5745 complexity: "O(1)",
5746 summary: "Move a key to another database, if it is not already there.",
5747 group: "keyspace",
5748 },
5749 Spec {
5752 name: "wait",
5753 arity: 3,
5754 flags: &["blocking"],
5755 first_key: 0,
5756 last_key: 0,
5757 step: 0,
5758 keys: &[],
5759 acl: AC_WAIT,
5760 since: "3.0.0",
5761 complexity: "O(1)",
5762 summary: "Wait for this connection's writes to reach a number of replicas.",
5763 group: "keyspace",
5764 },
5765 Spec {
5766 name: "waitaof",
5767 arity: 4,
5768 flags: &["blocking"],
5769 first_key: 0,
5770 last_key: 0,
5771 step: 0,
5772 keys: &[],
5773 acl: AC_WAIT,
5774 since: "7.2.0",
5775 complexity: "O(1)",
5776 summary: "Wait for this connection's writes to reach the append only files.",
5777 group: "keyspace",
5778 },
5779 Spec {
5783 name: "dump",
5784 arity: 2,
5785 flags: READ_SLOW,
5786 first_key: 1,
5787 last_key: 1,
5788 step: 1,
5789 keys: &[RO_ACCESS_AT1],
5790 acl: AC_KEY_READ_SLOW,
5791 since: "2.6.0",
5792 complexity: "O(1) to find the key, then O(N) in the size of the value.",
5793 summary: "Serialize a value into a payload another server can load.",
5794 group: "keyspace",
5795 },
5796 Spec {
5797 name: "restore",
5798 arity: -4,
5799 flags: &["write", "denyoom"],
5800 first_key: 1,
5801 last_key: 1,
5802 step: 1,
5803 keys: &[OW_UPDATE_AT1],
5804 acl: AC_RESTORE,
5805 since: "2.6.0",
5806 complexity: "O(1) to find the key, then O(N) in the size of the payload.",
5807 summary: "Create a key from a payload produced by DUMP.",
5808 group: "keyspace",
5809 },
5810 Spec {
5815 name: "migrate",
5816 arity: -6,
5817 flags: MIGRATE_FLAGS,
5818 first_key: 3,
5819 last_key: 3,
5820 step: 1,
5821 keys: &[RW_ACCESS_DELETE_AT3, MIGRATE_KEYS],
5822 acl: AC_RESTORE,
5823 since: "2.6.0",
5824 complexity: "A DUMP and a DEL here, a RESTORE there, and the bytes in between.",
5825 summary: "Move a key to another server.",
5826 group: "keyspace",
5827 },
5828 Spec {
5834 name: "sort",
5835 arity: -2,
5836 flags: WRITE_MOVABLE,
5837 first_key: 1,
5838 last_key: 1,
5839 step: 1,
5840 keys: &[RO_ACCESS_AT1, SORT_BY_AND_GET, SORT_STORE],
5841 acl: AC_SORT_WRITE,
5842 since: "1.0.0",
5843 complexity: "O(N+M*log(M)) with N elements and M returned.",
5844 summary: "Sort a list, set or sorted set, optionally into another key.",
5845 group: "keyspace",
5846 },
5847 Spec {
5848 name: "sort_ro",
5849 arity: -2,
5850 flags: READ_MOVABLE,
5851 first_key: 1,
5852 last_key: 1,
5853 step: 1,
5854 keys: &[RO_ACCESS_AT1, SORT_BY_AND_GET],
5855 acl: AC_SORT_READ,
5856 since: "7.0.0",
5857 complexity: "O(N+M*log(M)) with N elements and M returned.",
5858 summary: "Sort a list, set or sorted set, without the STORE option.",
5859 group: "keyspace",
5860 },
5861 Spec {
5864 name: "expire",
5865 arity: -3,
5866 flags: WRITE_FAST,
5867 first_key: 1,
5868 last_key: 1,
5869 step: 1,
5870 keys: &[RW_UPDATE_AT1],
5871 acl: AC_KEY_WRITE_FAST,
5872 since: "1.0.0",
5873 complexity: "O(1)",
5874 summary: "Put a deadline on a key, counted in seconds from now.",
5875 group: "keyspace",
5876 },
5877 Spec {
5878 name: "pexpire",
5879 arity: -3,
5880 flags: WRITE_FAST,
5881 first_key: 1,
5882 last_key: 1,
5883 step: 1,
5884 keys: &[RW_UPDATE_AT1],
5885 acl: AC_KEY_WRITE_FAST,
5886 since: "2.6.0",
5887 complexity: "O(1)",
5888 summary: "Put a deadline on a key, counted in milliseconds from now.",
5889 group: "keyspace",
5890 },
5891 Spec {
5892 name: "expireat",
5893 arity: -3,
5894 flags: WRITE_FAST,
5895 first_key: 1,
5896 last_key: 1,
5897 step: 1,
5898 keys: &[RW_UPDATE_AT1],
5899 acl: AC_KEY_WRITE_FAST,
5900 since: "1.2.0",
5901 complexity: "O(1)",
5902 summary: "Put a deadline on a key, as a unix time in seconds.",
5903 group: "keyspace",
5904 },
5905 Spec {
5906 name: "pexpireat",
5907 arity: -3,
5908 flags: WRITE_FAST,
5909 first_key: 1,
5910 last_key: 1,
5911 step: 1,
5912 keys: &[RW_UPDATE_AT1],
5913 acl: AC_KEY_WRITE_FAST,
5914 since: "2.6.0",
5915 complexity: "O(1)",
5916 summary: "Put a deadline on a key, as a unix time in milliseconds.",
5917 group: "keyspace",
5918 },
5919 Spec {
5920 name: "persist",
5921 arity: 2,
5922 flags: WRITE_FAST,
5923 first_key: 1,
5924 last_key: 1,
5925 step: 1,
5926 keys: &[RW_UPDATE_AT1],
5927 acl: AC_KEY_WRITE_FAST,
5928 since: "2.2.0",
5929 complexity: "O(1)",
5930 summary: "Take a key's deadline off, so it stops being temporary.",
5931 group: "keyspace",
5932 },
5933 Spec {
5934 name: "ttl",
5935 arity: 2,
5936 flags: READ_FAST,
5937 first_key: 1,
5938 last_key: 1,
5939 step: 1,
5940 keys: &[RO_ACCESS_AT1],
5941 acl: AC_KEY_READ,
5942 since: "1.0.0",
5943 complexity: "O(1)",
5944 summary: "How many seconds a key has left, -1 with no deadline, -2 if gone.",
5945 group: "keyspace",
5946 },
5947 Spec {
5948 name: "pttl",
5949 arity: 2,
5950 flags: READ_FAST,
5951 first_key: 1,
5952 last_key: 1,
5953 step: 1,
5954 keys: &[RO_ACCESS_AT1],
5955 acl: AC_KEY_READ,
5956 since: "2.6.0",
5957 complexity: "O(1)",
5958 summary: "How many milliseconds a key has left, -1 with no deadline, -2 if gone.",
5959 group: "keyspace",
5960 },
5961 Spec {
5962 name: "expiretime",
5963 arity: 2,
5964 flags: READ_FAST,
5965 first_key: 1,
5966 last_key: 1,
5967 step: 1,
5968 keys: &[RO_ACCESS_AT1],
5969 acl: AC_KEY_READ,
5970 since: "7.0.0",
5971 complexity: "O(1)",
5972 summary: "When a key falls due, as a unix time in seconds.",
5973 group: "keyspace",
5974 },
5975 Spec {
5976 name: "pexpiretime",
5977 arity: 2,
5978 flags: READ_FAST,
5979 first_key: 1,
5980 last_key: 1,
5981 step: 1,
5982 keys: &[RO_ACCESS_AT1],
5983 acl: AC_KEY_READ,
5984 since: "7.0.0",
5985 complexity: "O(1)",
5986 summary: "When a key falls due, as a unix time in milliseconds.",
5987 group: "keyspace",
5988 },
5989 Spec {
5993 name: "object",
5994 arity: -2,
5995 flags: &[],
5996 first_key: 0,
5997 last_key: 0,
5998 step: 0,
5999 keys: &[],
6000 acl: &["@slow"],
6001 since: "2.2.3",
6002 complexity: "O(1)",
6003 summary: "Look at the machinery under a key rather than at its value.",
6004 group: "keyspace",
6005 },
6006 Spec {
6018 name: "eval",
6019 arity: -3,
6020 flags: &[
6021 "noscript",
6022 "stale",
6023 "skip_monitor",
6024 "no_mandatory_keys",
6025 "movablekeys",
6026 "script_runner",
6027 ],
6028 first_key: 0,
6029 last_key: 0,
6030 step: 0,
6031 keys: &[SCRIPT_KEYS_RW],
6032 acl: &["@slow", "@scripting"],
6033 since: "2.6.0",
6034 complexity: "Whatever the script does.",
6035 summary: "Run a Lua script sent with the command.",
6036 group: "scripting",
6037 },
6038 Spec {
6039 name: "evalsha",
6040 arity: -3,
6041 flags: &[
6042 "noscript",
6043 "stale",
6044 "skip_monitor",
6045 "no_mandatory_keys",
6046 "movablekeys",
6047 "script_runner",
6048 ],
6049 first_key: 0,
6050 last_key: 0,
6051 step: 0,
6052 keys: &[RW_ACCESS_UPDATE_AT2_COUNTED],
6053 acl: &["@slow", "@scripting"],
6054 since: "2.6.0",
6055 complexity: "Whatever the script does.",
6056 summary: "Run a Lua script the cache already holds.",
6057 group: "scripting",
6058 },
6059 Spec {
6060 name: "eval_ro",
6061 arity: -3,
6062 flags: &[
6063 "readonly",
6064 "noscript",
6065 "stale",
6066 "skip_monitor",
6067 "no_mandatory_keys",
6068 "movablekeys",
6069 "script_runner",
6070 ],
6071 first_key: 0,
6072 last_key: 0,
6073 step: 0,
6074 keys: &[SCRIPT_KEYS_RO],
6075 acl: &["@slow", "@scripting"],
6076 since: "7.0.0",
6077 complexity: "Whatever the script does.",
6078 summary: "Run a Lua script that is not allowed to write.",
6079 group: "scripting",
6080 },
6081 Spec {
6082 name: "evalsha_ro",
6083 arity: -3,
6084 flags: &[
6085 "readonly",
6086 "noscript",
6087 "stale",
6088 "skip_monitor",
6089 "no_mandatory_keys",
6090 "movablekeys",
6091 "script_runner",
6092 ],
6093 first_key: 0,
6094 last_key: 0,
6095 step: 0,
6096 keys: &[RO_ACCESS_AT2_COUNTED],
6097 acl: &["@slow", "@scripting"],
6098 since: "7.0.0",
6099 complexity: "Whatever the script does.",
6100 summary: "Run a cached Lua script that is not allowed to write.",
6101 group: "scripting",
6102 },
6103 Spec {
6104 name: "fcall",
6105 arity: -3,
6106 flags: &[
6107 "noscript",
6108 "stale",
6109 "skip_monitor",
6110 "no_mandatory_keys",
6111 "movablekeys",
6112 "script_runner",
6113 ],
6114 first_key: 0,
6115 last_key: 0,
6116 step: 0,
6117 keys: &[SCRIPT_KEYS_RW],
6118 acl: &["@slow", "@scripting"],
6119 since: "7.0.0",
6120 complexity: "Whatever the function does.",
6121 summary: "Run a function out of a loaded library.",
6122 group: "scripting",
6123 },
6124 Spec {
6125 name: "fcall_ro",
6126 arity: -3,
6127 flags: &[
6128 "readonly",
6129 "noscript",
6130 "stale",
6131 "skip_monitor",
6132 "no_mandatory_keys",
6133 "movablekeys",
6134 "script_runner",
6135 ],
6136 first_key: 0,
6137 last_key: 0,
6138 step: 0,
6139 keys: &[SCRIPT_KEYS_RO],
6140 acl: &["@slow", "@scripting"],
6141 since: "7.0.0",
6142 complexity: "Whatever the function does.",
6143 summary: "Run a function that was registered no-writes.",
6144 group: "scripting",
6145 },
6146 Spec {
6149 name: "script",
6150 arity: -2,
6151 flags: &[],
6152 first_key: 0,
6153 last_key: 0,
6154 step: 0,
6155 keys: &[],
6156 acl: &["@slow"],
6157 since: "2.6.0",
6158 complexity: "O(1) for the subcommands that are here.",
6159 summary: "The cache EVALSHA runs scripts out of.",
6160 group: "scripting",
6161 },
6162 Spec {
6163 name: "function",
6164 arity: -2,
6165 flags: &[],
6166 first_key: 0,
6167 last_key: 0,
6168 step: 0,
6169 keys: &[],
6170 acl: &["@slow"],
6171 since: "7.0.0",
6172 complexity: "O(1) for the subcommands that are here.",
6173 summary: "The libraries FCALL runs functions out of.",
6174 group: "scripting",
6175 },
6176 Spec {
6178 name: "ping",
6179 arity: -1,
6180 flags: &["fast"],
6181 first_key: 0,
6182 last_key: 0,
6183 step: 0,
6184 keys: &[],
6185 acl: AC_CONN,
6186 since: "1.0.0",
6187 complexity: "O(1)",
6188 summary: "Ask whether the server is answering.",
6189 group: "connection",
6190 },
6191 Spec {
6192 name: "echo",
6193 arity: 2,
6194 flags: &["loading", "stale", "fast"],
6195 first_key: 0,
6196 last_key: 0,
6197 step: 0,
6198 keys: &[],
6199 acl: AC_CONN,
6200 since: "1.0.0",
6201 complexity: "O(1)",
6202 summary: "Send a string back unchanged.",
6203 group: "connection",
6204 },
6205 Spec {
6211 name: "auth",
6212 arity: -2,
6213 flags: &[
6214 "noscript",
6215 "loading",
6216 "stale",
6217 "fast",
6218 "no_auth",
6219 "allow_busy",
6220 ],
6221 first_key: 0,
6222 last_key: 0,
6223 step: 0,
6224 keys: &[],
6225 acl: AC_CONN,
6226 since: "1.0.0",
6227 complexity: "O(1)",
6228 summary: "Hand over the password this connection is asked for.",
6229 group: "connection",
6230 },
6231 Spec {
6232 name: "hello",
6233 arity: -1,
6234 flags: &[
6235 "noscript",
6236 "loading",
6237 "stale",
6238 "fast",
6239 "no_auth",
6240 "allow_busy",
6241 ],
6242 first_key: 0,
6243 last_key: 0,
6244 step: 0,
6245 keys: &[],
6246 acl: AC_CONN,
6247 since: "6.0.0",
6248 complexity: "O(1)",
6249 summary: "Agree on a protocol version and describe the server.",
6250 group: "connection",
6251 },
6252 Spec {
6253 name: "select",
6254 arity: 2,
6255 flags: &["loading", "stale", "fast"],
6256 first_key: 0,
6257 last_key: 0,
6258 step: 0,
6259 keys: &[],
6260 acl: AC_CONN,
6261 since: "1.0.0",
6262 complexity: "O(1)",
6263 summary: "Choose which database this connection works in.",
6264 group: "connection",
6265 },
6266 Spec {
6267 name: "reset",
6268 arity: 1,
6269 flags: &[
6270 "noscript",
6271 "loading",
6272 "stale",
6273 "fast",
6274 "no_auth",
6275 "allow_busy",
6276 ],
6277 first_key: 0,
6278 last_key: 0,
6279 step: 0,
6280 keys: &[],
6281 acl: AC_CONN,
6282 since: "6.2.0",
6283 complexity: "O(1)",
6284 summary: "Put the connection back the way it was opened.",
6285 group: "connection",
6286 },
6287 Spec {
6288 name: "quit",
6289 arity: -1,
6290 flags: &[
6291 "noscript",
6292 "loading",
6293 "stale",
6294 "fast",
6295 "no_auth",
6296 "allow_busy",
6297 ],
6298 first_key: 0,
6299 last_key: 0,
6300 step: 0,
6301 keys: &[],
6302 acl: AC_CONN,
6303 since: "1.0.0",
6304 complexity: "O(1)",
6305 summary: "Close the connection after the replies already queued.",
6306 group: "connection",
6307 },
6308 Spec {
6315 name: "multi",
6316 arity: 1,
6317 flags: &["noscript", "loading", "stale", "fast", "allow_busy"],
6318 first_key: 0,
6319 last_key: 0,
6320 step: 0,
6321 keys: &[],
6322 acl: AC_TX_FAST,
6323 since: "2.0.0",
6324 complexity: "O(1)",
6325 summary: "Start holding commands instead of running them.",
6326 group: "transactions",
6327 },
6328 Spec {
6329 name: "exec",
6330 arity: 1,
6331 flags: &["noscript", "loading", "stale", "skip_slowlog"],
6332 first_key: 0,
6333 last_key: 0,
6334 step: 0,
6335 keys: &[],
6336 acl: &["@slow", "@transaction"],
6337 since: "1.2.0",
6338 complexity: "Whatever the queued commands cost.",
6339 summary: "Run everything held since MULTI.",
6340 group: "transactions",
6341 },
6342 Spec {
6343 name: "discard",
6344 arity: 1,
6345 flags: &["noscript", "loading", "stale", "fast", "allow_busy"],
6346 first_key: 0,
6347 last_key: 0,
6348 step: 0,
6349 keys: &[],
6350 acl: AC_TX_FAST,
6351 since: "2.0.0",
6352 complexity: "O(N) in the number of commands held.",
6353 summary: "Throw away everything held since MULTI.",
6354 group: "transactions",
6355 },
6356 Spec {
6357 name: "watch",
6358 arity: -2,
6359 flags: &["noscript", "loading", "stale", "fast", "allow_busy"],
6360 first_key: 1,
6361 last_key: -1,
6362 step: 1,
6363 keys: &[RO_AT1_RM1_1_0],
6364 acl: AC_TX_FAST,
6365 since: "2.2.0",
6366 complexity: "O(1) a key.",
6367 summary: "Fail the next EXEC if any of these keys changes.",
6368 group: "transactions",
6369 },
6370 Spec {
6371 name: "unwatch",
6372 arity: 1,
6373 flags: &["noscript", "loading", "stale", "fast", "allow_busy"],
6374 first_key: 0,
6375 last_key: 0,
6376 step: 0,
6377 keys: &[],
6378 acl: AC_TX_FAST,
6379 since: "2.2.0",
6380 complexity: "O(N) in the number of keys watched.",
6381 summary: "Stop watching everything this connection was watching.",
6382 group: "transactions",
6383 },
6384 Spec {
6391 name: "subscribe",
6392 arity: -2,
6393 flags: &["denyoom", "pubsub", "noscript", "loading", "stale"],
6394 first_key: 0,
6395 last_key: 0,
6396 step: 0,
6397 keys: &[],
6398 acl: AC_PUBSUB_SLOW,
6399 since: "2.0.0",
6400 complexity: "O(N) in the number of channels named.",
6401 summary: "Listen on these channels.",
6402 group: "pubsub",
6403 },
6404 Spec {
6405 name: "unsubscribe",
6406 arity: -1,
6407 flags: &["pubsub", "noscript", "loading", "stale"],
6408 first_key: 0,
6409 last_key: 0,
6410 step: 0,
6411 keys: &[],
6412 acl: AC_PUBSUB_SLOW,
6413 since: "2.0.0",
6414 complexity: "O(N) in the number of channels named, or held if none are.",
6415 summary: "Stop listening on these channels, or on all of them.",
6416 group: "pubsub",
6417 },
6418 Spec {
6419 name: "psubscribe",
6420 arity: -2,
6421 flags: &["denyoom", "pubsub", "noscript", "loading", "stale"],
6422 first_key: 0,
6423 last_key: 0,
6424 step: 0,
6425 keys: &[],
6426 acl: AC_PUBSUB_SLOW,
6427 since: "2.0.0",
6428 complexity: "O(N) in the number of patterns named.",
6429 summary: "Listen on every channel matching these patterns.",
6430 group: "pubsub",
6431 },
6432 Spec {
6433 name: "punsubscribe",
6434 arity: -1,
6435 flags: &["pubsub", "noscript", "loading", "stale"],
6436 first_key: 0,
6437 last_key: 0,
6438 step: 0,
6439 keys: &[],
6440 acl: AC_PUBSUB_SLOW,
6441 since: "2.0.0",
6442 complexity: "O(N) in the number of patterns named, or held if none are.",
6443 summary: "Stop listening on these patterns, or on all of them.",
6444 group: "pubsub",
6445 },
6446 Spec {
6447 name: "ssubscribe",
6448 arity: -2,
6449 flags: &["denyoom", "pubsub", "noscript", "loading", "stale"],
6450 first_key: 1,
6451 last_key: -1,
6452 step: 1,
6453 keys: &[NOT_KEY_AT1_RM1_1_0],
6454 acl: AC_PUBSUB_SLOW,
6455 since: "7.0.0",
6456 complexity: "O(N) in the number of shard channels named.",
6457 summary: "Listen on these shard channels.",
6458 group: "pubsub",
6459 },
6460 Spec {
6461 name: "sunsubscribe",
6462 arity: -1,
6463 flags: &["pubsub", "noscript", "loading", "stale"],
6464 first_key: 1,
6465 last_key: -1,
6466 step: 1,
6467 keys: &[NOT_KEY_AT1_RM1_1_0],
6468 acl: AC_PUBSUB_SLOW,
6469 since: "7.0.0",
6470 complexity: "O(N) in the number of shard channels named, or held if none are.",
6471 summary: "Stop listening on these shard channels, or on all of them.",
6472 group: "pubsub",
6473 },
6474 Spec {
6475 name: "publish",
6476 arity: 3,
6477 flags: &["pubsub", "loading", "stale", "fast"],
6478 first_key: 0,
6479 last_key: 0,
6480 step: 0,
6481 keys: &[],
6482 acl: AC_PUBSUB_FAST,
6483 since: "2.0.0",
6484 complexity: "O(N+M) with N the subscribers and M the patterns.",
6485 summary: "Send a message to everybody listening on a channel.",
6486 group: "pubsub",
6487 },
6488 Spec {
6489 name: "spublish",
6490 arity: 3,
6491 flags: &["pubsub", "loading", "stale", "fast"],
6492 first_key: 1,
6493 last_key: 1,
6494 step: 1,
6495 keys: &[NOT_KEY_AT1],
6496 acl: AC_PUBSUB_FAST,
6497 since: "7.0.0",
6498 complexity: "O(N) in the shard channel's subscribers.",
6499 summary: "Send a message to everybody listening on a shard channel.",
6500 group: "pubsub",
6501 },
6502 Spec {
6503 name: "pubsub",
6504 arity: -2,
6505 flags: &[],
6506 first_key: 0,
6507 last_key: 0,
6508 step: 0,
6509 keys: &[],
6510 acl: &["@slow"],
6511 since: "2.8.0",
6512 complexity: "O(N) in the number of channels or patterns on the server.",
6513 summary: "What the server's subscriptions look like from outside.",
6514 group: "pubsub",
6515 },
6516 Spec {
6522 name: "command",
6523 arity: -1,
6524 flags: &["loading", "stale"],
6525 first_key: 0,
6526 last_key: 0,
6527 step: 0,
6528 keys: &[],
6529 acl: &["@slow", "@connection"],
6530 since: "2.8.13",
6531 complexity: "O(N) with N the number of commands",
6532 summary: "What this server can do, in the shape client libraries read.",
6533 group: "server",
6534 },
6535 Spec {
6536 name: "client",
6537 arity: -2,
6538 flags: &[],
6539 first_key: 0,
6540 last_key: 0,
6541 step: 0,
6542 keys: &[],
6543 acl: &["@slow"],
6544 since: "2.4.0",
6545 complexity: "Depends on the subcommand.",
6546 summary: "Ask about or change the connection the command arrived on.",
6547 group: "connection",
6548 },
6549 Spec {
6550 name: "acl",
6551 arity: -2,
6552 flags: &[],
6553 first_key: 0,
6554 last_key: 0,
6555 step: 0,
6556 keys: &[],
6557 acl: &["@slow"],
6558 since: "6.0.0",
6559 complexity: "Depends on subcommand.",
6560 summary: "A container for Access List Control commands.",
6561 group: "server",
6562 },
6563 Spec {
6564 name: "config",
6565 arity: -2,
6566 flags: &[],
6567 first_key: 0,
6568 last_key: 0,
6569 step: 0,
6570 keys: &[],
6571 acl: &["@slow"],
6572 since: "2.0.0",
6573 complexity: "Depends on the subcommand.",
6574 summary: "Read and change the settings a running server exposes.",
6575 group: "server",
6576 },
6577 Spec {
6583 name: "backup",
6584 arity: 2,
6585 flags: &[],
6586 first_key: 0,
6587 last_key: 0,
6588 step: 0,
6589 keys: &[],
6590 acl: &["@slow"],
6591 since: "8.10.0",
6592 complexity: "Depends on subcommand.",
6593 summary: "A container for backup management commands.",
6594 group: "server",
6595 },
6596 Spec {
6597 name: "info",
6598 arity: -1,
6599 flags: &["loading", "stale"],
6600 first_key: 0,
6601 last_key: 0,
6602 step: 0,
6603 keys: &[],
6604 acl: &["@slow", "@dangerous"],
6605 since: "1.0.0",
6606 complexity: "O(1)",
6607 summary: "The server's own numbers, in sections.",
6608 group: "server",
6609 },
6610 Spec {
6611 name: "debug",
6612 arity: -2,
6613 flags: &["admin", "noscript", "loading", "stale"],
6614 first_key: 0,
6615 last_key: 0,
6616 step: 0,
6617 keys: &[],
6618 acl: &["@admin", "@slow", "@dangerous"],
6619 since: "1.0.0",
6620 complexity: "Depends on subcommand.",
6621 summary: "A container for debugging commands.",
6622 group: "server",
6623 },
6624 Spec {
6625 name: "dbsize",
6626 arity: 1,
6627 flags: READ_FAST,
6628 first_key: 0,
6629 last_key: 0,
6630 step: 0,
6631 keys: &[],
6632 acl: AC_KEY_READ,
6633 since: "1.0.0",
6634 complexity: "O(1)",
6635 summary: "How many keys are in the database this connection is on.",
6636 group: "server",
6637 },
6638 Spec {
6639 name: "flushall",
6640 arity: -1,
6641 flags: &["write"],
6642 first_key: 0,
6643 last_key: 0,
6644 step: 0,
6645 keys: &[],
6646 acl: AC_KEY_FLUSH,
6647 since: "1.0.0",
6648 complexity: "O(N) in the number of keys in every database.",
6649 summary: "Empty every database.",
6650 group: "server",
6651 },
6652 Spec {
6653 name: "flushdb",
6654 arity: -1,
6655 flags: &["write"],
6656 first_key: 0,
6657 last_key: 0,
6658 step: 0,
6659 keys: &[],
6660 acl: AC_KEY_FLUSH,
6661 since: "1.0.0",
6662 complexity: "O(N) in the number of keys in this database.",
6663 summary: "Empty the database this connection is on.",
6664 group: "server",
6665 },
6666 Spec {
6670 name: "swapdb",
6671 arity: 3,
6672 flags: WRITE_FAST,
6673 first_key: 0,
6674 last_key: 0,
6675 step: 0,
6676 keys: &[],
6677 acl: AC_SWAPDB,
6678 since: "4.0.0",
6679 complexity: "O(N) in the number of clients watching or blocked on either.",
6680 summary: "Swap two databases, so every client on one sees the other.",
6681 group: "server",
6682 },
6683 Spec {
6687 name: "time",
6688 arity: 1,
6689 flags: &["loading", "stale", "fast"],
6690 first_key: 0,
6691 last_key: 0,
6692 step: 0,
6693 keys: &[],
6694 acl: &["@fast"],
6695 since: "2.6.0",
6696 complexity: "O(1)",
6697 summary: "The server's clock, as seconds and microseconds.",
6698 group: "server",
6699 },
6700 Spec {
6710 name: "save",
6711 arity: 1,
6712 flags: &["admin", "noscript", "no_async_loading", "no_multi"],
6713 first_key: 0,
6714 last_key: 0,
6715 step: 0,
6716 keys: &[],
6717 acl: &["@admin", "@slow", "@dangerous"],
6718 since: "1.0.0",
6719 complexity: "O(N) in the number of keys",
6720 summary: "Write the whole dataset out as an RDB file, and wait for it.",
6721 group: "server",
6722 },
6723 Spec {
6724 name: "bgsave",
6725 arity: -1,
6726 flags: &["admin", "noscript", "no_async_loading"],
6727 first_key: 0,
6728 last_key: 0,
6729 step: 0,
6730 keys: &[],
6731 acl: &["@admin", "@slow", "@dangerous"],
6732 since: "1.0.0",
6733 complexity: "O(N) in the number of keys",
6734 summary: "Write the whole dataset out as an RDB file.",
6735 group: "server",
6736 },
6737 Spec {
6738 name: "bgrewriteaof",
6739 arity: 1,
6740 flags: &["admin", "noscript", "no_async_loading"],
6741 first_key: 0,
6742 last_key: 0,
6743 step: 0,
6744 keys: &[],
6745 acl: &["@admin", "@slow", "@dangerous"],
6746 since: "1.0.0",
6747 complexity: "O(1)",
6748 summary: "Rewrite the append only file, which this server has not got.",
6749 group: "server",
6750 },
6751 Spec {
6752 name: "lastsave",
6753 arity: 1,
6754 flags: &["loading", "stale", "fast"],
6755 first_key: 0,
6756 last_key: 0,
6757 step: 0,
6758 keys: &[],
6759 acl: &["@admin", "@fast", "@dangerous"],
6760 since: "1.0.0",
6761 complexity: "O(1)",
6762 summary: "When the dataset was last written out, in seconds.",
6763 group: "server",
6764 },
6765 Spec {
6766 name: "role",
6767 arity: 1,
6768 flags: &["noscript", "loading", "stale", "fast"],
6769 first_key: 0,
6770 last_key: 0,
6771 step: 0,
6772 keys: &[],
6773 acl: &["@admin", "@fast", "@dangerous"],
6774 since: "2.8.12",
6775 complexity: "O(1)",
6776 summary: "Whether this server is a master or a replica, and of what.",
6777 group: "server",
6778 },
6779 Spec {
6783 name: "monitor",
6784 arity: 1,
6785 flags: &["admin", "noscript", "loading", "stale"],
6786 first_key: 0,
6787 last_key: 0,
6788 step: 0,
6789 keys: &[],
6790 acl: &["@admin", "@slow", "@dangerous"],
6791 since: "1.0.0",
6792 complexity: "O(1)",
6793 summary: "Watch every command the server runs, as it runs them.",
6794 group: "server",
6795 },
6796 Spec {
6797 name: "shutdown",
6798 arity: -1,
6799 flags: &[
6800 "admin",
6801 "noscript",
6802 "loading",
6803 "stale",
6804 "no_multi",
6805 "allow_busy",
6806 ],
6807 first_key: 0,
6808 last_key: 0,
6809 step: 0,
6810 keys: &[],
6811 acl: &["@admin", "@slow", "@dangerous"],
6812 since: "1.0.0",
6813 complexity: "O(1)",
6814 summary: "Stop the server, without answering.",
6815 group: "server",
6816 },
6817];
6818
6819const MIN_LEN: usize = 3;
6825const MAX_LEN: usize = 20;
6826
6827const SLOTS: usize = 2048;
6844
6845const FREE: u16 = u16::MAX;
6850
6851const MIX: u64 = 0xc7f9_d8be_b27e_8381;
7090
7091const fn key_of(name: &[u8]) -> Option<u32> {
7143 if name.len() < MIN_LEN || name.len() > MAX_LEN {
7144 return None;
7145 }
7146 let last = name.len() - 1;
7147 let mid = name.len() / 2;
7148 Some(
7149 name.len() as u32
7150 | ((name[0] | 0x20) as u32) << 8
7151 | ((name[1] | 0x20) as u32) << 16
7152 | (((name[last] | 0x20) ^ (name[last - 1] | 0x20) ^ (name[mid] | 0x20)) as u32) << 24,
7153 )
7154}
7155
7156const fn slot_of(key: u32) -> usize {
7163 ((key as u64).wrapping_mul(MIX) >> 53) as usize & (SLOTS - 1)
7164}
7165
7166const INDEX: [u16; SLOTS] = index();
7172
7173const fn index() -> [u16; SLOTS] {
7174 let mut out = [FREE; SLOTS];
7175 let mut i = 0;
7176 while i < COMMANDS.len() {
7177 let key = match key_of(COMMANDS[i].name.as_bytes()) {
7178 Some(key) => key,
7179 None => panic!("a command name is outside MIN_LEN..=MAX_LEN"),
7180 };
7181 let mut at = slot_of(key);
7182 while out[at] != FREE {
7183 at = (at + 1) & (SLOTS - 1);
7184 }
7185 out[at] = i as u16;
7186 i += 1;
7187 }
7188 out
7189}
7190
7191#[must_use]
7212pub fn lookup(name: &[u8]) -> Option<&'static Spec> {
7213 at(lookup_index(name))
7214}
7215
7216#[must_use]
7229pub fn lookup_index(name: &[u8]) -> u16 {
7230 let Some(key) = key_of(name) else {
7231 return FREE;
7232 };
7233 let mut at = slot_of(key);
7234 loop {
7235 let i = INDEX[at];
7236 if i == FREE {
7237 return FREE;
7238 }
7239 if COMMANDS[i as usize]
7240 .name
7241 .as_bytes()
7242 .eq_ignore_ascii_case(name)
7243 {
7244 return i;
7245 }
7246 at = (at + 1) & (SLOTS - 1);
7247 }
7248}
7249
7250#[must_use]
7255pub fn at(i: u16) -> Option<&'static Spec> {
7256 COMMANDS.get(i as usize)
7257}
7258
7259#[must_use]
7264pub const fn count() -> usize {
7265 COMMANDS.len()
7266}
7267
7268#[must_use]
7281pub fn index_of(spec: &'static Spec) -> usize {
7282 let front = COMMANDS.as_ptr().addr();
7283 let here = std::ptr::from_ref(spec).addr();
7284 (here - front) / size_of::<Spec>()
7285}
7286
7287#[must_use]
7294pub fn name_at(at: usize) -> &'static str {
7295 COMMANDS[at].name
7296}
7297
7298#[must_use]
7300pub fn arity_ok(spec: &Spec, n: usize) -> bool {
7301 let n = n as i32;
7302 if spec.arity >= 0 {
7303 n == spec.arity
7304 } else {
7305 n >= -spec.arity
7306 }
7307}
7308
7309#[derive(Debug, Clone, Copy)]
7318pub(crate) struct KeySpan {
7319 pub first: usize,
7321 pub count: usize,
7323 pub step: usize,
7325}
7326
7327#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7329pub(crate) enum NoKeys {
7330 Never,
7332 BadCount,
7334}
7335
7336pub(crate) fn key_span(spec: &Spec, args: Args<'_>, base: usize) -> Result<KeySpan, NoKeys> {
7359 if let Some((rel, step, least, lenient)) = match spec.name {
7360 "msetex" => Some((1, 2, 1, false)),
7361 "ts.nrange" | "ts.nrevrange" => Some((1, 1, 1, false)),
7362 "eval" | "eval_ro" | "evalsha" | "evalsha_ro" | "fcall" | "fcall_ro" => {
7363 Some((2, 1, 0, true))
7364 }
7365 _ => None,
7366 } {
7367 let at = base + rel;
7368 let found = parse_i64(args.get(at))
7369 .filter(|&n| n >= least)
7370 .and_then(|n| usize::try_from(n).ok())
7371 .filter(|&n| at + 1 + step * n <= args.len());
7372 let count = match found {
7373 Some(n) => n,
7374 None if lenient => 0,
7375 None => return Err(NoKeys::BadCount),
7376 };
7377 return Ok(KeySpan {
7378 first: at + 1,
7379 count,
7380 step,
7381 });
7382 }
7383 if spec.first_key == 0 {
7384 return Err(NoKeys::Never);
7385 }
7386 let argc = args.len() - base;
7387 let last = if spec.last_key < 0 {
7388 (argc as i64) + i64::from(spec.last_key)
7389 } else {
7390 i64::from(spec.last_key)
7391 };
7392 let step = i64::from(spec.step).max(1);
7393 let first = i64::from(spec.first_key);
7394 let count = if last < first {
7395 0
7396 } else {
7397 ((last - first) / step + 1) as usize
7398 };
7399 Ok(KeySpan {
7400 first: base + first as usize,
7401 count,
7402 step: step as usize,
7403 })
7404}
7405
7406#[cfg(test)]
7407mod tests {
7408 use super::*;
7409
7410 #[test]
7420 fn every_name_is_spelled_the_way_it_was_registered_and_appears_once() {
7421 let mut seen = std::collections::BTreeSet::new();
7422 for c in COMMANDS {
7423 let want = if c.group == "vector" || c.group == "search" {
7424 c.name.to_uppercase()
7425 } else {
7426 c.name.to_lowercase()
7427 };
7428 assert_eq!(c.name, want, "{} is spelled wrong for its group", c.name);
7429 assert!(seen.insert(c.name), "{} is in the table twice", c.name);
7430 }
7431 }
7432
7433 #[test]
7439 fn a_spec_knows_where_it_is_in_the_table() {
7440 assert_eq!(count(), COMMANDS.len());
7441 for (want, spec) in COMMANDS.iter().enumerate() {
7442 assert_eq!(index_of(spec), want, "{} is at the wrong index", spec.name);
7443 }
7444 assert_eq!(
7445 index_of(lookup(b"get").unwrap()),
7446 index_of(lookup(b"GET").unwrap())
7447 );
7448 }
7449
7450 #[test]
7451 fn lookup_ignores_case_and_does_not_match_a_prefix() {
7452 assert_eq!(lookup(b"GET").unwrap().name, "get");
7453 assert_eq!(lookup(b"gEt").unwrap().name, "get");
7454 assert!(lookup(b"ge").is_none());
7455 assert!(lookup(b"gets").is_none());
7456 }
7457
7458 #[test]
7465 fn every_command_is_findable_by_its_own_name() {
7466 for spec in COMMANDS {
7467 let found = lookup(spec.name.as_bytes()).expect(spec.name);
7468 assert_eq!(
7469 index_of(found),
7470 index_of(spec),
7471 "{} found the wrong spec",
7472 spec.name
7473 );
7474 assert_eq!(
7475 lookup(spec.name.to_ascii_uppercase().as_bytes()).map(index_of),
7476 Some(index_of(spec)),
7477 "{} is not found in upper case",
7478 spec.name,
7479 );
7480 }
7481 }
7482
7483 #[test]
7485 fn a_name_that_cannot_be_a_command_is_rejected_on_its_shape() {
7486 assert!(lookup(b"").is_none());
7487 assert!(key_of(b"").is_none());
7488 assert!(key_of(&[b'g'; 256]).is_none());
7489 assert!(lookup(&[b'g'; 256]).is_none());
7490 assert!(lookup(b"9et").is_none());
7491 }
7492
7493 #[test]
7495 fn a_key_folds_the_case_and_nothing_else() {
7496 assert_eq!(key_of(b"get"), key_of(b"GET"));
7497 assert_eq!(key_of(b"get"), key_of(b"gEt"));
7498 assert_ne!(key_of(b"get"), key_of(b"set"), "other first byte");
7499 assert_ne!(key_of(b"get"), key_of(b"gxt"), "other second byte");
7500 assert_ne!(key_of(b"get"), key_of(b"gex"), "other last byte");
7501 assert_ne!(key_of(b"get"), key_of(b"gett"), "other length");
7502 assert_ne!(key_of(b"abcde"), key_of(b"abxde"), "other middle byte");
7503 assert_eq!(key_of(b"abcde"), key_of(b"ABCDE"), "middle byte folds too");
7504 }
7505
7506 #[test]
7523 fn no_command_is_more_than_two_slots_from_where_it_wants_to_be() {
7524 let mut worst = 0;
7525 let mut total = 0;
7526 for spec in COMMANDS {
7527 let key = key_of(spec.name.as_bytes()).expect(spec.name);
7528 let home = slot_of(key);
7529 let mut at = home;
7530 let mut steps = 0;
7531 while INDEX[at] as usize != index_of(spec) {
7532 at = (at + 1) & (SLOTS - 1);
7533 steps += 1;
7534 assert!(steps < SLOTS, "{} is not in the index at all", spec.name);
7535 }
7536 worst = worst.max(steps);
7537 total += steps;
7538 }
7539 assert!(worst <= 2, "worst probe is {worst} slots");
7540 assert_eq!(
7541 worst, 1,
7542 "the multiplier stopped keeping every command close"
7543 );
7544 assert!(
7545 total <= 28,
7546 "{total} extra slots walked over the whole table"
7547 );
7548 }
7549
7550 #[test]
7552 fn the_index_is_not_full() {
7553 assert!(
7554 COMMANDS.len() < SLOTS,
7555 "the probe would never find an empty"
7556 );
7557 assert!(
7558 COMMANDS.len() < FREE as usize,
7559 "an index would collide with FREE"
7560 );
7561 let free = INDEX.iter().filter(|&&i| i == FREE).count();
7562 assert_eq!(free, SLOTS - COMMANDS.len());
7563 }
7564
7565 #[test]
7566 fn arity_counts_the_command_name() {
7567 let get = lookup(b"get").unwrap();
7568 assert!(!arity_ok(get, 1));
7569 assert!(arity_ok(get, 2));
7570 assert!(!arity_ok(get, 3));
7571
7572 let set = lookup(b"set").unwrap();
7574 assert!(!arity_ok(set, 2));
7575 assert!(arity_ok(set, 3));
7576 assert!(arity_ok(set, 9));
7577 }
7578
7579 #[test]
7582 fn the_pair_commands_step_two_keys_at_a_time() {
7583 for name in [b"mset".as_slice(), b"msetnx"] {
7584 let c = lookup(name).unwrap();
7585 assert_eq!((c.first_key, c.last_key, c.step), (1, -1, 2));
7586 }
7587 let mget = lookup(b"mget").unwrap();
7588 assert_eq!((mget.first_key, mget.last_key, mget.step), (1, -1, 1));
7589 let msetex = lookup(b"msetex").unwrap();
7592 assert_eq!((msetex.first_key, msetex.last_key, msetex.step), (0, 0, 0));
7593 assert!(msetex.flags.contains(&"movablekeys"));
7594 }
7595}