 "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}
 "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}

"SELECT" {:fn-name "select", :fn-docstring "Change the selected database for the current connection.\n\nSELECT index\n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [index], :fn-params-more nil, :req-args-fixed ["SELECT" index], :cluster-key-idx 1}
"MGET" {:fn-name "mget", :fn-docstring "Get the values of all the given keys.\n\nMGET key [key ...]\n\nAvailable since: 1.0.0.\n\nTime complexity: O(N) where N is the number of keys to retrieve.", :fn-params-fixed [key], :fn-params-more [key & args], :req-args-fixed ["MGET" key], :cluster-key-idx 1}
"MONITOR" {:fn-name "monitor", :fn-docstring "Listen for all requests received by the server in real time.\n\nMONITOR \n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["MONITOR"], :cluster-key-idx 1}
"CLUSTER COUNT-FAILURE-REPORTS" {:fn-name "cluster-count-failure-reports", :fn-docstring "Return the number of failure reports active for a given node.\n\nCLUSTER COUNT-FAILURE-REPORTS node-id\n\nAvailable since: 3.0.0.\n\nTime complexity: O(N) where N is the number of failure reports", :fn-params-fixed [node-id], :fn-params-more nil, :req-args-fixed ["CLUSTER" "COUNT-FAILURE-REPORTS" node-id], :cluster-key-idx 2}
"HSET" {:fn-name "hset", :fn-docstring "Set the string value of a hash field.\n\nHSET 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 ["HSET" key field value], :cluster-key-idx 1}
"QUIT" {:fn-name "quit", :fn-docstring "Close the connection.\n\nQUIT \n\nAvailable since: 1.0.0.\n\n", :fn-params-fixed [], :fn-params-more nil, :req-args-fixed ["QUIT"], :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(log(N)) with N being the number of in the stream prior to trim.", :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 string [field string ...]\n\nAvailable since: 5.0.0.\n\nTime complexity: O(log(N)) with N being the number of items already into the stream.", :fn-params-fixed [key ID field string], :fn-params-more [key ID field string & args], :req-args-fixed ["XADD" key ID field string], :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 slave of another instance, or promote it as master.\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 slave 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}
