 "BRPOP" {:fn-name "brpop", :fn-docstring "Remove and get the last element in a list, or block until one is available.\n\nBRPOP key [key ...] timeout\n\nAvailable since: 2.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["BRPOP" key], :cluster-key-idx 1}
 "DECRBY" {:fn-name "decrby", :fn-docstring "Decrement the integer value of a key by the given number.\n\nDECRBY key decrement\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key decrement], :fn-params-more nil, :req-args-fixed ["DECRBY" key decrement], :cluster-key-idx 1}
 "CLIENT GETNAME" {:fn-name "client-getname", :fn-docstring "Get the current connection name.\n\nCLIENT GETNAME \n\nAvailable since: 2.6.9.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["CLIENT" "GETNAME"], :cluster-key-idx 2}
-"SET" {:fn-name "set", :fn-docstring "Set the string value of a key.\n\nSET key value [expiration EX seconds|PX milliseconds] [NX|XX]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key value], :fn-params-more [key value & args], :req-args-fixed ["SET" key value], :cluster-key-idx 1}
+"SET" {:fn-name "set", :fn-docstring "Set the string value of a key.\n\nSET key value [EX seconds|PX milliseconds] [NX|XX]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key value], :fn-params-more [key value & args], :req-args-fixed ["SET" key value], :cluster-key-idx 1}
 "MSET" {:fn-name "mset", :fn-docstring "Set multiple keys to multiple values.\n\nMSET 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 ["MSET" key value], :cluster-key-idx 1}
 "ZRANGE" {:fn-name "zrange", :fn-docstring "Return a range of members in a sorted set, by index.\n\nZRANGE key start stop [WITHSCORES]\n\nAvailable since: 1.2.0.\n\nTime complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements returned.", :fn-params-fixed [key start stop], :fn-params-more [key start stop & args], :req-args-fixed ["ZRANGE" key start stop], :cluster-key-idx 1}
 "STRLEN" {:fn-name "strlen", :fn-docstring "Get the length of the value stored in a key.\n\nSTRLEN key\n\nAvailable since: 2.2.0.\n\nTime complexity: O(1)", :fn-params-fixed [key], :fn-params-more nil, :req-args-fixed ["STRLEN" key], :cluster-key-idx 1}
 "LRANGE" {:fn-name "lrange", :fn-docstring "Get a range of elements from a list.\n\nLRANGE key start stop\n\nAvailable since: 1.0.0.\n\nTime complexity: O(S+N) where S is the distance of start offset from HEAD for small lists, from nearest end (HEAD or TAIL) for large lists; and N is the number of elements in the specified range.", :fn-params-fixed [key start stop], :fn-params-more nil, :req-args-fixed ["LRANGE" key start stop], :cluster-key-idx 1}
-"LPUSH" {:fn-name "lpush", :fn-docstring "Prepend one or multiple values to a list.\n\nLPUSH key value [value ...]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key value], :fn-params-more [key value & args], :req-args-fixed ["LPUSH" key value], :cluster-key-idx 1}
+"LPUSH" {:fn-name "lpush", :fn-docstring "Prepend one or multiple elements to a list.\n\nLPUSH key element [element ...]\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 element], :fn-params-more [key element & args], :req-args-fixed ["LPUSH" key element], :cluster-key-idx 1}
 "DBSIZE" {:fn-name "dbsize", :fn-docstring "Return the number of keys in the selected database.\n\nDBSIZE \n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["DBSIZE"], :cluster-key-idx 1}
 "EXPIRE" {:fn-name "expire", :fn-docstring "Set a key's time to live in seconds.\n\nEXPIRE key seconds\n\nAvailable since: 1.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key seconds], :fn-params-more nil, :req-args-fixed ["EXPIRE" key seconds], :cluster-key-idx 1}
 "SUBSCRIBE" {:fn-name "subscribe", :fn-docstring "Listen for messages published to the given channels.\n\nSUBSCRIBE channel [channel ...]\n\nAvailable since: 2.0.0.\n\nTime complexity: O(N) where N is the number of channels to subscribe to.", :fn-params-fixed [channel], :fn-params-more [channel & args], :req-args-fixed ["SUBSCRIBE" channel], :cluster-key-idx 1}
 "SETRANGE" {:fn-name "setrange", :fn-docstring "Overwrite part of a string at key starting at the specified offset.\n\nSETRANGE key offset value\n\nAvailable since: 2.2.0.\n\nTime complexity: O(1), not counting the time taken to copy the new string in place. Usually, this string is very small so the amortized complexity is O(1). Otherwise, complexity is O(M) with M being the length of the value argument.", :fn-params-fixed [key offset value], :fn-params-more nil, :req-args-fixed ["SETRANGE" key offset value], :cluster-key-idx 1}
 "UNSUBSCRIBE" {:fn-name "unsubscribe", :fn-docstring "Stop listening for messages posted to the given channels.\n\nUNSUBSCRIBE [channel [channel ...]]\n\nAvailable since: 2.0.0.\n\nTime complexity: O(N) where N is the number of clients already subscribed to a channel.", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["UNSUBSCRIBE"], :cluster-key-idx 1}
-"XREADGROUP" {:fn-name "xreadgroup", :fn-docstring "Return new entries from a stream using a consumer group, or access the history of the pending entries for a given consumer. Can block..\n\nXREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]\n\nAvailable since: 5.0.0.\n\nTime complexity: For each stream mentioned: 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)). On the other side, XADD will pay the O(N) time in order to serve the N clients blocked on the stream getting new data.", :fn-params-fixed [group consumer], :fn-params-more [group consumer & args], :req-args-fixed ["XREADGROUP" group consumer], :cluster-key-idx 1}
+"XREADGROUP" {:fn-name "xreadgroup", :fn-docstring "Return new entries from a stream using a consumer group, or access the history of the pending entries for a given consumer. Can block..\n\nXREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]\n\nAvailable since: 5.0.0.\n\nTime complexity: For each stream mentioned: O(M) with M being the number of elements returned. If M is constant (e.g. always asking for the first 10 elements with COUNT), you can consider it O(1). On the other side when XREADGROUP blocks, XADD will pay the O(N) time in order to serve the N clients blocked on the stream getting new data.", :fn-params-fixed [group consumer], :fn-params-more [group consumer & args], :req-args-fixed ["XREADGROUP" group consumer], :cluster-key-idx 1}
 "ZCARD" {:fn-name "zcard", :fn-docstring "Get the number of members in a sorted set.\n\nZCARD key\n\nAvailable since: 1.2.0.\n\nTime complexity: O(1)", :fn-params-fixed [key], :fn-params-more nil, :req-args-fixed ["ZCARD" key], :cluster-key-idx 1}
 "HMSET" {:fn-name "hmset", :fn-docstring "Set multiple hash fields to multiple values.\n\nHMSET key field value [field value ...]\n\nAvailable since: 2.0.0.\n\nTime complexity: O(N) where N is the number of fields being set.", :fn-params-fixed [key field value], :fn-params-more [key field value & args], :req-args-fixed ["HMSET" key field value], :cluster-key-idx 1}
 "ZINCRBY" {:fn-name "zincrby", :fn-docstring "Increment the score of a member in a sorted set.\n\nZINCRBY key increment member\n\nAvailable since: 1.2.0.\n\nTime complexity: O(log(N)) where N is the number of elements in the sorted set.", :fn-params-fixed [key increment member], :fn-params-more nil, :req-args-fixed ["ZINCRBY" key increment member], :cluster-key-idx 1}

"PEXPIRE" {:fn-name "pexpire", :fn-docstring "Set a key's time to live in milliseconds.\n\nPEXPIRE key milliseconds\n\nAvailable since: 2.6.0.\n\nTime complexity: O(1)", :fn-params-fixed [key milliseconds], :fn-params-more nil, :req-args-fixed ["PEXPIRE" key milliseconds], :cluster-key-idx 1}
"GEOHASH" {:fn-name "geohash", :fn-docstring "Returns members of a geospatial index as standard geohash strings.\n\nGEOHASH key member [member ...]\n\nAvailable since: 3.2.0.\n\nTime complexity: O(log(N)) for each member requested, where N is the number of elements in the sorted set.", :fn-params-fixed [key member], :fn-params-more [key member & args], :req-args-fixed ["GEOHASH" key member], :cluster-key-idx 1}
"HSETNX" {:fn-name "hsetnx", :fn-docstring "Set the value of a hash field, only if the field does not exist.\n\nHSETNX key field value\n\nAvailable since: 2.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key field value], :fn-params-more nil, :req-args-fixed ["HSETNX" key field value], :cluster-key-idx 1}
"READONLY" {:fn-name "readonly", :fn-docstring "Enables read queries for a connection to a cluster slave node.\n\nREADONLY \n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["READONLY"], :cluster-key-idx 1}
"CONFIG SET" {:fn-name "config-set", :fn-docstring "Set a configuration parameter to the given value.\n\nCONFIG SET parameter value\n\nAvailable since: 2.0.0.\n\n", :fn-params-fixed [parameter value], :fn-params-more nil, :req-args-fixed ["CONFIG" "SET" parameter value], :cluster-key-idx 2}
"GETRANGE" {:fn-name "getrange", :fn-docstring "Get a substring of the string stored at a key.\n\nGETRANGE key start end\n\nAvailable since: 2.4.0.\n\nTime complexity: O(N) where N is the length of the returned string. The complexity is ultimately determined by the returned length, but because creating a substring from an existing string is very cheap, it can be considered O(1) for small strings.", :fn-params-fixed [key start end], :fn-params-more nil, :req-args-fixed ["GETRANGE" key start end], :cluster-key-idx 1}
"DEL" {:fn-name "del", :fn-docstring "Delete a key.\n\nDEL key [key ...]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) where N is the number of keys that will be removed. When a key to remove holds a value other than a string, the individual complexity for this key is O(M) where M is the number of elements in the list, set, sorted set or hash. Removing a single key that holds a string value is O(1).", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["DEL" key], :cluster-key-idx 1}

"COMMAND GETKEYS" {:fn-name "command-getkeys", :fn-docstring "Extract keys given a full Redis command.\n\nCOMMAND GETKEYS \n\nAvailable since: 2.8.13.\n\nTime complexity: O(N) where N is the number of arguments to the command", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["COMMAND" "GETKEYS"], :cluster-key-idx 2}
"CLUSTER KEYSLOT" {:fn-name "cluster-keyslot", :fn-docstring "Returns the hash slot of the specified key.\n\nCLUSTER KEYSLOT key\n\nAvailable since: 3.0.0.\n\nTime complexity: O(N) where N is the number of bytes in the key", :fn-params-fixed [key], :fn-params-more nil, :req-args-fixed ["CLUSTER" "KEYSLOT" key], :cluster-key-idx 2}
"BITPOS" {:fn-name "bitpos", :fn-docstring "Find first bit set or clear in a string.\n\nBITPOS key bit [start] [end]\n\nAvailable since: 2.8.7.\n\nTime complexity: O(N)", :fn-params-fixed [key bit], :fn-params-more [key bit & args], :req-args-fixed ["BITPOS" key bit], :cluster-key-idx 1}
"XTRIM" {:fn-name "xtrim", :fn-docstring "Trims the stream to (approximately if '~' is passed) a certain size.\n\nXTRIM key MAXLEN [~] count\n\nAvailable since: 5.0.0.\n\nTime complexity: O(N), with N being the number of evicted entries. Constant times are very small however, since entries are organized in macro nodes containing multiple entries that can be released with a single deallocation.", :fn-params-fixed [key strategy], :fn-params-more [key strategy & args], :req-args-fixed ["XTRIM" key strategy], :cluster-key-idx 1}
"XADD" {:fn-name "xadd", :fn-docstring "Appends a new entry to a stream.\n\nXADD key ID field value [field value ...]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [key ID field value], :fn-params-more [key ID field value & args], :req-args-fixed ["XADD" key ID field value], :cluster-key-idx 1}
"SCRIPT LOAD" {:fn-name "script-load", :fn-docstring "Load the specified Lua script into the script cache..\n\nSCRIPT LOAD script\n\nAvailable since: 2.6.0.\n\nTime complexity: O(N) with N being the length in bytes of the script body.", :fn-params-fixed [script], :fn-params-more nil, :req-args-fixed ["SCRIPT" "LOAD" script], :cluster-key-idx 2}
"SLAVEOF" {:fn-name "slaveof", :fn-docstring "Make the server a replica of another instance, or promote it as master. Deprecated starting with Redis 5. Use REPLICAOF instead..\n\nSLAVEOF host port\n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [host port], :fn-params-more nil, :req-args-fixed ["SLAVEOF" host port], :cluster-key-idx 1}
"CLUSTER FAILOVER" {:fn-name "cluster-failover", :fn-docstring "Forces a replica to perform a manual failover of its master..\n\nCLUSTER FAILOVER [FORCE|TAKEOVER]\n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["CLUSTER" "FAILOVER"], :cluster-key-idx 2}
"CLUSTER SET-CONFIG-EPOCH" {:fn-name "cluster-set-config-epoch", :fn-docstring "Set the configuration epoch in a new node.\n\nCLUSTER SET-CONFIG-EPOCH config-epoch\n\nAvailable since: 3.0.0.\n\nTime complexity: O(1)", :fn-params-fixed [config-epoch], :fn-params-more nil, :req-args-fixed ["CLUSTER" "SET-CONFIG-EPOCH" config-epoch], :cluster-key-idx 2}
"EXPIREAT" {:fn-name "expireat", :fn-docstring "Set the expiration for a key as a UNIX timestamp.\n\nEXPIREAT key timestamp\n\nAvailable since: 1.2.0.\n\nTime complexity: O(1)", :fn-params-fixed [key timestamp], :fn-params-more nil, :req-args-fixed ["EXPIREAT" key timestamp], :cluster-key-idx 1}
"OBJECT" {:fn-name "object", :fn-docstring "Inspect the internals of Redis objects.\n\nOBJECT subcommand [arguments [arguments ...]]\n\nAvailable since: 2.2.3.\n\nTime complexity: O(1) for all the currently implemented subcommands.", :fn-params-fixed [subcommand], :fn-params-more [subcommand & args], :req-args-fixed ["OBJECT" subcommand], :cluster-key-idx 1}
"KEYS" {:fn-name "keys", :fn-docstring "Find all keys matching the given pattern.\n\nKEYS pattern\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) with N being the number of keys in the database, under the assumption that the key names in the database and the given pattern have limited length.", :fn-params-fixed [pattern], :fn-params-more nil, :req-args-fixed ["KEYS" pattern], :cluster-key-idx 1}
"XINFO" {:fn-name "xinfo", :fn-docstring "Get information on streams and consumer groups.\n\nXINFO [CONSUMERS key groupname] [GROUPS key] [STREAM key] [HELP]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(N) with N being the number of returned items for the subcommands CONSUMERS and GROUPS. The STREAM subcommand is O(log N) with N being the number of items in the stream.", :fn-params-fixed [], :fn-params-more [& args], :req-args-fixed ["XINFO"], :cluster-key-idx 1}
"SETNX" {:fn-name "setnx", :fn-docstring "Set the value of a key, only if the key does not exist.\n\nSETNX 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 ["SETNX" key value], :cluster-key-idx 1}
"MEMORY MALLOC-STATS" {:fn-name "memory-malloc-stats", :fn-docstring "Show allocator internal stats.\n\nMEMORY MALLOC-STATS \n\nAvailable since: 4.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["MEMORY" "MALLOC-STATS"], :cluster-key-idx 2}
"HSTRLEN" {:fn-name "hstrlen", :fn-docstring "Get the length of the value of a hash field.\n\nHSTRLEN key field\n\nAvailable since: 3.2.0.\n\nTime complexity: O(1)", :fn-params-fixed [key field], :fn-params-more nil, :req-args-fixed ["HSTRLEN" key field], :cluster-key-idx 1}
