 "SISMEMBER" {:fn-name "sismember", :fn-docstring "Determine if a given value is a member of a set.\n\nSISMEMBER key member\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key member], :fn-params-more nil, :req-args-fixed ["SISMEMBER" key member], :cluster-key-idx 1}
 "CLUSTER RESET" {:fn-name "cluster-reset", :fn-docstring "Reset a Redis Cluster node.\n\nCLUSTER RESET [HARD|SOFT]\n\nAvailable since: 3.0.0.\n\nTime complexity: O(N) where N is the number of known nodes. The command may execute a FLUSHALL as a side effect.", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["CLUSTER" "RESET"], :cluster-key-idx 2}
 "CLUSTER DELSLOTS" {:fn-name "cluster-delslots", :fn-docstring "Set hash slots as unbound in receiving node.\n\nCLUSTER DELSLOTS slot [slot ...]\n\nAvailable since: 3.0.0.\n\nTime complexity: O(N) where N is the total number of hash slot arguments", :fn-params-fixed [slot], :fn-params-more [slot & args], :req-args-fixed ["CLUSTER" "DELSLOTS" slot], :cluster-key-idx 2}
-"CLIENT LIST" {:fn-name "client-list", :fn-docstring "Get the list of client connections.\n\nCLIENT LIST \n\nAvailable since: 2.4.0.\n\nTime complexity: O(N) where N is the number of client connections", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["CLIENT" "LIST"], :cluster-key-idx 2}
+"CLIENT LIST" {:fn-name "client-list", :fn-docstring "Get the list of client connections.\n\nCLIENT LIST [TYPE normal|master|replica|pubsub]\n\nAvailable since: 2.4.0.\n\nTime complexity: O(N) where N is the number of client connections", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["CLIENT" "LIST"], :cluster-key-idx 2}
 "CLIENT REPLY" {:fn-name "client-reply", :fn-docstring "Instruct the server whether to reply to commands.\n\nCLIENT REPLY ON|OFF|SKIP\n\nAvailable since: 3.2.\n\nTime complexity: O(1)", :fn-params-fixed [reply-mode], :fn-params-more nil, :req-args-fixed ["CLIENT" "REPLY" reply-mode], :cluster-key-idx 2}
 "DECR" {:fn-name "decr", :fn-docstring "Decrement the integer value of a key by one.\n\nDECR key\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key], :fn-params-more nil, :req-args-fixed ["DECR" key], :cluster-key-idx 1}
 "MULTI" {:fn-name "multi", :fn-docstring "Mark the start of a transaction block.\n\nMULTI \n\nAvailable since: 1.2.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["MULTI"], :cluster-key-idx 1}
 "DEBUG SEGFAULT" {:fn-name "debug-segfault", :fn-docstring "Make the server crash.\n\nDEBUG SEGFAULT \n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["DEBUG" "SEGFAULT"], :cluster-key-idx 2}
 "HDEL" {:fn-name "hdel", :fn-docstring "Delete one or more hash fields.\n\nHDEL key field [field ...]\n\nAvailable since: 2.0.0.\n\nTime complexity: O(N) where N is the number of fields to be removed.", :fn-params-fixed [key field], :fn-params-more [key field & args], :req-args-fixed ["HDEL" key field], :cluster-key-idx 1}
 "SADD" {:fn-name "sadd", :fn-docstring "Add one or more members to a set.\n\nSADD key member [member ...]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.", :fn-params-fixed [key member], :fn-params-more [key member & args], :req-args-fixed ["SADD" key member], :cluster-key-idx 1}
-"LREM" {:fn-name "lrem", :fn-docstring "Remove elements from a list.\n\nLREM key count value\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) where N is the length of the list.", :fn-params-fixed [key count value], :fn-params-more nil, :req-args-fixed ["LREM" key count value], :cluster-key-idx 1}
+"MODULE LOAD" {:fn-name "module-load", :fn-docstring "Load a module.\n\nMODULE LOAD path [arg]\n\nAvailable since: 4.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [path], :fn-params-more [path & args], :req-args-fixed ["MODULE" "LOAD" path], :cluster-key-idx 2}
+"LREM" {:fn-name "lrem", :fn-docstring "Remove elements from a list.\n\nLREM key count element\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N+M) where N is the length of the list and M is the number of elements removed.", :fn-params-fixed [key count element], :fn-params-more nil, :req-args-fixed ["LREM" key count element], :cluster-key-idx 1}
 "UNWATCH" {:fn-name "unwatch", :fn-docstring "Forget about all watched keys.\n\nUNWATCH \n\nAvailable since: 2.2.0.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["UNWATCH"], :cluster-key-idx 1}
-"WAIT" {:fn-name "wait", :fn-docstring "Wait for the synchronous replication of all the write commands sent in the context of the current connection.\n\nWAIT numslaves timeout\n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [numslaves timeout], :fn-params-more nil, :req-args-fixed ["WAIT" numslaves timeout], :cluster-key-idx 1}
+"WAIT" {:fn-name "wait", :fn-docstring "Wait for the synchronous replication of all the write commands sent in the context of the current connection.\n\nWAIT numreplicas timeout\n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [numreplicas timeout], :fn-params-more nil, :req-args-fixed ["WAIT" numreplicas timeout], :cluster-key-idx 1}
 "SINTERSTORE" {:fn-name "sinterstore", :fn-docstring "Intersect multiple sets and store the resulting set in a key.\n\nSINTERSTORE destination key [key ...]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N*M) worst case where N is the cardinality of the smallest set and M is the number of sets.", :fn-params-fixed [destination key], :fn-params-more [destination key & args], :req-args-fixed ["SINTERSTORE" destination key], :cluster-key-idx 1}
 "SDIFF" {:fn-name "sdiff", :fn-docstring "Subtract multiple sets.\n\nSDIFF key [key ...]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) where N is the total number of elements in all given sets.", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["SDIFF" key], :cluster-key-idx 1}
 "INFO" {:fn-name "info", :fn-docstring "Get information and statistics about the server.\n\nINFO [section]\n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["INFO"], :cluster-key-idx 1}
+"PSYNC" {:fn-name "psync", :fn-docstring "Internal command used for replication.\n\nPSYNC replicationid offset\n\nAvailable since: 2.8.0.\n\n", :fn-params-fixed [replicationid offset], :fn-params-more nil, :req-args-fixed ["PSYNC" replicationid offset], :cluster-key-idx 1}
 "GEOADD" {:fn-name "geoadd", :fn-docstring "Add one or more geospatial items in the geospatial index represented using a sorted set.\n\nGEOADD key longitude latitude member [longitude latitude member ...]\n\nAvailable since: 3.2.0.\n\nTime complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set.", :fn-params-fixed [key longitude latitude member], :fn-params-more [key longitude latitude member & args], :req-args-fixed ["GEOADD" key longitude latitude member], :cluster-key-idx 1}
-"LPUSHX" {:fn-name "lpushx", :fn-docstring "Prepend a value to a list, only if the list exists.\n\nLPUSHX key value\n\nAvailable since: 2.2.0.\n\nTime complexity: O(1)", :fn-params-fixed [key value], :fn-params-more nil, :req-args-fixed ["LPUSHX" key value], :cluster-key-idx 1}
+"LPUSHX" {:fn-name "lpushx", :fn-docstring "Prepend an element to a list, only if the list exists.\n\nLPUSHX key element [element ...]\n\nAvailable since: 2.2.0.\n\nTime complexity: O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.", :fn-params-fixed [key element], :fn-params-more [key element & args], :req-args-fixed ["LPUSHX" key element], :cluster-key-idx 1}
 "APPEND" {:fn-name "append", :fn-docstring "Append a value to a key.\n\nAPPEND key value\n\nAvailable since: 2.0.0.\n\nTime complexity: O(1). The amortized time complexity is O(1) assuming the appended value is small and the already present value is of any size, since the dynamic string library used by Redis will double the free space available on every reallocation.", :fn-params-fixed [key value], :fn-params-more nil, :req-args-fixed ["APPEND" key value], :cluster-key-idx 1}
-"XRANGE" {:fn-name "xrange", :fn-docstring "Return a range of elements in a stream, with IDs matching the specified IDs interval.\n\nXRANGE key start end [COUNT count]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(log(N)+M) with N being the number of elements in the stream and M the number of elements being returned. If M is constant (e.g. always asking for the first 10 elements with COUNT), you can consider it O(log(N)).", :fn-params-fixed [key start end], :fn-params-more [key start end & args], :req-args-fixed ["XRANGE" key start end], :cluster-key-idx 1}
+"XRANGE" {:fn-name "xrange", :fn-docstring "Return a range of elements in a stream, with IDs matching the specified IDs interval.\n\nXRANGE key start end [COUNT count]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(N) with N being the number of elements being returned. If N is constant (e.g. always asking for the first 10 elements with COUNT), you can consider it O(1).", :fn-params-fixed [key start end], :fn-params-more [key start end & args], :req-args-fixed ["XRANGE" key start end], :cluster-key-idx 1}
 "HINCRBYFLOAT" {:fn-name "hincrbyfloat", :fn-docstring "Increment the float value of a hash field by the given amount.\n\nHINCRBYFLOAT key field increment\n\nAvailable since: 2.6.0.\n\nTime complexity: O(1)", :fn-params-fixed [key field increment], :fn-params-more nil, :req-args-fixed ["HINCRBYFLOAT" key field increment], :cluster-key-idx 1}
-"LSET" {:fn-name "lset", :fn-docstring "Set the value of an element in a list by its index.\n\nLSET key index value\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) where N is the length of the list. Setting either the first or the last element of the list is O(1).", :fn-params-fixed [key index value], :fn-params-more nil, :req-args-fixed ["LSET" key index value], :cluster-key-idx 1}
+"LSET" {:fn-name "lset", :fn-docstring "Set the value of an element in a list by its index.\n\nLSET key index element\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) where N is the length of the list. Setting either the first or the last element of the list is O(1).", :fn-params-fixed [key index element], :fn-params-more nil, :req-args-fixed ["LSET" key index element], :cluster-key-idx 1}
 "CLUSTER GETKEYSINSLOT" {:fn-name "cluster-getkeysinslot", :fn-docstring "Return local key names in the specified hash slot.\n\nCLUSTER GETKEYSINSLOT slot count\n\nAvailable since: 3.0.0.\n\nTime complexity: O(log(N)) where N is the number of requested keys", :fn-params-fixed [slot count], :fn-params-more nil, :req-args-fixed ["CLUSTER" "GETKEYSINSLOT" slot count], :cluster-key-idx 2}
-"XPENDING" {:fn-name "xpending", :fn-docstring "Return information and entries from a stream consumer group pending entries list, that are messages fetched but never acknowledged..\n\nXPENDING key group [start end count] [consumer]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(log(N)+M) with N being the number of elements in the consumer group pending entries list, and M the number of elements being returned. When the command returns just the summary it runs in O(1) time assuming the list of consumers is small, otherwise there is additional O(N) time needed to iterate every consumer.", :fn-params-fixed [key group], :fn-params-more [key group & args], :req-args-fixed ["XPENDING" key group], :cluster-key-idx 1}
+"XPENDING" {:fn-name "xpending", :fn-docstring "Return information and entries from a stream consumer group pending entries list, that are messages fetched but never acknowledged..\n\nXPENDING key group [start end count] [consumer]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(N) with N being the number of elements returned, so asking for a small fixed number of entries per call is O(1). When the command returns just the summary it runs in O(1) time assuming the list of consumers is small, otherwise there is additional O(N) time needed to iterate every consumer.", :fn-params-fixed [key group], :fn-params-more [key group & args], :req-args-fixed ["XPENDING" key group], :cluster-key-idx 1}
 "ZREVRANK" {:fn-name "zrevrank", :fn-docstring "Determine the index of a member in a sorted set, with scores ordered from high to low.\n\nZREVRANK key member\n\nAvailable since: 2.0.0.\n\nTime complexity: O(log(N))", :fn-params-fixed [key member], :fn-params-more nil, :req-args-fixed ["ZREVRANK" key member], :cluster-key-idx 1}
 "ZRANK" {:fn-name "zrank", :fn-docstring "Determine the index of a member in a sorted set.\n\nZRANK key member\n\nAvailable since: 2.0.0.\n\nTime complexity: O(log(N))", :fn-params-fixed [key member], :fn-params-more nil, :req-args-fixed ["ZRANK" key member], :cluster-key-idx 1}
 "BITCOUNT" {:fn-name "bitcount", :fn-docstring "Count set bits in a string.\n\nBITCOUNT key [start end]\n\nAvailable since: 2.6.0.\n\nTime complexity: O(N)", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["BITCOUNT" key], :cluster-key-idx 1}
 "MEMORY DOCTOR" {:fn-name "memory-doctor", :fn-docstring "Outputs memory problems report.\n\nMEMORY DOCTOR \n\nAvailable since: 4.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["MEMORY" "DOCTOR"], :cluster-key-idx 2}
-"READWRITE" {:fn-name "readwrite", :fn-docstring "Disables read queries for a connection to a cluster slave node.\n\nREADWRITE \n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["READWRITE"], :cluster-key-idx 1}
+"READWRITE" {:fn-name "readwrite", :fn-docstring "Disables read queries for a connection to a cluster replica node.\n\nREADWRITE \n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["READWRITE"], :cluster-key-idx 1}
 "GETSET" {:fn-name "getset", :fn-docstring "Set the string value of a key and return its old value.\n\nGETSET key value\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key value], :fn-params-more nil, :req-args-fixed ["GETSET" key value], :cluster-key-idx 1}
 "SCRIPT EXISTS" {:fn-name "script-exists", :fn-docstring "Check existence of scripts in the script cache..\n\nSCRIPT EXISTS sha1 [sha1 ...]\n\nAvailable since: 2.6.0.\n\nTime complexity: O(N) with N being the number of scripts to check (so checking a single script is an O(1) operation).", :fn-params-fixed [sha1], :fn-params-more [sha1 & args], :req-args-fixed ["SCRIPT" "EXISTS" sha1], :cluster-key-idx 2}
 "CONFIG RESETSTAT" {:fn-name "config-resetstat", :fn-docstring "Reset the stats returned by INFO.\n\nCONFIG RESETSTAT \n\nAvailable since: 2.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["CONFIG" "RESETSTAT"], :cluster-key-idx 2}

"SCRIPT FLUSH" {:fn-name "script-flush", :fn-docstring "Remove all the scripts from the script cache..\n\nSCRIPT FLUSH \n\nAvailable since: 2.6.0.\n\nTime complexity: O(N) with N being the number of scripts in cache", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["SCRIPT" "FLUSH"], :cluster-key-idx 2}
"BZPOPMAX" {:fn-name "bzpopmax", :fn-docstring "Remove and return the member with the highest score from one or more sorted sets, or block until one is available.\n\nBZPOPMAX key [key ...] timeout\n\nAvailable since: 5.0.0.\n\nTime complexity: O(log(N)) with N being the number of elements in the sorted set.", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["BZPOPMAX" key], :cluster-key-idx 1}
"MEMORY HELP" {:fn-name "memory-help", :fn-docstring "Show helpful text about the different subcommands.\n\nMEMORY HELP \n\nAvailable since: 4.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["MEMORY" "HELP"], :cluster-key-idx 2}
"ZUNIONSTORE" {:fn-name "zunionstore", :fn-docstring "Add multiple sorted sets and store the resulting sorted set in a new key.\n\nZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]\n\nAvailable since: 2.0.0.\n\nTime complexity: O(N)+O(M log(M)) with N being the sum of the sizes of the input sorted sets, and M being the number of elements in the resulting sorted set.", :fn-params-fixed [destination numkeys key], :fn-params-more [destination numkeys key & args], :req-args-fixed ["ZUNIONSTORE" destination numkeys key], :cluster-key-idx 1}
"CLUSTER NODES" {:fn-name "cluster-nodes", :fn-docstring "Get Cluster config for the node.\n\nCLUSTER NODES \n\nAvailable since: 3.0.0.\n\nTime complexity: O(N) where N is the total number of Cluster nodes", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["CLUSTER" "NODES"], :cluster-key-idx 2}
"MSETNX" {:fn-name "msetnx", :fn-docstring "Set multiple keys to multiple values, only if none of the keys exist.\n\nMSETNX key value [key value ...]\n\nAvailable since: 1.0.1.\n\nTime complexity: O(N) where N is the number of keys to set.", :fn-params-fixed [key value], :fn-params-more [key value & args], :req-args-fixed ["MSETNX" key value], :cluster-key-idx 1}

"EVALSHA" {:fn-name "evalsha", :fn-docstring "Execute a Lua script server side.\n\nEVALSHA sha1 numkeys key [key ...] arg [arg ...]\n\nAvailable since: 2.6.0.\n\nTime complexity: Depends on the script that is executed.", :fn-params-fixed [sha1 numkeys], :fn-params-more [sha1 numkeys & args], :req-args-fixed ["EVALSHA" sha1 numkeys], :cluster-key-idx 1}
"GET" {:fn-name "get", :fn-docstring "Get the value of a key.\n\nGET key\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key], :fn-params-more nil, :req-args-fixed ["GET" key], :cluster-key-idx 1}
"HLEN" {:fn-name "hlen", :fn-docstring "Get the number of fields in a hash.\n\nHLEN key\n\nAvailable since: 2.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key], :fn-params-more nil, :req-args-fixed ["HLEN" key], :cluster-key-idx 1}
"XREVRANGE" {:fn-name "xrevrange", :fn-docstring "Return a range of elements in a stream, with IDs matching the specified IDs interval, in reverse order (from greater to smaller IDs) compared to XRANGE.\n\nXREVRANGE key end start [COUNT count]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(N) with N being the number of elements returned. If N is constant (e.g. always asking for the first 10 elements with COUNT), you can consider it O(1).", :fn-params-fixed [key end start], :fn-params-more [key end start & args], :req-args-fixed ["XREVRANGE" key end start], :cluster-key-idx 1}
"CONFIG REWRITE" {:fn-name "config-rewrite", :fn-docstring "Rewrite the configuration file with the in memory configuration.\n\nCONFIG REWRITE \n\nAvailable since: 2.8.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["CONFIG" "REWRITE"], :cluster-key-idx 2}
"BZPOPMIN" {:fn-name "bzpopmin", :fn-docstring "Remove and return the member with the lowest score from one or more sorted sets, or block until one is available.\n\nBZPOPMIN key [key ...] timeout\n\nAvailable since: 5.0.0.\n\nTime complexity: O(log(N)) with N being the number of elements in the sorted set.", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["BZPOPMIN" key], :cluster-key-idx 1}
"CLIENT KILL" {:fn-name "client-kill", :fn-docstring "Kill the connection of a client.\n\nCLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]\n\nAvailable since: 2.4.0.\n\nTime complexity: O(N) where N is the number of client connections", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["CLIENT" "KILL"], :cluster-key-idx 2}
