{
  "schema_version": 2,
  "id": "develop/reference/errors/all/redis",
  "title": "Redis server errors",
  "url": "https://redis.io/docs/latest/develop/reference/errors/all/redis/",
  "summary": "Every error message that the Redis 8.10 server returns",
  "tags": [
    "docs",
    "develop",
    "stack",
    "oss",
    "rs",
    "rc",
    "oss",
    "kubernetes",
    "clients"
  ],
  "last_updated": "2026-11-02T15:10:28+01:00",
  "page_type": "content",
  "content_hash": "68239d60b9c6086ae13c51581762de02edc758857736ede01ca18dbd5a39b26f",
  "sections": [
    {
      "id": "overview",
      "title": "Overview",
      "role": "overview",
      "text": "These are the error messages of the Redis server itself. Each one starts with an error code, also called the error prefix. Most use the general code `ERR`. The others have a code that names the kind of error, such as `WRONGTYPE` or `MOVED`.\n\nWhen an error happens inside a Lua script or function, Redis adds where it happened to the message, such as `script: <sha1>, on @user_script:1.` Some messages only come from a server that runs as Redis Sentinel, or as part of a cluster."
    },
    {
      "id": "commands",
      "title": "Commands",
      "role": "syntax",
      "text": ""
    },
    {
      "id": "wrongtype",
      "title": "WRONGTYPE",
      "role": "content",
      "text": "A command was used on a key that holds a different data type, or a HyperLogLog command was used on a string that isn't a HyperLogLog. See [`WRONGTYPE`](https://redis.io/docs/latest/develop/reference/errors/common/wrongtype) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `WRONGTYPE Key is not a valid HyperLogLog string value.` | The key holds a string that isn't a HyperLogLog, so `PFADD`, `PFCOUNT`, and `PFMERGE` can't use it. Use another key name, or delete the string first; create HyperLogLog keys only with `PFADD` or `PFMERGE`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/wrongtype/#how-to-fix-it) | `PFADD`, `PFCOUNT`, `PFMERGE` |\n| `WRONGTYPE Operation against a key holding the wrong kind of value` | You ran a command on a key that holds a different data type, for example `LPUSH` on a string or `VADD` on a hash. Check the key's type with `TYPE`, then use a command for that type or a different key name. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/wrongtype/#how-to-fix-it) | Commands that use keys |"
    },
    {
      "id": "execabort",
      "title": "EXECABORT",
      "role": "content",
      "text": "A transaction was discarded, either because one of its commands couldn't be queued, or because Redis refused the `EXEC` command itself. See [`EXECABORT`](https://redis.io/docs/latest/develop/reference/errors/common/execabort) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `EXECABORT Transaction discarded because of previous errors.` | Redis refused one of the commands you queued after `MULTI`, for example because of a typo or a wrong number of arguments, so `EXEC` discarded the whole transaction. Check the error that each queued command returned, fix that command, and send the transaction again. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/execabort/#how-to-fix-it) | `EXEC` |\n| `EXECABORT Transaction discarded because of: <error>` | Redis refused the `EXEC` itself for the reason after the colon, such as missing permissions, low memory, or a read-only replica, and discarded the transaction without running any of its commands. Fix that cause, then send the whole transaction again. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/execabort/#how-to-fix-it) | `EXEC` |"
    },
    {
      "id": "noscript",
      "title": "NOSCRIPT",
      "role": "content",
      "text": "`EVALSHA` asked for a script that isn't in the server's script cache. See [`NOSCRIPT`](https://redis.io/docs/latest/develop/reference/errors/common/noscript) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOSCRIPT No matching script. Please use EVAL.` | You called `EVALSHA` with a digest that isn't in the script cache, or isn't 40 characters long. The cache empties on restart, failover, and `SCRIPT FLUSH`, and Redis evicts old `EVAL` scripts, so load the script again with `SCRIPT LOAD` or `EVAL`, then retry. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noscript/#how-to-fix-it) | `EVALSHA`, `EVALSHA_RO` |"
    },
    {
      "id": "busykey",
      "title": "BUSYKEY",
      "role": "content",
      "text": "`RESTORE` tried to create a key that already exists. See [`BUSYKEY`](https://redis.io/docs/latest/develop/reference/errors/common/busykey) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `BUSYKEY Target key name already exists.` | `RESTORE` won't overwrite a key that already exists. Add the `REPLACE` option to overwrite it, or delete the key first. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busykey/#how-to-fix-it) | `RESTORE` |"
    },
    {
      "id": "invalidobj",
      "title": "INVALIDOBJ",
      "role": "content",
      "text": "A HyperLogLog command, such as `PFADD` or `PFCOUNT`, found that the HyperLogLog stored in the key is corrupted. Redis stores a HyperLogLog as a string, so a string command such as `SETRANGE` or `APPEND` can damage it. To fix it, delete the key and add the elements again.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `INVALIDOBJ Corrupted HLL object detected` | The HyperLogLog stored in the key is corrupted, usually because a string command such as `SETRANGE` or `APPEND` changed its bytes. Delete the key and add the elements again with `PFADD`. | `PFADD`, `PFCOUNT`, `PFMERGE` |"
    },
    {
      "id": "ioerr",
      "title": "IOERR",
      "role": "content",
      "text": "[`MIGRATE`](https://redis.io/docs/latest/commands/migrate) couldn't connect to the target server, or reading from it or writing to it failed or took too long. To fix it, check the host and port of the target, check that the target server is running and that this server can reach it, and pass a longer timeout if the keys are large.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `IOERR error or timeout connecting to the client` | `MIGRATE` couldn't connect to the target server within the timeout. Despite the wording, client means the target server. Check its host and port, that it's running, and that this server can reach it. | `MIGRATE` |\n| `IOERR error or timeout reading to target instance` | `MIGRATE` connected to the target server, but reading its reply failed or took longer than the timeout. Check that the target is healthy, and pass a longer timeout for large keys. | `MIGRATE` |\n| `IOERR error or timeout writing to target instance` | `MIGRATE` connected to the target server, but sending the data failed or took longer than the timeout. Check the network and the target server, and pass a longer timeout for large keys. | `MIGRATE` |"
    },
    {
      "id": "scripts-and-functions",
      "title": "Scripts and functions",
      "role": "content",
      "text": ""
    },
    {
      "id": "busy",
      "title": "BUSY",
      "role": "content",
      "text": "A Lua script, function, or module command has run for too long, and Redis is blocked until it ends. See [`BUSY`](https://redis.io/docs/latest/develop/reference/errors/common/busy) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `BUSY <message>` | A module command has been running for a long time and blocks the server, and the text after `BUSY` comes from that module. Wait for the command to finish and retry. `SHUTDOWN NOSAVE` still works if you need to stop the server. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | Any command |\n| `BUSY Redis is busy running a module command.` | A module command has been running for a long time and blocks the server, so it accepts only a few commands. Wait for it to finish and retry. No command can stop it, apart from stopping the server with `SHUTDOWN NOSAVE`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | Any command |\n| `BUSY Redis is busy running a script. You can only call FUNCTION KILL or SHUTDOWN NOSAVE.` | A function, run with `FCALL`, has run longer than `busy-reply-threshold` and blocks the server. Stop it with `FUNCTION KILL` if it hasn't written any data yet, or wait for it. `SHUTDOWN NOSAVE` stops the server without saving. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | Any command |\n| `BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.` | A Lua script, run with `EVAL` or `EVALSHA`, has run longer than `busy-reply-threshold` and blocks the server. Stop it with `SCRIPT KILL` if it hasn't written any data yet, or wait for it. `SHUTDOWN NOSAVE` stops the server without saving. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | Any command |"
    },
    {
      "id": "unkillable",
      "title": "UNKILLABLE",
      "role": "content",
      "text": "`SCRIPT KILL` or `FUNCTION KILL` can't stop the script that's running. Either the script has already changed data, so stopping it would leave the change half done, or the script came from the primary through replication. See [`BUSY`](https://redis.io/docs/latest/develop/reference/errors/common/busy#how-to-fix-it) for your options.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.` | You ran `SCRIPT KILL` or `FUNCTION KILL`, but the running script has already changed data, so stopping it would leave the change half done. Wait for the script to finish, or run `SHUTDOWN NOSAVE` to stop the server without saving. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | `FUNCTION KILL`, `SCRIPT KILL` |\n| `UNKILLABLE The busy script was sent by a master instance in the context of replication and cannot be killed.` | You ran `SCRIPT KILL` or `FUNCTION KILL` on a replica, but the busy script came from its primary through replication, and a replica never stops a script that its primary sent. Wait for the script to finish. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | `FUNCTION KILL`, `SCRIPT KILL` |"
    },
    {
      "id": "notbusy",
      "title": "NOTBUSY",
      "role": "content",
      "text": "You ran [`SCRIPT KILL`](https://redis.io/docs/latest/commands/script-kill) or [`FUNCTION KILL`](https://redis.io/docs/latest/commands/function-kill), but no script or function is running. It may have finished already, so there's nothing to stop.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOTBUSY No scripts in execution right now.` | You ran `SCRIPT KILL` or `FUNCTION KILL`, but no script or function is running, so there's nothing to stop. It may have finished already. | `FUNCTION KILL`, `SCRIPT KILL` |"
    },
    {
      "id": "clusters",
      "title": "Clusters",
      "role": "content",
      "text": ""
    },
    {
      "id": "moved",
      "title": "MOVED",
      "role": "content",
      "text": "The key belongs to a hash slot that another cluster node serves. See [`MOVED`](https://redis.io/docs/latest/develop/reference/errors/common/moved) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `MOVED <slot> <endpoint>:<port>` | The key's hash slot, shown in the message, is served by another node, at the address in the message. Send the command to that node. Cluster-aware clients follow this redirect and update their slot map for you. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/moved/#how-to-fix-it) | Commands that use keys |"
    },
    {
      "id": "ask",
      "title": "ASK",
      "role": "content",
      "text": "The key's hash slot is moving to another cluster node, and the key may already be there. See [`ASK`](https://redis.io/docs/latest/develop/reference/errors/common/ask) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `ASK <slot> <endpoint>:<port>` | The key's hash slot, shown in the message, is moving to the node at the address in the message, and the key may already be there. Send `ASKING` and then the command to that node, once. Cluster-aware clients do this for you. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/ask/#how-to-fix-it) | Commands that use keys |"
    },
    {
      "id": "crossslot",
      "title": "CROSSSLOT",
      "role": "content",
      "text": "A command used keys that belong to different hash slots. See [`CROSSSLOT`](https://redis.io/docs/latest/develop/reference/errors/common/crossslot) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `CROSSSLOT Keys in request don't hash to the same slot` | The command uses several keys that belong to different hash slots, which a cluster can't serve in one command. Put the keys in the same slot with a hash tag, such as `{user1}:name` and `{user1}:email`, or send one command per key. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/crossslot/#how-to-fix-it) | Commands that use several keys |"
    },
    {
      "id": "tryagain",
      "title": "TRYAGAIN",
      "role": "content",
      "text": "A command with several keys ran while their hash slot was moving between nodes, or a write reached a node while it was deleting all the keys of that slot. See [`TRYAGAIN`](https://redis.io/docs/latest/develop/reference/errors/common/tryagain) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `TRYAGAIN Multiple keys request during rehashing of slot` | The command uses several keys in a hash slot that's moving between nodes, and not all of the keys are on this node. Wait a moment and send the command again. The move usually finishes soon. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/tryagain/#how-to-fix-it) | Commands that use several keys |\n| `TRYAGAIN Slot is being trimmed` | You sent a write to a node that's deleting all the keys of that hash slot, for example because the slot moved to another node. Wait for the deletion to finish, then retry. The slot may now be served by another node. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/tryagain/#how-to-fix-it) | Commands that write data |"
    },
    {
      "id": "clusterdown",
      "title": "CLUSTERDOWN",
      "role": "content",
      "text": "The cluster can't serve the command because a hash slot has no working node. See [`CLUSTERDOWN`](https://redis.io/docs/latest/develop/reference/errors/common/clusterdown) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `CLUSTERDOWN Hash slot not served` | The command uses a key whose hash slot isn't assigned to any node, so no node can serve it. Check the slot coverage with `CLUSTER SLOTS`, and assign the missing slots with `CLUSTER ADDSLOTS` or `CLUSTER ADDSLOTSRANGE`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/clusterdown/#how-to-fix-it) | Commands that use keys |\n| `CLUSTERDOWN The cluster is down` | The cluster is in the failed state, for example because some hash slots have no working node, so this node refuses commands that use keys. Fix the failed nodes or the slot coverage. To keep serving reads meanwhile, set `cluster-allow-reads-when-down` to `yes`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/clusterdown/#how-to-fix-it) | Commands that use keys |\n| `CLUSTERDOWN The cluster is down and only accepts read commands` | The cluster is in the failed state, and because `cluster-allow-reads-when-down` is `yes`, this node still serves reads but refuses writes. Fix the failed nodes or the slot coverage, then retry the write. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/clusterdown/#how-to-fix-it) | Commands that write data |"
    },
    {
      "id": "notready",
      "title": "NOTREADY",
      "role": "content",
      "text": "The nodes of a cluster send each other `CLUSTER SYNCSLOTS` while they move hash slots. A node returns this error when it isn't ready to move slots yet. Apps don't send this command, so you only see this error in the logs of cluster tools.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOTREADY Cluster is not ready to migrate slots` | The source node isn't ready to start moving the slots yet, so the importing node tries again later by itself. You see this only in logs. If it doesn't clear, check the source node's log. | `CLUSTER SYNCSLOTS` |"
    },
    {
      "id": "memory-and-persistence",
      "title": "Memory and persistence",
      "role": "content",
      "text": ""
    },
    {
      "id": "oom",
      "title": "OOM",
      "role": "content",
      "text": "Redis has reached its memory limit and can't make room for new data. See [`OOM`](https://redis.io/docs/latest/develop/reference/errors/common/oom) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `OOM allow-oom flag is not set on the script, can not run it when used memory > 'maxmemory'` | Redis is over its `maxmemory` limit, and the script or function you called has neither the `allow-oom` nor the `no-writes` flag. Free memory or raise `maxmemory`; if the code only reads, add `no-writes` so it can run anyway. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/oom/#how-to-fix-it) | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |\n| `OOM command not allowed when used memory > 'maxmemory'.` | Redis has reached its `maxmemory` limit and couldn't free enough memory by evicting keys, so it refuses commands that can add data. Delete keys you don't need, raise `maxmemory`, or set a `maxmemory-policy` that can evict your keys. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/oom/#how-to-fix-it) | Commands that write data |\n| `OOM command not allowed when used memory > 'maxmemory'. script: <script>, on <source>:<line>.` | Your script called a command that can add data while Redis is over its `maxmemory` limit and can't evict keys to make room. Free memory, raise `maxmemory`, or choose a `maxmemory-policy` that evicts keys, then retry. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/oom/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |"
    },
    {
      "id": "misconf",
      "title": "MISCONF",
      "role": "content",
      "text": "Redis stopped accepting writes because it couldn't save your data to disk. See [`MISCONF`](https://redis.io/docs/latest/develop/reference/errors/common/misconf) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `MISCONF Errors writing to the AOF file: <reason>` | Redis couldn't write or sync its append-only file (AOF), so it refuses write commands and `PING` until a write succeeds. The end of the message gives the operating system's reason, such as a full disk; once you fix it, Redis accepts writes again. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/misconf/#how-to-fix-it) | Commands that write data |\n| `MISCONF Errors writing to the AOF file: <reason> script: <script>, on <source>:<line>.` | Your script tried to write while Redis can't write to its append-only file (AOF), for the reason shown, such as a full disk. Redis refuses writes until the AOF works again, so fix the cause that the Redis log gives, then retry. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/misconf/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `MISCONF Redis is configured to persist data to AOF, but it's currently unable to persist to disk. Writable scripts are blocked. Use 'no-writes' flag for read only scripts. AOF error: <reason>` | Redis can't write to its append-only file (AOF), for the reason at the end of the message, so it refuses scripts and functions that may write. Fix the disk problem; if the code only reads, add the `no-writes` flag so it can still run. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/misconf/#how-to-fix-it) | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |\n| `MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.` | The last background snapshot (RDB file) failed, and `stop-writes-on-bgsave-error` is `yes`, so Redis refuses write commands and `PING`. Check the Redis log for the reason and fix it, then run `BGSAVE`; writes work again once a snapshot succeeds. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/misconf/#how-to-fix-it) | Commands that write data |\n| `MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error. script: <script>, on <source>:<line>.` | Your script tried to write after the last snapshot failed, and `stop-writes-on-bgsave-error` makes Redis refuse writes until saving works again. Find the reason in the Redis log, fix it, and run `BGSAVE`; when it succeeds, writes work again. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/misconf/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Writable scripts are blocked. Use 'no-writes' flag for read only scripts.` | The last snapshot failed, and `stop-writes-on-bgsave-error` is on, so Redis refuses scripts and functions that may write. Fix the cause that the Redis log gives and run `BGSAVE`; if the code only reads, add the `no-writes` flag so it can still run. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/misconf/#how-to-fix-it) | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |"
    },
    {
      "id": "connections-and-security",
      "title": "Connections and security",
      "role": "content",
      "text": ""
    },
    {
      "id": "noauth",
      "title": "NOAUTH",
      "role": "content",
      "text": "The server requires a password, and the connection hasn't authenticated. See [`NOAUTH`](https://redis.io/docs/latest/develop/reference/errors/common/noauth) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOAUTH Authentication required.` | The server requires a password, and this connection hasn't authenticated yet. Send `AUTH` with your password, or with your user name and password, before other commands, or set them in your client's connection settings. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noauth/#how-to-fix-it) | Any command |\n| `NOAUTH HELLO must be called with the client already authenticated, otherwise the HELLO <proto> AUTH <user> <pass> option can be used to authenticate the client and select the RESP protocol version at the same time` | The server requires authentication, and you sent `HELLO` on a connection that hasn't authenticated. Add `AUTH` with a user name and password to the same command, as in `HELLO 3 AUTH default mypassword`, or run `AUTH` first. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noauth/#how-to-fix-it) | `HELLO` |"
    },
    {
      "id": "wrongpass",
      "title": "WRONGPASS",
      "role": "content",
      "text": "The username or password is wrong, or the user is disabled. See [`WRONGPASS`](https://redis.io/docs/latest/develop/reference/errors/common/wrongpass) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `WRONGPASS invalid internal password` | A connection authenticated as `internal connection`, the username that cluster nodes use with each other, but the secret it sent doesn't match this cluster's internal secret. Apps should authenticate as a normal user instead. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/wrongpass/#how-to-fix-it) | `AUTH` |\n| `WRONGPASS invalid username-password pair or user is disabled.` | `AUTH` or `HELLO` failed because the user doesn't exist, the password is wrong, or the user is disabled. Check the username and password that your client sends, and as an administrator check the user with `ACL GETUSER`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/wrongpass/#how-to-fix-it) | `AUTH`, `HELLO` |"
    },
    {
      "id": "noperm",
      "title": "NOPERM",
      "role": "content",
      "text": "The user is authenticated but isn't allowed to run the command, use the key, or use the channel. See [`NOPERM`](https://redis.io/docs/latest/develop/reference/errors/common/noperm) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOPERM ACLs rules changed between the moment the transaction was accumulated and the EXEC call. This command is no longer allowed for the following reason: no permission` | The access control list (ACL) rules for your user changed between queueing this command and `EXEC`, and the user can no longer run it. Redis skips that command but runs the others in the transaction; restore the permission or update your app, then retry. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EXEC` |\n| `NOPERM ACLs rules changed between the moment the transaction was accumulated and the EXEC call. This command is no longer allowed for the following reason: no permission to access one of the channels used as arguments` | The access control list (ACL) rules for your user changed after you queued this command, and the user can no longer use one of its Pub/Sub channels. Redis skips that command but runs the rest of the transaction; grant the channel with `ACL SETUSER`, or remove the command. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EXEC` |\n| `NOPERM ACLs rules changed between the moment the transaction was accumulated and the EXEC call. This command is no longer allowed for the following reason: no permission to execute the command or subcommand` | The access control list (ACL) rules for your user changed after you queued this command, and the user can no longer run that command or subcommand. Redis skips it but runs the rest of the transaction; grant the command with `ACL SETUSER`, or remove it. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EXEC` |\n| `NOPERM ACLs rules changed between the moment the transaction was accumulated and the EXEC call. This command is no longer allowed for the following reason: no permission to touch the specified keys` | The access control list (ACL) rules for your user changed after you queued this command, and the user can no longer access one of the keys it uses. Redis skips it but runs the rest of the transaction; grant the key pattern with `ACL SETUSER`, or remove the command. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EXEC` |\n| `NOPERM No permissions to access a channel` | Your user's access control list (ACL) rules don't allow the channel you used, for example in `PUBLISH` or `SUBSCRIBE`. Run `ACL LOG` to see which channel was refused, then allow it with a `&` pattern in `ACL SETUSER`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | Commands that use channels |\n| `NOPERM No permissions to access a key` | Your user's access control list (ACL) rules don't allow a key in the command, or the read or write access the command needs. Run `ACL LOG` to see which key was refused, then allow it with a `~` or `%` pattern in `ACL SETUSER`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | Commands that use keys |\n| `NOPERM User <username> has no permissions to run the '<command>' command` | The user in the message is authenticated but isn't allowed to run that command. Connect as a user that has the permission, or allow the command with `ACL SETUSER`, for example `+set` or a category such as `+@write`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | Any command |"
    },
    {
      "id": "denied",
      "title": "DENIED",
      "role": "content",
      "text": "Protected mode refused a connection from another computer, because the server has no password. See [`DENIED`](https://redis.io/docs/latest/develop/reference/errors/common/denied) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Set up an authentication password for the default user. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.` | Redis refused your connection because protected mode is on, the default user has no password, and you connected from another computer. Set a password for the default user, or turn off `protected-mode` only if the server can't be reached from the internet. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/denied/#how-to-fix-it) | New connections |"
    },
    {
      "id": "noproto",
      "title": "NOPROTO",
      "role": "content",
      "text": "[`HELLO`](https://redis.io/docs/latest/commands/hello) asked for a version of the Redis serialization protocol (RESP) that the server doesn't support. Redis supports versions 2 and 3. To fix it, send `HELLO 2` or `HELLO 3`.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOPROTO unsupported protocol version` | You asked `HELLO` for a protocol version that Redis doesn't support. Redis supports versions 2 and 3, so send `HELLO 2` or `HELLO 3`. | `HELLO` |"
    },
    {
      "id": "replication-and-server-state",
      "title": "Replication and server state",
      "role": "content",
      "text": ""
    },
    {
      "id": "readonly",
      "title": "READONLY",
      "role": "content",
      "text": "A command that changes data was sent to a read-only replica. See [`READONLY`](https://redis.io/docs/latest/develop/reference/errors/common/readonly) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `READONLY Can not run script with write flag on readonly replica` | You called a script or function without the `no-writes` flag on a read-only replica, which refuses anything that may write. Send it to the primary, or add `no-writes` if the code only reads. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/readonly/#how-to-fix-it) | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |\n| `READONLY You can't write against a read only replica.` | You sent a write command to a replica, which accepts only reads while `replica-read-only` is `yes`. Send writes to the primary. After a failover, your client may still be connected to a node that has become a replica. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/readonly/#how-to-fix-it) | Commands that write data |\n| `READONLY You can't write against a read only replica. script: <script>, on <source>:<line>.` | Your script called a command that writes, but the server is a read-only replica. Send scripts that write to the primary, and run only read-only scripts on replicas, for example with `EVAL_RO`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/readonly/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |"
    },
    {
      "id": "masterdown",
      "title": "MASTERDOWN",
      "role": "content",
      "text": "A replica lost its link to its primary and is set not to serve data that may be out of date. See [`MASTERDOWN`](https://redis.io/docs/latest/develop/reference/errors/common/masterdown) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `MASTERDOWN Link with MASTER is down and replica-serve-stale-data is set to 'no'.` | This replica lost its link to the primary, and `replica-serve-stale-data` is `no`, so it refuses commands that read or write data. Wait for the link to recover and check the primary and the network, or set `replica-serve-stale-data` to `yes` to serve possibly outdated data. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/masterdown/#how-to-fix-it) | Commands that use keys |\n| `MASTERDOWN Link with MASTER is down, replica-serve-stale-data is set to 'no' and 'allow-stale' flag is not set on the script.` | This replica lost its link to the primary, `replica-serve-stale-data` is `no`, and your script or function doesn't have the `allow-stale` flag. Wait for the link to recover, or add `allow-stale` if the code can safely run on outdated data. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/masterdown/#how-to-fix-it) | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |"
    },
    {
      "id": "noreplicas",
      "title": "NOREPLICAS",
      "role": "content",
      "text": "The primary accepts writes only when enough replicas are connected, and there aren't enough. See [`NOREPLICAS`](https://redis.io/docs/latest/develop/reference/errors/common/noreplicas) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOREPLICAS Not enough good replicas to write.` | The primary has fewer connected replicas than `min-replicas-to-write` requires, counting only those whose lag is within `min-replicas-max-lag` seconds, so it refuses writes. Check your replicas with `INFO replication`, or lower `min-replicas-to-write`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noreplicas/#how-to-fix-it) | Commands that write data |\n| `NOREPLICAS Not enough good replicas to write. script: <script>, on <source>:<line>.` | Your script tried to write while the primary has fewer good replicas than `min-replicas-to-write` requires, so Redis refused the write. Check your replicas with `INFO replication`, or lower `min-replicas-to-write`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noreplicas/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |"
    },
    {
      "id": "loading",
      "title": "LOADING",
      "role": "content",
      "text": "Redis is still loading its data into memory and can't serve the command yet. See [`LOADING`](https://redis.io/docs/latest/develop/reference/errors/common/loading) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `LOADING Redis is loading the dataset in memory` | Redis is loading its data into memory, after a restart or from its primary, and can't run this command yet. Wait and retry. `INFO persistence` shows the loading progress. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/loading/#how-to-fix-it) | Any command |"
    },
    {
      "id": "unblocked",
      "title": "UNBLOCKED",
      "role": "content",
      "text": "A blocking command, such as `BLPOP`, stopped waiting before it got a result. Either another client stopped it with [`CLIENT UNBLOCK`](https://redis.io/docs/latest/commands/client-unblock) and the `ERROR` option, or the server became a replica while the command was waiting, for example, during a failover. To fix it, send the command again. If the server became a replica, send it to the new primary.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `UNBLOCKED client unblocked via CLIENT UNBLOCK` | Another connection ended your blocking command, such as `BLPOP` or `XREAD`, early with `CLIENT UNBLOCK` and the `ERROR` option. Send the command again if you still need its result. | Blocking commands |\n| `UNBLOCKED force unblock from blocking operation, instance state changed (master -> replica?)` | Your blocking command, such as `BLPOP` or `XREAD` with `BLOCK`, was stopped because the server became a replica while you waited, for example during a failover. Redis also closes the connection. Reconnect to the new primary and send the command again. | Blocking commands |"
    },
    {
      "id": "streams",
      "title": "Streams",
      "role": "content",
      "text": ""
    },
    {
      "id": "nogroup",
      "title": "NOGROUP",
      "role": "content",
      "text": "A stream command named a consumer group or stream that doesn't exist. See [`NOGROUP`](https://redis.io/docs/latest/develop/reference/errors/common/nogroup) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOGROUP No such consumer group '<group>' for key name '<key>'` | The stream named in the message has no consumer group with that name. Check the group name, which is case-sensitive, or create the group with `XGROUP CREATE`; `XINFO GROUPS` lists the existing groups. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/nogroup/#how-to-fix-it) | `XGROUP CREATECONSUMER`, `XGROUP DELCONSUMER`, `XGROUP SETID`, `XINFO CONSUMERS` |\n| `NOGROUP No such key '<key>' or consumer group '<group>'` | Either the stream key doesn't exist, or it has no consumer group with that name. Check both names, and create the group with `XGROUP CREATE`, adding `MKSTREAM` if the stream doesn't exist yet. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/nogroup/#how-to-fix-it) | `XNACK`, `XPENDING`, `XCLAIM`, `XAUTOCLAIM` |\n| `NOGROUP No such key '<key>' or consumer group '<group>' in XREADGROUP with GROUP option` | `XREADGROUP` can't read, because the stream key doesn't exist or has no group with that name. Create the group with `XGROUP CREATE`, with `MKSTREAM` if needed. Groups are lost when the stream key is deleted, for example when it expires. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/nogroup/#how-to-fix-it) | `XREADGROUP` |"
    },
    {
      "id": "busygroup",
      "title": "BUSYGROUP",
      "role": "content",
      "text": "`XGROUP CREATE` tried to create a consumer group that already exists. See [`BUSYGROUP`](https://redis.io/docs/latest/develop/reference/errors/common/busygroup) for how to fix it.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `BUSYGROUP Consumer Group name already exists` | `XGROUP CREATE` named a consumer group that already exists on this stream. Use the existing group, choose another name, or delete the group first with `XGROUP DESTROY`. Apps that create their groups at startup often treat this error as success. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busygroup/#how-to-fix-it) | `XGROUP CREATE` |"
    },
    {
      "id": "redis-sentinel",
      "title": "Redis Sentinel",
      "role": "content",
      "text": "These errors only come from a server that runs as [Redis Sentinel](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel)."
    },
    {
      "id": "inprog",
      "title": "INPROG",
      "role": "content",
      "text": "[`SENTINEL FAILOVER`](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel) asked for a failover of a primary that's already failing over. Wait for the running failover to finish.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `INPROG Failover already in progress` | You ran `SENTINEL FAILOVER`, but a failover of that primary is already running. Wait for it to finish, then check the new primary with `SENTINEL GET-MASTER-ADDR-BY-NAME`. | `SENTINEL FAILOVER` |"
    },
    {
      "id": "nogoodslave",
      "title": "NOGOODSLAVE",
      "role": "content",
      "text": "`SENTINEL FAILOVER` found no replica that it can promote to primary. For example, the replicas are disconnected, or their `replica-priority` is `0`, which means they must never be promoted. To fix it, check the replicas with `SENTINEL REPLICAS <primary-name>`, and bring at least one of them back.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOGOODSLAVE No suitable replica to promote` | You ran `SENTINEL FAILOVER`, but no replica of the primary can be promoted: there are none, or they're down, disconnected, not answering, or have `replica-priority` set to 0. Check the replicas with `SENTINEL REPLICAS`. | `SENTINEL FAILOVER` |"
    },
    {
      "id": "noquorum",
      "title": "NOQUORUM",
      "role": "content",
      "text": "`SENTINEL CKQUORUM` found that not enough Sentinels are reachable. Either there are too few to reach the quorum that you set for this primary, or too few to form the majority that must authorize a failover. To fix it, check that your Sentinels are running and can reach each other.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `NOQUORUM <count> usable Sentinels. Not enough available Sentinels to reach the majority and authorize a failover` | `SENTINEL CKQUORUM` found that a majority of the Sentinels that know this primary isn't reachable, so they couldn't authorize a failover. The number in the message counts the reachable Sentinels, including this one; bring the others back or fix the network between them. | `SENTINEL CKQUORUM` |\n| `NOQUORUM <count> usable Sentinels. Not enough available Sentinels to reach the specified quorum for this master` | `SENTINEL CKQUORUM` found fewer reachable Sentinels than the quorum set for this primary, so they couldn't agree that it's down. The number in the message counts the reachable Sentinels, including this one; start more Sentinels, fix their connections, or lower the quorum with `SENTINEL SET`. | `SENTINEL CKQUORUM` |\n| `NOQUORUM <count> usable Sentinels. Not enough available Sentinels to reach the specified quorum for this master. Not enough available Sentinels to reach the majority and authorize a failover` | `SENTINEL CKQUORUM` found too few reachable Sentinels to reach this primary's quorum or to form the majority that authorizes a failover. The number in the message counts the reachable Sentinels, including this one; bring more Sentinels online or fix the network. | `SENTINEL CKQUORUM` |"
    },
    {
      "id": "err",
      "title": "ERR",
      "role": "content",
      "text": "`ERR` is the general-purpose code. The description after it says what went wrong, and it usually names the command, argument, or setting at fault. Five common `ERR` errors have their own pages:\n\n- [`ERR unknown command`](https://redis.io/docs/latest/develop/reference/errors/common/err-unknown-command)\n- [`ERR wrong number of arguments`](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments)\n- [`ERR syntax error`](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error)\n- [`ERR value is not an integer or out of range`](https://redis.io/docs/latest/develop/reference/errors/common/err-not-an-integer)\n- [`ERR max number of clients reached`](https://redis.io/docs/latest/develop/reference/errors/common/err-max-clients)\n\nFor any other `ERR` error, compare your command with the syntax on its command page. Most of these messages are listed with the commands that return them.\n\n| Error message | Explanation | Returned by |\n|---|---|---|\n| `ERR '<filename>:<line>: username '<username>' contains invalid characters.` | `ACL LOAD` found a username in the access control list (ACL) file that contains a whitespace character, such as a tab, or a null character. Fix the `user` line at the line number in the message and run `ACL LOAD` again. No users were changed. | `ACL LOAD` |\n| `ERR '<option>' must not contain control characters` | You ran `SENTINEL CONFIG SET` with a value for the option named in the message that contains a control character, such as a newline or a tab. Remove the control characters from the value. | `SENTINEL CONFIG` |\n| `ERR <filename>:<line> should start with user keyword followed by the username.` | A line in the access control list (ACL) file doesn't start with the lowercase keyword `user` followed by a username, as every line other than comments and blank lines must. Fix the line named in the message and run `ACL LOAD` again. | `ACL LOAD` |\n| `ERR <filename>:<line>: <reason>.` | A rule on that line of the access control list (ACL) file is invalid, and the text after the line number says why, for example `Syntax error` or a bad password hash. Fix the rule and run `ACL LOAD` again. No users were changed. | `ACL LOAD` |\n| `ERR <filename>:<line>: Error in applying operation '<operation>': Unknown command or category name in ACL.` | A rule on that line of the access control list (ACL) file names a command or category that this server doesn't know, for example a misspelled command or one from a module that isn't loaded. Fix or remove that rule and run `ACL LOAD` again. | `ACL LOAD` |\n| `ERR <filename>:<line>: unbalanced quotes in acl line.` | `ACL LOAD` reports this when it can't split a line of the access control list (ACL) file into words. Redis 8.10 splits these lines on spaces and doesn't treat quotes specially, so this normally doesn't appear. If it does, check that line for stray characters. | `ACL LOAD` |\n| `ERR <filename>:<line>: Unmatched parenthesis in selector definition.` | A selector on that line of the access control list (ACL) file starts with `(` but is never closed with `)`. Close the selector, for example `(~app:* +get)`, and run `ACL LOAD` again. No users were changed. | `ACL LOAD` |\n| `ERR <option> cannot contain spaces, newlines or special characters.` | The value you passed to `CLIENT SETINFO` for the option in the message, `lib-name` or `lib-ver`, has a space, a newline, or another character that isn't plain and visible. Use only unaccented letters, digits, and punctuation, such as `redis-py` or `5.0.1`. | `CLIENT SETINFO` |\n| `ERR A backup is already in progress, ABORT it first` | You ran `BACKUP START` while another backup is still being made. Finish it with `BACKUP SEAL` or cancel it with `BACKUP ABORT`, then start again. `BACKUP STATUS` shows its state. | `BACKUP START` |\n| `ERR A client can only redirect to a single other client` | You passed `REDIRECT` more than once to `CLIENT TRACKING`. Invalidation messages can go to only one other connection, so give a single `REDIRECT` with that connection's client ID. | `CLIENT TRACKING` |\n| `ERR A sealed backup exists, CLEANUP it first` | A sealed backup is still in the backup directory, so `BACKUP START` won't replace it. Copy its files, which `BACKUP LIST` shows, then run `BACKUP CLEANUP` and start the new backup. | `BACKUP START` |\n| `ERR ACL failure in script: No permissions to access a channel script: <script>, on <source>:<line>.` | A script or function used a channel, for example with `PUBLISH`, that your user's access control list (ACL) rules don't allow. Scripts run with the caller's permissions. Allow the channel with a `&` pattern in `ACL SETUSER`, or call the script as a user with access. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR ACL failure in script: No permissions to access a key script: <script>, on <source>:<line>.` | A script or function used a key that your user's access control list (ACL) rules don't allow. Scripts run with the caller's permissions. Allow the key with a `~` pattern in `ACL SETUSER`, or run the script as a user that has access. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR ACL failure in script: User <username> has no permissions to run the '<command>' command script: <script>, on <source>:<line>.` | A script or function called a command, through `redis.call` or `redis.pcall`, that the user in the message isn't allowed to run. Allowing `EVAL` or `FCALL` doesn't allow the commands inside the script, so add each one to the user's rules with `ACL SETUSER`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/noperm/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR ACL GENPASS argument must be the number of bits for the output password, a positive number up to 4096` | The number of bits you passed to `ACL GENPASS` is out of range. Pass a whole number from 1 to 4096, or leave it out to get a 256-bit password. | `ACL GENPASS` |\n| `ERR all slot states must be STABLE to start a slot migration task.` | A legacy slot migration is open on this node: some slot is set to `MIGRATING` or `IMPORTING` with `CLUSTER SETSLOT`. Finish that migration, or run `CLUSTER SETSLOT` with `STABLE` on the slot, before you start an atomic slot migration. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS` |\n| `ERR An LFU maxmemory policy is not selected, access frequency not tracked. Please note that when switching between policies at runtime LRU and LFU data will take some time to adjust.` | `OBJECT FREQ` reports how often a key is accessed, which Redis tracks only under a least frequently used (LFU) eviction policy. Set `maxmemory-policy` to `allkeys-lfu` or `volatile-lfu`, or use `OBJECT IDLETIME` with the current policy. | `OBJECT FREQ` |\n| `ERR An LFU maxmemory policy is selected, idle time not tracked. Please note that when switching between policies at runtime LRU and LFU data will take some time to adjust.` | `OBJECT IDLETIME` reports idle time, which Redis doesn't track while `maxmemory-policy` is a least frequently used (LFU) policy, `allkeys-lfu` or `volatile-lfu`. Use `OBJECT FREQ` instead, or switch to another policy. | `OBJECT IDLETIME` |\n| `ERR Another ASM task is already in progress` | A node asked this node to start sending it slots, but this node is already running another atomic slot migration. Nodes send this to each other, so you see it in logs or in `CLUSTER MIGRATION STATUS`. Wait for the running migration, or cancel it. | `CLUSTER SYNCSLOTS` |\n| `ERR another ASM task is already in progress` | This node is already running an atomic slot migration, and it runs only one at a time. Check it with `CLUSTER MIGRATION STATUS ALL`, then wait for it to finish or stop it with `CLUSTER MIGRATION CANCEL`. | `CLUSTER MIGRATION` |\n| `ERR Another child process is active (AOF?): can't BGSAVE right now. Use BGSAVE SCHEDULE in order to schedule a BGSAVE whenever possible.` | Another background process, usually a rewrite of the append-only file (AOF), is running, so `BGSAVE` can't start now. Run `BGSAVE SCHEDULE` to start the save as soon as possible, or wait and retry. | `BGSAVE` |\n| `ERR Another migration task is already in progress` | During an atomic slot migration, the importing node opened its data connection for a task that this node isn't running or isn't ready for. This is internal to the migration. Check `CLUSTER MIGRATION STATUS` on the importing node, and import again if the task failed. | `CLUSTER SYNCSLOTS` |\n| `ERR applied increment would be Infinity` | With `SATURATE`, `INCREX` capped the result at a bound so far from the current value that it can't represent the difference, which it returns as the applied increment. Use bounds closer to the current value, or reset the key first. | `INCREX` |\n| `ERR applied increment would overflow` | With `SATURATE`, `INCREX` capped the result at a bound so far from the current value that the difference, which it returns as the applied increment, doesn't fit in a 64-bit integer. Use bounds closer to the current value, or reset the key first. | `INCREX` |\n| `ERR array index overflow` | `ARSET` would write past the last valid array index, 18446744073709551614, because the start index plus the number of values is too large. Use a smaller start index or fewer values. | `ARSET` |\n| `ERR at least 1 input key is needed for '<command>' command` | The number of input keys you passed to the command named in the message is 0 or negative. Pass the number of source keys that follow it, which must be at least 1. | `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZUNION`, `ZUNIONSTORE` |\n| `ERR At least one parameter must be specified` | You ran `XCFGSET` with only a key. Add `IDMP-DURATION`, `IDMP-MAXSIZE` or both, each followed by its value. | `XCFGSET` |\n| `ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?` | You sent `AUTH` with only a password, but the default user has no password, so there's nothing to check. Remove the `AUTH` call, set a password with `requirepass` or `ACL SETUSER`, or also send a username if you meant another user. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/wrongpass/#how-to-fix-it) | `AUTH` |\n| `ERR Background append only file rewriting already in progress` | An append-only file (AOF) rewrite is already running, so `BGREWRITEAOF` didn't start another one. Wait for it to finish. `INFO persistence` shows `aof_rewrite_in_progress:1` while it runs. | `BGREWRITEAOF` |\n| `ERR Background save already in progress` | A background save is already running, so `SAVE` or `BGSAVE` can't start another one. Wait until `INFO persistence` shows `rdb_bgsave_in_progress:0`, then retry if you still need a new snapshot. | `SAVE`, `BGSAVE` |\n| `ERR Backup directory <dirname> is not empty, CLEANUP it first` | The backup directory in the message already has files in it, for example from an earlier backup that failed or was aborted. `BACKUP CLEANUP` deletes every file in that directory, so copy anything you need first, then run `BACKUP START` again. | `BACKUP START` |\n| `ERR Backup is in progress` | `BACKUP CLEANUP` can't run while a backup is still being made. Seal the backup with `BACKUP SEAL` or cancel it with `BACKUP ABORT` first. | `BACKUP CLEANUP` |\n| `ERR Bad data format` | The `RESTORE` payload passed the version and checksum checks, but Redis couldn't read the value in it. Common causes are a module data type whose module isn't loaded on this server, or a payload that fails the `sanitize-dump-payload` check. | `RESTORE` |\n| `ERR Bad number of keys provided` | The numkeys argument of `FCALL` or `FCALL_RO`, right after the function name, isn't an integer. Pass the number of key names that follow it, such as `0` when the function uses no keys. | `FCALL`, `FCALL_RO` |\n| `ERR BGSAVE failed, replication can't continue` | The primary couldn't start the background save it needs for a full sync, so it dropped this replica's sync request. You see this in the replica's log; check the primary's log for the reason, often too little memory to fork or a full disk. | `CLUSTER SYNCSLOTS` |\n| `ERR bit is not an integer or out of range` | The value argument of `SETBIT` must be `0` or `1`, and you passed something else. To write a number wider than one bit, use `BITFIELD`. | `SETBIT` |\n| `ERR bit offset is not an integer or out of range` | The bit offset isn't a whole number of 0 or more, or it points past the largest string Redis allows, set by `proto-max-bulk-len`. By default, the highest offset is 4294967295. In `BITFIELD`, an offset that starts with `#` is multiplied by the field width first. | `BITFIELD`, `BITFIELD_RO`, `GETBIT`, `SETBIT` |\n| `ERR BITFIELD_RO only supports the GET subcommand` | `BITFIELD_RO` is the read-only form of `BITFIELD`, so it accepts only `GET` operations. Use `BITFIELD` to run `SET` or `INCRBY`. | `BITFIELD_RO` |\n| `ERR BITOP <operation> must be called with at least two source keys.` | The `DIFF`, `DIFF1`, and `ANDOR` operations of `BITOP` compare a first key with one or more others, so they need at least two source keys after the destination key. Add the missing source key. | `BITOP` |\n| `ERR BITOP NOT must be called with a single source key.` | `BITOP NOT` inverts one string, so it takes exactly one source key after the destination key. To invert several keys, run `BITOP NOT` once for each. | `BITOP` |\n| `ERR Blocking module command called from a Reply callback context` | A module tried to block a client from inside the reply callback of an earlier block, which Redis doesn't allow. This is a bug in the module; report it to its developers. | Module commands |\n| `ERR Blocking module command called from Lua script` | A script called a module command that tried to block, which can't happen inside a script. Call that module command directly from your client instead of from `EVAL` or `FCALL`. | Module commands |\n| `ERR Blocking module command called from transaction` | You queued a module command that blocks inside a `MULTI` transaction, where commands can't block. Run that command outside the transaction. | Module commands |\n| `ERR BY option of SORT denied due to insufficient ACL permissions.` | You ran `SORT` with a `BY` pattern, which reads other keys, but your user's access control list (ACL) rules don't allow reading every key. Give the user read access to all keys, such as `%R~*` or `~*`, or sort without a pattern. | `SORT`, `SORT_RO` |\n| `ERR BY option of SORT denied in Cluster mode when keys formed by the pattern may be in different slots.` | You ran `SORT` with a `BY` pattern in a cluster, and the keys that the pattern builds may be in a different hash slot than the key you sort. Start the pattern with the same hash tag as the key, such as `{user1}:w_*` for `{user1}:list`. | `SORT`, `SORT_RO` |\n| `ERR BYFLOAT increment cannot be Infinity` | You passed `INCREX` a `BYFLOAT` increment of infinity, such as `inf`. Pass a finite number. | `INCREX` |\n| `ERR Can not execute a script with write flag using *_ro command.` | You ran a script or function that may write with `EVAL_RO`, `EVALSHA_RO`, or `FCALL_RO`, which only run read-only code. If it never writes, add the `no-writes` flag; otherwise call it with `EVAL`, `EVALSHA`, or `FCALL`. | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |\n| `ERR Can not execute the command on a stale replica script: <script>, on <source>:<line>.` | Your script has the `allow-stale` flag and called a command that this replica can't serve while its link to the primary is down and `replica-serve-stale-data` is `no`. Wait for the link to recover, or call only commands that are allowed on a stale replica, such as `INFO`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR can not read data type` | The payload you passed to `FUNCTION RESTORE` passed its checksum test, but Redis couldn't read the type of one of its entries, so it's truncated or malformed. Pass the exact, unmodified output of `FUNCTION DUMP`. | `FUNCTION RESTORE` |\n| `ERR Can not run script on cluster, 'no-cluster' flag is set.` | Your script or function has the `no-cluster` flag, which stops it from running on a cluster node. Remove the flag if the code is safe to run in a cluster, or run it on a server that isn't part of a cluster. | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |\n| `ERR can only reset normal client connections` | You sent `RESET` on a connection that's used for replication between a primary and a replica, or from inside a module. `RESET` only works on normal client connections; to end a replication link, close the connection instead. | `RESET` |\n| `ERR Can't assign hashslot <slot> to a different node while I still hold keys for this hash slot.` | `CLUSTER SETSLOT` with `NODE` can't give the slot in the message to another node while this node still has keys in that slot. Move the keys first with `MIGRATE`, then assign the slot. | `CLUSTER SETSLOT` |\n| `ERR Can't create backup directory <dirname>: <reason>` | Redis couldn't create the backup directory set by `backupdirname`, for the operating system reason at the end of the message, such as missing permissions. Check the path and its parent directory. A relative path is resolved under the Redis working directory, `dir`. | `BACKUP START` |\n| `ERR Can't execute '<command>': only (P\\|S)SUBSCRIBE / (P\\|S)UNSUBSCRIBE / PING / QUIT / RESET are allowed in this context` | This connection is subscribed to Pub/Sub channels and uses the Redis serialization protocol 2 (RESP2), so it can only run the subscribe and unsubscribe commands, `PING`, `QUIT` and `RESET`. Use a separate connection for other commands, or switch to RESP3 with `HELLO 3`. | Any command |\n| `ERR Can't execute an AOF background rewriting. Please check the server logs for more information.` | Redis couldn't start the append-only file (AOF) rewrite, for example because it couldn't create the background process or open a new AOF file. The server log has the reason. Common causes are low memory and disk problems. | `BGREWRITEAOF` |\n| `ERR Can't forget my master!` | `CLUSTER FORGET` can't remove the primary of the replica you ran it on. Run it on the other nodes, or first make this replica follow another primary with `CLUSTER REPLICATE`. | `CLUSTER FORGET` |\n| `ERR Can't fsync the INCR file for the backup` | `BACKUP SEAL` couldn't flush the incremental append-only file (AOF) to disk, so the backup failed. Check the server log and the disk, then run `BACKUP CLEANUP` and start a new backup. | `BACKUP SEAL` |\n| `ERR Can't pin the INCR AOF for the backup` | `BACKUP SEAL` couldn't create a hard link to the incremental append-only file (AOF) in the backup directory, so the backup failed. Hard links need both directories on the same file system. Check the server log, run `BACKUP CLEANUP`, and start again. | `BACKUP SEAL` |\n| `ERR Can't replicate myself` | You passed this node's own ID to `CLUSTER REPLICATE`. Pass the ID of the primary it should replicate, as shown by `CLUSTER NODES`. | `CLUSTER REPLICATE` |\n| `ERR Can't resolve instance hostname.` | Sentinel couldn't resolve the host name of the primary that you passed to `SENTINEL MONITOR`. Check that the name resolves on the Sentinel host, or pass an Internet Protocol (IP) address. Sentinel accepts host names only when `resolve-hostnames` is `yes`. | `SENTINEL MONITOR` |\n| `ERR Can't rotate the live AOF after sealing the backup` | With `appendonly yes`, `BACKUP SEAL` switches the live append-only file (AOF) to a new incremental file, and that step failed, so the backup failed. Check the server log and the disk, then run `BACKUP CLEANUP` and start a new backup. | `BACKUP SEAL` |\n| `ERR Can't start the AOF rewrite for the backup` | `BACKUP START` couldn't begin the snapshot, because Redis failed to start an append-only file (AOF) rewrite, or to turn on AOF for the backup when `appendonly` is `no`. Check the server log, often for a fork or disk error, then try again. | `BACKUP START` |\n| `ERR Can't write the backup manifest` | `BACKUP SEAL` couldn't write the manifest file that describes the backup, so the backup failed. Check the server log and that the backup directory is writable, then run `BACKUP CLEANUP` and start a new backup. | `BACKUP SEAL` |\n| `ERR Cannot authenticate as an internal connection on non-cluster instances` | `AUTH` with the username `internal connection` is reserved for cluster nodes talking to each other, and this server isn't running in cluster mode. Authenticate with a normal username and password instead. | `AUTH` |\n| `ERR CLIENT CACHING can be called only when the client is in tracking mode with OPTIN or OPTOUT mode enabled` | You sent `CLIENT CACHING`, but tracking for client-side caching isn't on for this connection. Run `CLIENT TRACKING ON OPTIN` or `CLIENT TRACKING ON OPTOUT` first. | `CLIENT CACHING` |\n| `ERR CLIENT CACHING NO is only valid when tracking is enabled in OPTOUT mode.` | You sent `CLIENT CACHING NO`, but tracking isn't in `OPTOUT` mode. `CLIENT CACHING NO` only works after `CLIENT TRACKING ON OPTOUT`; in `OPTIN` mode, send `CLIENT CACHING YES` before the reads you want tracked. | `CLIENT CACHING` |\n| `ERR CLIENT CACHING YES is only valid when tracking is enabled in OPTIN mode.` | You sent `CLIENT CACHING YES`, but tracking isn't in `OPTIN` mode. `CLIENT CACHING YES` only works after `CLIENT TRACKING ON OPTIN`; in `OPTOUT` mode, send `CLIENT CACHING NO` before the reads you don't want tracked. | `CLIENT CACHING` |\n| `ERR Client names cannot contain spaces, newlines or special characters.` | The connection name you passed to `CLIENT SETNAME` or `HELLO SETNAME` has a space, a newline, or another character that isn't plain and visible. Use only unaccented letters, digits, and punctuation, such as `worker-1`. | `CLIENT SETNAME`, `HELLO` |\n| `ERR CLIENT PAUSE mode must be WRITE or ALL` | The mode you passed to `CLIENT PAUSE` after the timeout isn't `WRITE` or `ALL`. Use `WRITE` to pause only commands that change data, or `ALL`, the default, to pause every command. | `CLIENT PAUSE` |\n| `ERR Client reconfiguration script seems non existing or non executable` | You ran `SENTINEL SET` with `client-reconfig-script`, but the path doesn't point to a file that the Sentinel process can execute. Check the path, and make the file executable for the user that runs Sentinel. | `SENTINEL SET` |\n| `ERR CLIENT UNBLOCK reason should be TIMEOUT or ERROR` | The reason you passed to `CLIENT UNBLOCK` after the client ID isn't `TIMEOUT` or `ERROR`. Use `TIMEOUT`, the default, to end the blocked command as if it timed out, or `ERROR` to make it return an `UNBLOCKED` error. | `CLIENT UNBLOCK` |\n| `ERR client-id should be greater than 0` | The value after `CLIENT KILL ID` isn't a positive integer. Pass a client ID from `CLIENT LIST` or `CLIENT ID`; IDs start at 1. | `CLIENT KILL` |\n| `ERR client-reconfig-script must not contain control characters` | You ran `SENTINEL SET` with a `client-reconfig-script` path that contains a control character, such as a newline or a tab. Pass a plain file path. | `SENTINEL SET` |\n| `ERR Clients undergoing module based authentication can only be blocked on auth` | A module tried to block a client that's in the middle of module-based authentication, for something other than the authentication itself. This is a bug in the module; report it to its developers. | Module commands |\n| `ERR CLUSTER RESET can't be called with master nodes containing keys` | `CLUSTER RESET` doesn't run on a primary that still has keys, to avoid losing data. Delete the keys first, for example with `FLUSHALL`, or reset a replica instead. | `CLUSTER RESET` |\n| `ERR CLUSTER SYNCSLOTS CONF ASM-TASK only allowed on replica` | A primary received the `ASM-TASK` option of `CLUSTER SYNCSLOTS CONF`, which a primary sends only to its own replicas. This is internal to atomic slot migration and usually means a node changed role during a migration. Check the roles with `CLUSTER NODES`. | `CLUSTER SYNCSLOTS` |\n| `ERR CLUSTER SYNCSLOTS subcommands are only allowed for internal clients` | `CLUSTER SYNCSLOTS` is used only between cluster nodes during an atomic slot migration, and Redis closes any other connection that sends it. Don't call it yourself. To move slots, use `CLUSTER MIGRATION IMPORT`. | `CLUSTER SYNCSLOTS` |\n| `ERR CLUSTER SYNCSLOTS subcommands are only allowed for master` | A replica accepts `CLUSTER SYNCSLOTS` only from its own primary, and it closes other connections that send it. Atomic slot migrations run between primaries, so run `CLUSTER MIGRATION IMPORT` on the primary that should receive the slots. | `CLUSTER SYNCSLOTS` |\n| `ERR Command '<command>' not found` | `ACL DRYRUN` doesn't know the command, shown in the message, that you asked it to test. Check the spelling, and check that the module that provides the command is loaded. | `ACL DRYRUN` |\n| `ERR Command is not valid when client is a replica.` | `REPLICAOF` with a host and port was sent on a connection that is itself a replica's replication link. Making this server a replica disconnects all its replicas, including that link, so send the command from a normal client connection. | `REPLICAOF`, `SLAVEOF` |\n| `ERR Command not allowed inside a transaction` | You sent a command inside a `MULTI` transaction that can't run there, such as `SAVE`, `SHUTDOWN`, `SYNC` or `PSYNC`. Run it outside the transaction. The transaction is discarded when you call `EXEC`. | Commands in a transaction |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>')` | `CONFIG SET` couldn't set the parameter in the message, and no reason was given. This usually means a module rejected the value for one of its own settings, so check the module's documentation for valid values. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - <reason>` | `CONFIG SET` couldn't set the parameter in the message, for the reason after the dash. For `dir`, the reason comes from the operating system, such as a directory that doesn't exist. For a module setting, it comes from the module. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Active defragmentation cannot be enabled: it requires a Redis server compiled with a modified Jemalloc like the one shipped by default with the Redis source distribution` | This Redis server was built without the jemalloc memory allocator that Redis ships with, so `activedefrag` can't be turned on. Active defragmentation needs a Redis build that uses its bundled jemalloc. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Announced human node name contained invalid character` | The value for `cluster-announce-human-nodename` contains a character that isn't allowed, such as a space, a control character, or punctuation like `,`, `:`, `=`, or `@`. Use letters, digits, hyphens, dots, and underscores. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument couldn't be parsed as an octal number` | The value must be an octal number, such as `700`. The only octal setting, `unixsocketperm`, can't be changed with `CONFIG SET`, so set it in the configuration file and restart. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument couldn't be parsed into an integer` | The setting takes a whole number, and the value you passed isn't one, for example because it has a unit or a decimal point. Pass digits only, with an optional minus sign. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument must be 'yes' or 'no'` | The setting is either on or off, so its value must be `yes` or `no`. Other values, such as `true`, `1`, or `on`, aren't accepted. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument must be a memory or percent value` | `maxmemory-clients` takes either a memory value, such as `1gb`, or a percentage of `maxmemory`, such as `10%`, and the value you passed is neither. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument must be a memory value` | The setting takes a memory value: a whole number of bytes, optionally followed by a unit such as `kb`, `mb`, or `gb`, for example `100mb`. Check for typos, spaces, decimal points, or a minus sign. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument must be between <min> and <max> inclusive` | The value is outside the range that the setting accepts, and the message shows the smallest and the largest allowed values. Pass a value within that range. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - argument(s) must be one of the following: <values>` | The setting accepts only the values listed in the message, and yours isn't one of them. Check the spelling. For settings that take several values, separate them with spaces. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - array-slice-size must be a power of two` | `array-slice-size` must be a power of two from 256 to 65536, such as 256, 1024, or 4096. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - array-sparse-kmax must be greater than array-sparse-kmin when non-zero` | `array-sparse-kmax` must be 0 or greater than the current `array-sparse-kmin`. Pass a larger value, or lower `array-sparse-kmin` first. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - array-sparse-kmin must be less than array-sparse-kmax` | `array-sparse-kmin` must be less than the current `array-sparse-kmax`, unless that is 0. If you raise both in one `CONFIG SET`, put `array-sparse-kmax` first, because each value is checked against the other's current setting. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - can't disable tls-cluster while cluster-bus-port-protected-mode is enabled, as that would leave the cluster bus port unauthenticated; disable cluster-bus-port-protected-mode first, or in the same CONFIG SET command` | In cluster mode, turning off `tls-cluster` while `cluster-bus-port-protected-mode` is on would leave the cluster bus without authentication, so Redis refuses. Turn off `cluster-bus-port-protected-mode` first, or in the same `CONFIG SET` command. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - can't enable cluster-bus-port-protected-mode while tls-cluster is disabled, as that leaves the cluster bus port unauthenticated; enable tls-cluster first, or in the same CONFIG SET command` | In cluster mode, `cluster-bus-port-protected-mode` requires `tls-cluster`, because otherwise the cluster bus has no authentication. Turn on `tls-cluster` first, or in the same `CONFIG SET` command. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - can't set immutable config` | The parameter in the message can be set only when the server starts, not with `CONFIG SET`. Set it in the configuration file or on the command line, then restart the server. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - can't set protected config` | The parameter in the message, such as `dir` or `dbfilename`, is protected, and `CONFIG SET` can't change it while `enable-protected-configs` is `no`, the default. Set it in the configuration file, or start the server with `enable-protected-configs` set to `yes` or `local`. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - dbfilename can't be a path, just a filename` | `dbfilename` takes only a file name, such as `dump.rdb`, without a directory. Set the directory with `dir` instead. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - duplicate parameter` | The same parameter appears twice in one `CONFIG SET`, possibly once by its alias, such as `replica-read-only` and `slave-read-only`. Pass each parameter only once. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Error in hard, soft or soft_seconds setting in buffer limit configuration.` | In `client-output-buffer-limit`, each class needs a hard limit and a soft limit, as memory values such as `256mb` or `0`, and soft seconds, as a whole number of 0 or more. One of these three values isn't valid. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Failed to bind to specified addresses.` | Redis couldn't listen on an address you set in `bind`, for example because the address doesn't belong to this machine or the port is already in use. The server log has the address and the reason. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Failed to set current oom_score_adj. Check server logs.` | Redis couldn't change its Linux out-of-memory killer score, which `oom-score-adj` and `oom-score-adj-values` control. This works only on Linux, and lowering the score needs extra privileges. The server log has the reason. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - failed to set process title` | Redis accepted the new `proc-title-template` but couldn't apply it to the process title. The template is checked before this step, so this normally doesn't happen. Check the template and the server log. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Hostnames for cluster-announce-ip must be less than 46 characters` | A hostname in `cluster-announce-ip` must be shorter than 46 characters. Use a shorter name or a numeric address, or announce the hostname with `cluster-announce-hostname` instead. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Hostnames may only contain alphanumeric characters, hyphens or dots` | The value for `cluster-announce-hostname` or `cluster-announce-ip` contains a character other than letters, digits, hyphens, or dots, such as an underscore or a space. Remove those characters. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Hostnames must be less than 256 characters` | The value for `cluster-announce-hostname` must be shorter than 256 characters. Use a shorter hostname. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Invalid client class specified in buffer limit configuration.` | `client-output-buffer-limit` names a client class that it doesn't support. Use `normal`, `replica`, or `pubsub`. The `master` class isn't allowed. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Invalid event class character. Use 'Ag$lshzxeKEtmdnocaSTIV'.` | The value of `notify-keyspace-events` contains a character that isn't an event class. Use only the characters listed in the message, for example `KEA` to get every event, or an empty string to turn notifications off. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Invalid latency-tracking-info-percentiles parameters` | A value in `latency-tracking-info-percentiles` isn't a number. Pass numbers separated by spaces, such as `50 99 99.9`. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Invalid locale name` | The locale in `locale-collate` isn't installed on the server's operating system. Use a locale that `locale -a` lists on that machine, or an empty string to use the default from the environment. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Invalid oom-score-adj-values, elements must be between -2000 and 2000.` | `oom-score-adj-values` takes three whole numbers, for the primary, replicas, and background child processes, each from -2000 to 2000. One of the values isn't a number or is out of range. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Invalid save parameters` | The value of `save` must be pairs of numbers: seconds, 1 or more, then a number of changes, 0 or more, such as `3600 1 300 100`. To turn off snapshots, pass an empty string. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - latency-tracking-info-percentiles parameters should sit between [0.0,100.0]` | Each value in `latency-tracking-info-percentiles` must be from 0.0 to 100.0. Fix or remove the value that's out of range. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - memory tracking cannot be enabled at runtime` | Setting `key-memory-histograms` to `yes`, or adding `mem` to `cluster-slot-stats-enabled`, needs memory tracking, which Redis can turn on only at startup. Set the option in the configuration file and restart the server. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - percentage argument must be less or equal to <max>` | A percentage for `maxmemory-clients` can't be higher than the number in the message, 100. Pass a lower percentage, or a memory value. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - shutdown options SAVE and NOSAVE can't be used simultaneously` | `shutdown-on-sigint` and `shutdown-on-sigterm` can't include both `save` and `nosave`. Pick one of them, optionally with `now` or `force`. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - template format is invalid or contains unknown variables` | The value for `proc-title-template` uses a variable that doesn't exist, has unbalanced braces, or gives an empty title. The variables are `{title}`, `{listen-addr}`, `{server-mode}`, `{port}`, `{tls-port}`, `{unixsocket}`, and `{config-file}`. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - The event loop API used by Redis is not able to handle the specified number of clients` | Redis couldn't make its event loop large enough for the new `maxclients`. This usually happens only on systems where Redis uses the older `select` interface, which handles about 1024 connections. Use a lower value. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - The operating system is not able to handle the specified number of clients, try with <maxclients>` | The operating system's open-files limit is too low for the `maxclients` you asked for. Redis needs one file descriptor per client, plus 32. Raise the limit for the Redis process, for example with `ulimit -n`, and restart, or use the value in the message. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - TLS support is not compiled in, cannot enable TLS options.` | This Redis server was built without Transport Layer Security (TLS) support, so you can't turn on `tls-replication` or `tls-cluster`. Use a Redis build with TLS support. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - TLS support is not compiled in, cannot set a TLS port.` | This Redis server was built without Transport Layer Security (TLS) support, so you can't set `tls-port`. Use a Redis build with TLS support, or keep `tls-port` at 0. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - tls-expected-peer-name contains no usable name; use an empty string to disable it` | `tls-expected-peer-name` contains only spaces, so there's no name to check. Pass one or more names separated by spaces, or an empty string to turn the check off. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - tls-expected-peer-name must not contain whitespace other than spaces separating names; use an empty string to disable it` | `tls-expected-peer-name` contains a tab, a newline, or other whitespace that isn't a plain space. Separate names with spaces only, or pass an empty string to turn the check off. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Too many bind addresses specified.` | `bind` accepts at most 16 addresses, and you passed more. Remove some of the addresses. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Unable to listen on this port. Check server logs.` | Redis couldn't listen on the new `port` or `tls-port`, usually because another process uses it, or because a port below 1024 needs extra privileges. The server log has the exact reason. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Unable to turn on AOF. Check server logs.` | Redis couldn't turn on the append-only file (AOF) after `CONFIG SET appendonly yes`, for example because it couldn't start the rewrite that writes the first AOF file. The server log has the reason. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Unable to update TLS configuration. Check server logs.` | Redis couldn't load the new Transport Layer Security (TLS) settings, for example because a certificate or key file is missing, unreadable, or doesn't match. Check the `tls-*` file settings. The server log has the exact error. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - wrong number of arguments` | `oom-score-adj-values` takes exactly three values, for the primary, replicas, and background child processes, such as `0 200 800`. Pass all three, separated by spaces. | `CONFIG SET` |\n| `ERR CONFIG SET failed (possibly related to argument '<parameter>') - Wrong number of arguments in buffer limit configuration.` | `client-output-buffer-limit` takes groups of four values: class, hard limit, soft limit, and soft seconds, such as `normal 0 0 0`. The value you passed doesn't split into groups of four. | `CONFIG SET` |\n| `ERR Copying to another database is not allowed in cluster mode` | In cluster mode there's only database 0, so `COPY` can't use the `DB` option to copy to another database. Copy within database 0 instead. | `COPY` |\n| `ERR could not decode requested zset member` | The member you passed to `GEORADIUSBYMEMBER` or to `FROMMEMBER` doesn't exist in the sorted set, or its score isn't a valid geohash. Add the member with `GEOADD` first, or search from coordinates with `FROMLONLAT`. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR COUNT can't be negative` | You passed `LPOS` a `COUNT` that's negative or not an integer. Pass the number of matches to return, or 0 to return all of them. | `LPOS` |\n| `ERR COUNT must be > 0` | The `COUNT` value is 0 or negative; for `XAUTOCLAIM`, it can also be a non-integer or a huge number. Pass a positive count, or leave `COUNT` out: geospatial searches then return every match, and `XAUTOCLAIM` claims up to 100 entries. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE`, `XAUTOCLAIM` |\n| `ERR COUNT must be between 1 and 64` | The `COUNT` value in `HOTKEYS START`, the number of top keys to track, isn't an integer from 1 to 64. Pass a value in that range, or leave `COUNT` out to track the top 10. | `HOTKEYS START` |\n| `ERR count should be greater than 0` | The `COUNT` you passed, or the count after `EXACTLY` in `LMOVEM` and `BLMOVEM`, is 0, negative, or not an integer. Pass the number of elements to pop or move, which must be at least 1. | `BLMPOP`, `LMPOP`, `BLMOVEM`, `LMOVEM`, `BZMPOP`, `ZMPOP` |\n| `ERR count should be greater than or equal to -1` | You ran `SLOWLOG GET` with a count that isn't an integer or is less than -1. Pass the number of entries you want, or -1 to get all of them. | `SLOWLOG GET` |\n| `ERR DB index is out of range` | The database number you passed to `SELECT`, `MOVE`, `COPY`, or `SWAPDB` doesn't exist. Databases are numbered from 0 to the `databases` setting minus one, so 0 to 15 by default. | `SELECT`, `MOVE`, `COPY`, `SWAPDB` |\n| `ERR DB must be empty to perform CLUSTER FLUSHSLOTS.` | `CLUSTER FLUSHSLOTS` removes all slots from this node, and it runs only when the node has no keys. Delete the keys first, for example with `FLUSHALL`. | `CLUSTER FLUSHSLOTS` |\n| `ERR DEBUG command not allowed. If the enable-debug-command option is set to \"local\", you can run it from a local connection, otherwise you need to set this option in the configuration file, and then restart the server.` | `DEBUG` is turned off on this server, which is the default. To use it, set `enable-debug-command` to `yes`, or to `local` to allow it only from local connections, in the configuration file and restart Redis; `CONFIG SET` can't change it. | `DEBUG` |\n| `ERR decrement would overflow` | You passed `DECRBY` -9223372036854775808, the smallest 64-bit integer, which Redis can't turn into a positive amount to subtract. Use a smaller amount, or `INCRBY` with a negative amount. | `DECRBY` |\n| `ERR Destination node <node_id> is not a master` | The node asking to receive the slots, named by its ID in the message, is unknown to this node or isn't a primary. Only a primary can import slots. Check the roles with `CLUSTER NODES`, and start the import on a primary. | `CLUSTER SYNCSLOTS` |\n| `ERR DISCARD without MULTI` | You sent `DISCARD`, but this connection has no open transaction. A transaction ends with `EXEC` or `DISCARD`, so check that `MULTI` and `DISCARD` go over the same connection and that the transaction hasn't ended already. | `DISCARD` |\n| `ERR DUMP payload version or checksum are wrong` | The payload you passed to `RESTORE` or `FUNCTION RESTORE` was made by a newer Redis version, or it changed on the way, for example truncated or converted to text by your client. Pass the exact bytes that `DUMP` or `FUNCTION DUMP` returned. | `RESTORE`, `FUNCTION RESTORE` |\n| `ERR Duplicate argument '<option>' to SENTINEL CONFIG SET` | You named the same option more than once in one `SENTINEL CONFIG SET` command. List each option once, with one value. | `SENTINEL CONFIG` |\n| `ERR duplicate field name in fieldset` | You ran `HIMPORT PREPARE` with the same field name more than once. List each field once; names are compared exactly, so case matters. | `HIMPORT PREPARE` |\n| `ERR Duplicate master name.` | You ran `SENTINEL MONITOR` with a primary name that this Sentinel already monitors. Choose another name, or remove the existing one first with `SENTINEL REMOVE`. | `SENTINEL MONITOR` |\n| `ERR duplicate slot number` | The slot numbers after `SLOTS` in `HOTKEYS START` include the same slot twice. List each slot once, and lower the count to match. | `HOTKEYS START` |\n| `ERR DURATION must be between 1 and 1000000` | The `DURATION` value in `HOTKEYS START` isn't an integer from 1 to 1000000 seconds. `0` isn't accepted; to track until you run `HOTKEYS STOP`, leave `DURATION` out. | `HOTKEYS START` |\n| `ERR Elements are too large to be stored` | The fields and values of the entry you passed to `XADD` add up to more than 1 GiB (1,073,741,824 bytes), the most that one stream entry can hold. Store large values in separate keys, and put only the key names in the stream. | `XADD` |\n| `ERR Engine '<engine>' not found` | The shebang line of your library names an engine that doesn't exist, the word right after `#!`. Lua is the only engine, so start the library with a line such as `#!lua name=mylib`. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR entries_added must be positive` | You passed `XSETID` a negative `ENTRIESADDED`. Pass 0 or more, and no less than the stream's length. | `XSETID` |\n| `ERR ENX flag requires an expiration` | You passed `ENX` to `INCREX` without an expiration. Add one of `EX`, `PX`, `EXAT` or `PXAT`; with `ENX`, Redis sets it only if the key has no expiration yet. | `INCREX` |\n| `ERR` | `SAVE` couldn't write the snapshot file to disk, or `BGSAVE` couldn't start the background process that writes it. Check the Redis log for the reason, which is often a full disk, no write permission on the `dir` directory, or too little memory to fork the process. | `SAVE`, `BGSAVE` |\n| `ERR Error compiling function: <reason>` | Lua couldn't compile the library code you passed to `FUNCTION LOAD` or `FUNCTION RESTORE`. The reason after the colon gives the line number in your code and the syntax problem; fix it and load the library again. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Error compiling script (new function): <reason>` | Lua couldn't compile the script you sent with `EVAL` or `SCRIPT LOAD`. The reason after the colon gives the line number in your script and the syntax problem, such as a missing `end` or an unclosed string; fix it and send the script again. | `EVAL`, `EVALSHA`, `SCRIPT LOAD` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': Adding a pattern after the * pattern (or the 'allchannels' flag) is not valid and does not have any effect. Try 'resetchannels' to start with an empty list of channels` | You added a channel pattern with `&` to a user that can already use all channels, through `allchannels` or `&*`, so the pattern would have no effect. Put `resetchannels` before the patterns to limit the user to those channels. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': Adding a pattern after the * pattern (or the 'allkeys' flag) is not valid and does not have any effect. Try 'resetkeys' to start with an empty list of patterns` | You added a key pattern with `~` or `%` to a user that can already use all keys, through `allkeys` or `~*`, so the pattern would have no effect. Put `resetkeys` before the patterns to limit the user to those keys. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': Allowing first-arg of a subcommand is not supported` | You tried to allow a subcommand with one specific first argument, such as `+config\\|get\\|maxmemory`. Access control list (ACL) rules can allow a command or a subcommand, such as `+config\\|get`, but not a single argument of a subcommand. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': Syntax error` | Redis didn't recognize the rule shown in the message. Common causes are a misspelled keyword, a `%` key rule with flags other than `R` and `W`, a subcommand rule that ends with `\\|`, or a key or channel pattern that contains spaces. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': The password hash must be exactly 64 characters and contain only lowercase hexadecimal characters` | A rule that starts with `#` or `!` must be followed by a hashed password: exactly 64 lowercase hexadecimal characters, the form that `ACL GETUSER` shows. To pass the password in plain text, use `>` or `<` instead. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': The password you are trying to remove from the user does not exist` | A `<` or `!` rule tried to remove a password that the user doesn't have. Check the password or hash you passed, or use `resetpass` to remove all of the user's passwords. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': Unknown command or category name in ACL` | A `+` or `-` rule names a command, or a `+@` or `-@` rule names a category, that this server doesn't know. Check the name with `COMMAND LIST` or `ACL CAT`, and check that the module that provides the command is loaded. | `ACL SETUSER` |\n| `ERR Error in ACL SETUSER modifier '<modifier>': Wrong format` | Redis rejected the rule shown in the message without giving a specific reason. This is a fallback that the rules in Redis 8.10 don't normally produce, so compare the rule with the `ACL SETUSER` syntax and look for unusual characters. | `ACL SETUSER` |\n| `ERR Error loading ACLs, opening file '<filename>': <reason>` | `ACL LOAD` couldn't open the access control list (ACL) file set by `aclfile`, for the operating system reason at the end of the message, such as a missing file or no read permission. Check the path and the file's permissions. | `ACL LOAD` |\n| `ERR Error loading the extension. Please check the server logs.` | `MODULE LOAD` or `MODULE LOADEX` couldn't load the module, and the Redis log says why. Common causes are a wrong path, a file without execute permission, a module built for another platform, a module that's already loaded, or invalid module arguments. | `MODULE LOAD`, `MODULE LOADEX` |\n| `ERR Error purging dirty pages` | `MEMORY PURGE` asked the jemalloc memory allocator to return unused memory to the operating system, and the allocator reported an error. This is usually temporary and doesn't affect your data, so you can retry later and check the Redis log. | `MEMORY PURGE` |\n| `ERR Error registering functions: ERR callback argument given to redis.register_function must be a function` | In the table form of `redis.register_function`, the `callback` field isn't a Lua function. Set it to the function itself, not to its name as a string or to the result of calling it. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR calling redis.register_function with a single argument is only applicable to Lua table (representing named arguments).` | You called `redis.register_function` with one argument that isn't a table. Pass either two arguments, the function name and the callback, or one table with `function_name` and `callback` fields. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR description argument given to redis.register_function must be a string` | In the table form of `redis.register_function`, the `description` field isn't a string. Set it to a short text that describes the function, or leave it out. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR first argument to redis.register_function must be a string` | You called `redis.register_function` with two arguments, but the first one isn't a string. Pass the function name first and the callback second, as in `redis.register_function('my_func', my_callback)`. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR flags argument to redis.register_function must be a table representing function flags` | In the table form of `redis.register_function`, the `flags` field isn't a table. Pass the flags as a Lua table of strings, such as `flags = { 'no-writes' }`, even when there's only one. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR Function already exists in the library` | Your library code calls `redis.register_function` twice with the same function name. Give each function in the library a unique name. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR FUNCTION LOAD timeout` | Your library's top-level code ran for more than 500 milliseconds during `FUNCTION LOAD`, so Redis stopped it. That code should only register functions; move any long-running work into the function callbacks, and check for an endless loop. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR function_name argument given to redis.register_function must be a string` | In the table form of `redis.register_function`, the `function_name` field isn't a string. Set it to the name that you'll pass to `FCALL`. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR Library names can only contain letters, numbers, or underscores(_) and must be at least one character long` | A function name passed to `redis.register_function` is empty or has characters other than letters, digits, and underscores, even though the message says library names. Rename the function using only those characters, such as `my_func`. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR named argument key given to redis.register_function is not a string` | The table you passed to `redis.register_function` has a key that isn't a string, such as `true` or a table. Use only the named fields `function_name`, `callback`, `flags`, and `description`. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR redis.register_function must get a callback argument` | The table you passed to `redis.register_function` has no `callback` field. Add `callback` and set it to the Lua function that `FCALL` should run. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR redis.register_function must get a function name argument` | The table you passed to `redis.register_function` has no `function_name` field. Add `function_name` and set it to the name that you'll pass to `FCALL`. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR second argument to redis.register_function must be a function` | You called `redis.register_function` with two arguments, but the second one isn't a function. Pass the function itself, not its name as a string or the result of calling it. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR unknown argument given to redis.register_function` | The table you passed to `redis.register_function` has a field other than `function_name`, `callback`, `flags`, and `description`, or an entry without a name. Check the field names for typos. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR unknown flag given` | The `flags` table you passed to `redis.register_function` has an entry that isn't a known flag name. Valid flags are `no-writes`, `allow-oom`, `allow-stale`, `no-cluster`, and `allow-cross-slot-keys`. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR user_function:<line>: Script attempted to access nonexistent global variable '<name>'` | While `FUNCTION LOAD` ran your library's top-level code, it read a global that doesn't exist at load time, named in the message. Only `redis.register_function`, `redis.log`, and the version fields exist then, so move other calls into the function callbacks and use `local` for your variables. | `FUNCTION LOAD` |\n| `ERR Error registering functions: ERR wrong number of arguments to redis.register_function` | You called `redis.register_function` with no arguments or more than two. Pass either the function name and the callback, or a single table of named arguments. | `FUNCTION LOAD` |\n| `ERR Error running script <script>, <error>` | A script or function failed in a way that Redis couldn't report as usual, which can happen when Lua runs out of memory or its error handling fails. The end of the message shows the Lua error; check the script for runaway memory use. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR error saving the cluster node config: <reason>` | `CLUSTER SAVECONFIG` couldn't write the cluster configuration file, set by `cluster-config-file`, for the operating system reason at the end of the message. Check that the file and its directory are writable and that the disk isn't full. | `CLUSTER SAVECONFIG` |\n| `ERR Error unloading module: no such module with that name` | No loaded module has the name you passed to `MODULE UNLOAD`, which takes the module's name, not its file path. Run `MODULE LIST` to see the names, such as `search` or `ReJSON`. | `MODULE UNLOAD` |\n| `ERR Error unloading module: operation not possible.` | The module refused to be unloaded: its unload callback returned an error, and the Redis log says that the unload was canceled. Check the module's documentation for what it needs before it can be unloaded. | `MODULE UNLOAD` |\n| `ERR Error unloading module: the module can't be unloaded` | The module is built into the Redis server instead of loaded from a file, so it can't be unloaded. In Redis 8, this applies to the vector sets module, `vectorset`. | `MODULE UNLOAD` |\n| `ERR Error unloading module: the module exports APIs used by other modules. Please unload them first and try again` | Other loaded modules depend on functions that this module exports to them. Unload those modules first, then unload this one. | `MODULE UNLOAD` |\n| `ERR Error unloading module: the module exports one or more module-side data types, can't unload` | The module defines its own data types, so Redis can't unload it while it runs, because keys of those types may exist. This applies to Search, JSON, probabilistic, and time series; to remove one, take it out of the server's `loadmodule` configuration and restart Redis. | `MODULE UNLOAD` |\n| `ERR Error unloading module: the module has blocked clients. Please wait for them to be unblocked and try again` | Some clients are still blocked on commands of this module, so Redis can't unload it yet. Wait for those commands to finish or time out, then try again. | `MODULE UNLOAD` |\n| `ERR Error unloading module: the module holds timer that is not fired. Please stop the timer or wait until it fires.` | The module has a timer that hasn't fired yet, so Redis can't unload it. Wait for the timer to fire, or stop it with the module's own commands if it has any, then try again. | `MODULE UNLOAD` |\n| `ERR Errors trying to SHUTDOWN. Check logs.` | Your `SHUTDOWN` was waiting for replicas to catch up, but the shutdown was canceled. Either it failed, for example because the final save failed, or another client ran `SHUTDOWN ABORT`. The server is still running, and its log has the reason. | `SHUTDOWN` |\n| `ERR exactly one of BYRADIUS and BYBOX can be specified for <command>` | You called `GEOSEARCH` or `GEOSEARCHSTORE` without a search shape. Add either `BYRADIUS` with a radius and unit, or `BYBOX` with a width, height, and unit; passing both is a syntax error. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR exactly one of FROMMEMBER or FROMLONLAT can be specified for <command>` | You called `GEOSEARCH` or `GEOSEARCHSTORE` without a center point. Add either `FROMMEMBER` with a member of the set, or `FROMLONLAT` with a longitude and latitude; passing both is a syntax error. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR EXEC without MULTI` | You sent `EXEC`, but this connection has no open transaction. This often happens when a connection pool sends `MULTI` and `EXEC` on different connections, or after the transaction has already ended; send `MULTI`, the commands, and `EXEC` on one connection. | `EXEC` |\n| `ERR Failed creating the library` | Redis couldn't create a library from the `FUNCTION RESTORE` payload. Load the library from its source code with `FUNCTION LOAD`, which reports the exact problem. | `FUNCTION RESTORE` |\n| `ERR Failed loading library payload` | Redis couldn't read a library's code from the `FUNCTION RESTORE` payload, so the payload is truncated or malformed. Pass the exact, unmodified output of `FUNCTION DUMP`. | `FUNCTION RESTORE` |\n| `ERR failed loading the given functions payload` | Redis couldn't load the libraries in the payload you passed to `FUNCTION RESTORE`. Pass the exact, unmodified output of `FUNCTION DUMP`, or load the libraries from their source code with `FUNCTION LOAD`. | `FUNCTION RESTORE` |\n| `ERR Failed to create idempotency hash` | `XADD` with `IDMPAUTO` couldn't compute the idempotent ID from the entry's fields and values, which can happen when the server can't allocate memory for it. Retry the command, and check the server's memory if it keeps happening. | `XADD` |\n| `ERR Failed to handle master task: <task>` | A replica couldn't apply the details of an atomic slot migration that its primary sent. This is internal to the migration. Check the replica's log, and check that the replica is in sync with its primary. | `CLUSTER SYNCSLOTS` |\n| `ERR Failed to save config file. Check server logs.` | Sentinel made your change but couldn't rewrite its configuration file, so the change is lost when Sentinel restarts. Check the Sentinel log for the reason, which is often a configuration file or directory that the Sentinel user can't write to. | `SENTINEL FLUSHCONFIG`, `SENTINEL MONITOR`, `SENTINEL REMOVE` |\n| `ERR FAILOVER already in progress.` | A failover started by an earlier `FAILOVER` is still running. Wait for it to finish, or cancel it with `FAILOVER ABORT` before you start a new one. | `FAILOVER` |\n| `ERR FAILOVER is not valid when server is a replica.` | You sent `FAILOVER` to a replica, but it only works on a primary, which hands its role to one of its replicas. Send it to the current primary instead. | `FAILOVER` |\n| `ERR FAILOVER not allowed in cluster mode. Use CLUSTER FAILOVER command instead.` | `FAILOVER` works only outside cluster mode. In a cluster, send `CLUSTER FAILOVER` to the replica that should become the primary. | `FAILOVER` |\n| `ERR FAILOVER requires connected replicas.` | You sent `FAILOVER` to a primary that has no connected replicas, so there's nothing to promote. Connect at least one replica, and check `INFO replication` before you retry. | `FAILOVER` |\n| `ERR FAILOVER target HOST and PORT is not a replica.` | The host and port after `TO` don't match any replica connected to this primary. Use the address and port that `INFO replication` lists for the replica. | `FAILOVER` |\n| `ERR FAILOVER target replica is not online.` | The replica you named with `TO` is connected but hasn't finished its initial sync, so it can't take over yet. Wait until `INFO replication` shows it as `online`, then retry. | `FAILOVER` |\n| `ERR FAILOVER timeout must be greater than 0` | The value after `TIMEOUT` in `FAILOVER` is 0 or negative. Pass a positive number of milliseconds, or leave `TIMEOUT` out to wait with no time limit. | `FAILOVER` |\n| `ERR FAILOVER with force option requires both a timeout and target HOST and IP.` | You passed `FORCE` to `FAILOVER` without both `TIMEOUT` and `TO` followed by a host and port. Add `TO` with the replica's host and port, and `TIMEOUT` in milliseconds, so Redis knows which replica to force and when. | `FAILOVER` |\n| `ERR FIELDS keyword specified multiple times` | You used the `FIELDS` keyword more than once in the same command. Put all the fields in one `FIELDS` block, with the number of fields first. | `HGETEX`, `HSETEX`, `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR FIELDS requires at least numfields and one field argument` | `FIELDS` is too close to the end of the command to be followed by a field count and at least one field. Put `FIELDS`, the number of fields, and the field names last, for example `HEXPIRE key 60 NX FIELDS 1 field`. | `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR First argument must be a number (log level). script: <script>, on <source>:<line>.` | Your script called `redis.log()` with a first argument that isn't a number. Pass the log level first and then the message, for example `redis.log(redis.LOG_WARNING, 'text')`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Fork() failed: can't run EVAL in debugging mode: <reason>` | You ran `EVAL` after `SCRIPT DEBUG YES`, which debugs in a forked copy of the server, and the fork failed for the reason shown, usually low memory. Free memory, or use `SCRIPT DEBUG SYNC`, which doesn't fork but blocks the server while you debug. | `EVAL` |\n| `ERR Function <function> already exists` | A function in the library you're loading has the same name as a function in another loaded library, and function names must be unique across all libraries. Rename the function, or remove the other library with `FUNCTION DELETE`; with `FUNCTION RESTORE`, the `FLUSH` policy replaces all libraries. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Function code is missing` | You ran `FUNCTION LOAD` without the library code. Pass the code as the last argument, after the optional `REPLACE`. | `FUNCTION LOAD` |\n| `ERR FUNCTION FLUSH only supports SYNC\\|ASYNC option` | You passed `FUNCTION FLUSH` an argument other than `SYNC` or `ASYNC`. Run `FUNCTION FLUSH SYNC` or `FUNCTION FLUSH ASYNC`, or no option at all to let the `lazyfree-lazy-user-flush` setting choose. | `FUNCTION FLUSH` |\n| `ERR Function not found` | No loaded library has a function with the name you passed to `FCALL` or `FCALL_RO`. Check the loaded functions with `FUNCTION LIST`, and load the library with `FUNCTION LOAD` if it's missing, for example on a new server or after `FUNCTION FLUSH`. | `FCALL`, `FCALL_RO` |\n| `ERR GEOSEARCHSTORE is not compatible with WITHDIST, WITHHASH and WITHCOORD options` | You passed `WITHDIST`, `WITHHASH`, or `WITHCOORD` to `GEOSEARCHSTORE`, which stores its results instead of returning them. Remove those options; to store distances, use `STOREDIST`, or run `GEOSEARCH` to get the details back. | `GEOSEARCHSTORE` |\n| `ERR GET option of SORT denied due to insufficient ACL permissions.` | You ran `SORT` with `GET`, which needs read access to every key, even for `GET #`, but your user's access control list (ACL) rules don't allow that. Give the user read access to all keys, such as `%R~*` or `~*`, or leave out `GET`. | `SORT`, `SORT_RO` |\n| `ERR GET option of SORT denied in Cluster mode when keys formed by the pattern may be in different slots.` | You ran `SORT` with a `GET` pattern in a cluster, and the keys it builds may be in another hash slot than the sorted key. Start the pattern with the key's hash tag, or read the values separately. `GET #` is always allowed. | `SORT`, `SORT_RO` |\n| `ERR given type is not a function` | The payload you passed to `FUNCTION RESTORE` isn't a functions payload, usually because it's the output of `DUMP` for a key. Make the payload with `FUNCTION DUMP`, or restore a key's payload with `RESTORE`. | `FUNCTION RESTORE` |\n| `ERR GT and LT options at the same time are not compatible` | You passed both `GT` and `LT` to `EXPIRE`, `PEXPIRE`, `EXPIREAT`, or `PEXPIREAT`, but a new expiry can't be both greater and less than the current one. Keep only one of them. | `EXPIRE`, `EXPIREAT`, `PEXPIRE`, `PEXPIREAT` |\n| `ERR GT, LT, and/or NX options at the same time are not compatible` | You passed `ZADD` more than one of `GT`, `LT` and `NX`, which conflict with each other. Use at most one of them; `XX` can be combined with `GT` or `LT`. | `ZADD`, `ZINCRBY` |\n| `ERR hash value is not a float` | `HINCRBYFLOAT` can't add to the field, because its current value isn't a number. Set the field to a numeric value first, or increment a different field. | `HINCRBYFLOAT` |\n| `ERR hash value is not an integer` | `HINCRBY` can't add to the field, because its current value isn't an integer, for example `1.5` or text. Use `HINCRBYFLOAT` for decimal values, or set the field to an integer first. | `HINCRBY` |\n| `ERR height or width cannot be negative` | The width or height after `BYBOX` in `GEOSEARCH` or `GEOSEARCHSTORE` is negative. Pass sizes of 0 or more, followed by the unit. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR hotkey tracking session already in progress` | A hotkey tracking session is already running, and only one can run at a time. Run `HOTKEYS STOP` first, then start the new session. | `HOTKEYS START` |\n| `ERR hotkey tracking session in progress, stop tracking first` | You ran `HOTKEYS RESET` while a tracking session is still running. Run `HOTKEYS STOP` first, then `HOTKEYS RESET` to free the results. | `HOTKEYS RESET` |\n| `ERR HOTKEYS subcommand required` | You ran `HOTKEYS` without a subcommand. Add one of `START`, `STOP`, `GET`, `RESET`, or `HELP`. | `HOTKEYS GET`, `HOTKEYS HELP`, `HOTKEYS RESET`, `HOTKEYS START`, `HOTKEYS STOP` |\n| `ERR I can only replicate a master, not a replica.` | `CLUSTER REPLICATE` takes the ID of a primary, and you passed the ID of a replica. Use the ID of that replica's primary, as shown by `CLUSTER NODES`. | `CLUSTER REPLICATE` |\n| `ERR I don't know about node <node_id>` | `CLUSTER SETSLOT` with `MIGRATING` or `IMPORTING` names a node ID that this node doesn't know. Check the ID with `CLUSTER NODES` on this node. | `CLUSTER SETSLOT` |\n| `ERR I tried hard but I can't forget myself...` | You passed this node's own ID to `CLUSTER FORGET`. To remove this node from the cluster, run the command on each of the other nodes. | `CLUSTER FORGET` |\n| `ERR I'm a replica but my master is unknown to me` | This replica doesn't know which node is its primary, so it can't fail over. Check its role with `CLUSTER NODES`, and set its primary with `CLUSTER REPLICATE` if needed. | `CLUSTER FAILOVER` |\n| `ERR I'm already the owner of hash slot <slot>` | `CLUSTER SETSLOT` with `IMPORTING` was sent to the node that already serves the slot. Send it to the node that should receive the slot. | `CLUSTER SETSLOT` |\n| `ERR I'm not the owner of hash slot <slot>` | `CLUSTER SETSLOT` with `MIGRATING` must go to the node that serves the slot, and this node doesn't. Send it to the slot's current owner, shown by `CLUSTER SHARDS` or `CLUSTER NODES`. | `CLUSTER SETSLOT` |\n| `ERR idempotent ID must be non-empty` | `XIDMPRECORD`, an internal command, got an empty idempotent ID, the argument after the producer ID. Pass a non-empty string. | `XIDMPRECORD` |\n| `ERR IDMP-DURATION must be between 1 and 86400 seconds` | You passed `XCFGSET` an `IDMP-DURATION` outside the range of 1 to 86400 seconds (one day). Pass how long the stream remembers each idempotent ID, within that range. | `XCFGSET` |\n| `ERR IDMP-DURATION specified multiple times` | You passed `IDMP-DURATION` more than once in one `XCFGSET` command. Pass it once. | `XCFGSET` |\n| `ERR IDMP-MAXSIZE must be between 1 and 10000 entries` | You passed `XCFGSET` an `IDMP-MAXSIZE` outside the range of 1 to 10000. Pass how many idempotent IDs the stream keeps for each producer, within that range. | `XCFGSET` |\n| `ERR IDMP-MAXSIZE specified multiple times` | You passed `IDMP-MAXSIZE` more than once in one `XCFGSET` command. Pass it once. | `XCFGSET` |\n| `ERR IDS option is required` | You ran `XACKDEL` or `XDELEX` without the `IDS` block. Add `IDS`, the number of entry IDs, and the IDs themselves. | `XACKDEL`, `XDELEX` |\n| `ERR If you want both the length and indexes, please just use IDX.` | You passed both `LEN` and `IDX` to `LCS`. Use only `IDX`, whose reply already includes the length. | `LCS` |\n| `ERR IID already exists for this producer with a different stream ID` | `XIDMPRECORD`, an internal command, tried to link an idempotent ID to an entry, but that producer already uses the ID for a different entry. One idempotent ID can point to only one entry for each producer; use a different ID. | `XIDMPRECORD` |\n| `ERR INCR option supports a single increment-element pair` | You passed `ZADD` the `INCR` option with more than one score and member pair. With `INCR`, pass exactly one increment and one member, or use `ZINCRBY`. | `ZADD`, `ZINCRBY` |\n| `ERR Increment is not a valid float` | The value after `BYFLOAT` in `INCREX` isn't a number. Pass a decimal number, such as `1.5`. | `INCREX` |\n| `ERR Increment is not an integer or out of range` | The value after `BYINT` in `INCREX` isn't an integer between -9223372036854775808 and 9223372036854775807. Pass a whole number, or use `BYFLOAT` for decimal increments. | `INCREX` |\n| `ERR increment or decrement would overflow` | The result would be outside the range of a signed 64-bit integer, -9223372036854775808 to 9223372036854775807. Use a smaller increment, or reset the value first. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-not-an-integer/#how-to-fix-it) | `HINCRBY`, `DECR`, `DECRBY`, `INCR`, `INCRBY` |\n| `ERR increment would produce NaN or Infinity` | The result of `INCRBYFLOAT` or `HINCRBYFLOAT` would be infinite or not a number (NaN), for example because the increment is `inf` or the values are extremely large. Use finite values within the normal range. | `HINCRBYFLOAT`, `INCRBYFLOAT` |\n| `ERR index out of range` | `LSET` got an index beyond the ends of the list. Use an index from 0 to the length minus 1, or a negative index from -1 down to minus the length; `LLEN` returns the length. | `LSET` |\n| `ERR insert index overflow` | `ARINSERT` would write past the last valid array index, 18446744073709551614, because its insert position, which `ARSEEK` and earlier inserts move forward, is too close to it. Move the insert position back with `ARSEEK`, or use a new key. | `ARINSERT` |\n| `ERR Insufficient memory, failed allocating transient memory for LCS` | `LCS` couldn't allocate the working table it needs, which takes about 4 bytes times the product of the two string lengths. Compare shorter strings, or free memory on the server. | `LCS` |\n| `ERR Insufficient memory, failed allocating transient memory, COUNT too high.` | The `COUNT` you passed to `XAUTOCLAIM` is so large that Redis couldn't allocate the memory it reserves for it in advance. Use a smaller count, such as the default of 100, and call `XAUTOCLAIM` again with the cursor it returns. | `XAUTOCLAIM` |\n| `ERR Insufficient memory, failed allocating transient memory, too many args.` | Redis couldn't allocate memory to hold the list of input keys for the command. This only happens with an enormous number of keys or a server that's out of memory; pass fewer keys in each call. | `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZUNION`, `ZUNIONSTORE` |\n| `ERR Insufficient memory, transient memory for LCS exceeds proto-max-bulk-len` | `LCS` needs a working table of about 4 bytes times the product of the two string lengths, and that's more than `proto-max-bulk-len`, 512 MB by default, which two strings of about 11,600 bytes each already exceed. Compare shorter strings. | `LCS` |\n| `ERR Invalid argument '<argument>' for SENTINEL SET '<option>'` | You ran `SENTINEL SET` with a value that the option named in the message doesn't accept. `quorum`, `down-after-milliseconds`, `failover-timeout` and `parallel-syncs` need an integer of 1 or more, `master-reboot-down-after-period` needs 0 or more, and `rename-command` names can't be empty. | `SENTINEL SET` |\n| `ERR Invalid argument '<option>' to SENTINEL CONFIG SET` | You ran `SENTINEL CONFIG SET` with an option it doesn't support. You can set `announce-ip`, `announce-port`, `announce-hostnames`, `resolve-hostnames`, `sentinel-user`, `sentinel-pass` and `loglevel`. | `SENTINEL CONFIG` |\n| `ERR Invalid arguments specified for command` | `COMMAND GETKEYS` couldn't find the keys in the command you passed, because its arguments don't add up, for example a key count larger than the number of keys given. Pass the full command exactly as you would run it. | `COMMAND GETKEYS`, `COMMAND GETKEYSANDFLAGS` |\n| `ERR invalid array index` | An array index you passed isn't a whole number from 0 to 18446744073709551614; negative numbers and text aren't accepted. Pass a valid index. `ARGREP` also accepts `-` and `+` for the first and last index. | `ARDEL`, `ARDELRANGE`, `ARGET`, `ARGETRANGE`, `ARMGET`, `ARMSET`, `AROP`, `ARSCAN`, `ARSET`, `ARGREP`, `ARSEEK` |\n| `ERR Invalid base port specified: <port>` | The port you passed to `CLUSTER MEET` isn't a whole number. Pass the node's client port, such as `6379`. | `CLUSTER MEET` |\n| `ERR Invalid bitfield type. Use something like i16 u8. Note that u64 is not supported but i64 is.` | A bitfield type is `i` for signed or `u` for unsigned, followed by a width in bits: `i1` to `i64`, or `u1` to `u63`. Unsigned 64-bit fields aren't supported, so use `i64` instead. | `BITFIELD`, `BITFIELD_RO` |\n| `ERR Invalid bus port specified: <bus_port>` | The cluster bus port you passed to `CLUSTER MEET` isn't a whole number. Pass the node's bus port, or leave it out to use the client port plus 10000. | `CLUSTER MEET` |\n| `ERR Invalid client ID` | One of the values after `CLIENT LIST ID` isn't an integer. Pass the numeric client IDs that `CLIENT ID` or `CLIENT LIST` shows. | `CLIENT LIST` |\n| `ERR Invalid CLUSTER SETSLOT action or number of arguments. Try CLUSTER HELP` | `CLUSTER SETSLOT` takes a slot and then `IMPORTING`, `MIGRATING`, or `NODE` followed by a node ID, or `STABLE` alone. Check the action name and the number of arguments. | `CLUSTER SETSLOT` |\n| `ERR Invalid command passed to redis.acl_check_cmd() script: <script>, on <source>:<line>.` | Your script called `redis.acl_check_cmd()` with a first argument that isn't a command or subcommand this server knows. Pass the command name first, followed by its arguments, for example `redis.acl_check_cmd('get', 'key')`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Invalid command specified` | You passed `COMMAND GETKEYS` or `COMMAND GETKEYSANDFLAGS` a command or subcommand that this server doesn't know. Check the spelling, and that the module that adds the command is loaded. | `COMMAND GETKEYS`, `COMMAND GETKEYSANDFLAGS` |\n| `ERR Invalid condition. Use IFEQ, IFNE, IFDEQ, or IFDNE` | The condition you passed to `DELEX` isn't one it knows. Use `IFEQ` or `IFNE` with a value, or `IFDEQ` or `IFDNE` with a digest of the value. | `DELEX` |\n| `ERR Invalid config epoch specified: <epoch>` | `CLUSTER SET-CONFIG-EPOCH` takes a config epoch of 0 or more, and you passed a negative number. While you create a cluster, give each node a different epoch. | `CLUSTER SET-CONFIG-EPOCH` |\n| `ERR invalid COUNT` | The count you passed isn't valid. For `VSIM`, the value after `COUNT` must be a whole number greater than 0. For `ARLASTITEMS`, the count must be an integer, and 0 or less returns an empty array. | `VSIM`, `ARLASTITEMS` |\n| `ERR invalid cursor` | The cursor you passed to `SCAN`, `HSCAN`, `SSCAN`, or `ZSCAN` isn't a whole number of 0 or more. Start with `0`, then pass back the exact cursor that the previous call returned. | `HSCAN`, `SCAN`, `SSCAN`, `ZSCAN` |\n| `ERR invalid end ID for the interval` | You passed an exclusive end ID, marked with `(`, that has no ID before it, such as `(0-0`. Use a larger end ID, or remove the `(`. | `XRANGE`, `XREVRANGE`, `XPENDING` |\n| `ERR Invalid engine in script shebang` | Your script starts with `#!`, but Redis couldn't parse that first line, usually because it has an unbalanced quote. Make the first line `#!lua`, optionally followed by `flags=` and a comma-separated list of flags, then a newline. | `EVAL`, `EVAL_RO`, `SCRIPT LOAD` |\n| `ERR invalid expire time in '<command>' command` | The expiry time is out of range for the command named in the message. For `SET`, `SETEX`, `GETEX`, and similar commands it must be greater than 0; for `EXPIRE`, `HEXPIRE`, and their variants, it's so large that it would overflow once converted to an absolute time in milliseconds. | `EXPIRE`, `EXPIREAT`, `PEXPIRE`, `PEXPIREAT`, `HEXPIRE`, `HEXPIREAT`, `HGETEX`, `HPEXPIRE`, `HPEXPIREAT`, `HSETEX`, `GETEX`, `INCREX`, `MSETEX`, `PSETEX`, `SET`, `SETEX`, `SETNX` |\n| `ERR invalid expire time, must be >= 0` | The expiration time you passed is negative. Pass 0 or more: a number of seconds or milliseconds for relative times, or a Unix timestamp for `EXAT`, `PXAT`, `HEXPIREAT` and `HPEXPIREAT`. | `HEXPIRE`, `HEXPIREAT`, `HGETEX`, `HPEXPIRE`, `HPEXPIREAT`, `HSETEX` |\n| `ERR invalid first DB index` | The first database number in `SWAPDB` isn't a whole number. Pass two database numbers, such as `SWAPDB 0 1`. | `SWAPDB` |\n| `ERR Invalid FREQ value, must be >= 0 and <= 255` | The value after `FREQ` in `RESTORE` is out of range. Pass a least frequently used (LFU) counter from 0 to 255. | `RESTORE` |\n| `ERR Invalid IDLE option argument for XCLAIM` | The value after `IDLE` in `XCLAIM` isn't an integer. Pass the idle time to set, in milliseconds. | `XCLAIM` |\n| `ERR Invalid IDLETIME value, must be >= 0` | The value after `IDLETIME` in `RESTORE` is negative. Pass the idle time in seconds, as 0 or more. | `RESTORE` |\n| `ERR Invalid IP address or hostname specified` | You ran `SENTINEL MONITOR` with an address that isn't a valid Internet Protocol (IP) address, or a host name that Sentinel can't resolve. Sentinel accepts host names only when `resolve-hostnames` is `yes`; otherwise, pass an IP address. | `SENTINEL MONITOR` |\n| `ERR Invalid library metadata` | The first line of your library starts with `#!` but can't be read, because no newline follows it or it has an unbalanced quote. Put `#!lua name=mylib` alone on the first line, followed by a newline and then the code. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Invalid log level. script: <script>, on <source>:<line>.` | Your script called `redis.log()` with a log level outside the valid range of 0 to 3. Use one of the constants `redis.LOG_DEBUG`, `redis.LOG_VERBOSE`, `redis.LOG_NOTICE` or `redis.LOG_WARNING`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR invalid longitude,latitude pair <longitude>,<latitude>` | The coordinates in the message are out of range: longitude must be between -180 and 180, and latitude between -85.05112878 and 85.05112878. Redis takes longitude first, so check that you didn't swap the two. | `GEOADD`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR Invalid master port` | The port you passed to `REPLICAOF` isn't an integer from 0 to 65535. Pass the port the primary listens on, usually `6379`, or use `REPLICAOF NO ONE` to stop replicating. | `REPLICAOF`, `SLAVEOF` |\n| `ERR Invalid metadata value given: <value>` | The shebang line of your library has an option other than `name=`, shown in the message. Libraries accept only `name=`; set flags such as `no-writes` on each function in `redis.register_function` instead. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Invalid metadata value, name argument was given multiple times` | The shebang line of your library has more than one `name=` option. Keep a single `name=` with the library's name. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Invalid min-idle-time argument for XAUTOCLAIM` | The minimum idle time you passed to `XAUTOCLAIM`, the argument after the consumer name, isn't an integer. Pass it in milliseconds, for example 60000 for one minute. | `XAUTOCLAIM` |\n| `ERR Invalid min-idle-time argument for XCLAIM` | The minimum idle time you passed to `XCLAIM`, the argument after the consumer name, isn't an integer. Pass it in milliseconds, for example 60000 for one minute. | `XCLAIM` |\n| `ERR Invalid node address specified: <ip>:<port>` | `CLUSTER MEET` needs a numeric address, not a hostname, and ports from 1 to 65535, and the address or a port isn't valid. If you have a hostname, resolve it to its address first. | `CLUSTER MEET` |\n| `ERR Invalid node id length <length>` | A `CLUSTER SYNCSLOTS CONF` message carried a node ID that isn't 40 characters long. Nodes send this message to each other during an atomic slot migration, so check that all nodes run the same Redis version. | `CLUSTER SYNCSLOTS` |\n| `ERR Invalid number of arguments specified for command` | You passed `COMMAND GETKEYS` or `COMMAND GETKEYSANDFLAGS` a command with the wrong number of arguments for it, such as `SET` with no key. Pass the full command with all of its arguments. | `COMMAND GETKEYS`, `COMMAND GETKEYSANDFLAGS` |\n| `ERR invalid number of fields` | The number after `FIELDS` in `HGETEX` or `HSETEX` is 0, negative, or not an integer. Pass the number of fields that follow it, from 1 to 2147483647. | `HGETEX`, `HSETEX` |\n| `ERR invalid number of ranges` | The number after `RANGES` in `TRIMSLOTS` must be from 1 to 16384, and the command must then list exactly that many pairs of start and end slots. Check the count against the pairs you passed. | `TRIMSLOTS` |\n| `ERR invalid number of slot ranges: <count>` | You passed 16384 or more slot ranges, which is more than the number of slots in a cluster. Merge neighboring slots into fewer ranges, for example one range `0 999` instead of a range for each slot. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS`, `SFLUSH`, `TRIMSLOTS` |\n| `ERR invalid numkeys value` | The first argument of `MSETEX`, the number of keys, is 0, negative, or not an integer. Pass the number of key and value pairs that follow it, which must be at least 1. | `MSETEX` |\n| `ERR Invalid or out of range slot` | A hash slot number in the command isn't a whole number from 0 to 16383. Check the slot arguments. `CLUSTER KEYSLOT` shows the slot of a key. | `CLUSTER SLOT-STATS`, `CLUSTER SYNCSLOTS`, `HOTKEYS START`, `SFLUSH`, `TRIMSLOTS` |\n| `ERR Invalid OVERFLOW type specified` | The value after `OVERFLOW` in `BITFIELD` isn't valid. Use `WRAP`, `SAT`, or `FAIL`. | `BITFIELD`, `BITFIELD_RO` |\n| `ERR Invalid port` | You ran `SENTINEL MONITOR` with a port that isn't an integer. Pass the port that the primary listens on as a number, such as 6379. | `SENTINEL MONITOR` |\n| `ERR Invalid port number.` | You ran `SENTINEL MONITOR` with a port outside the range 0 to 65535. Pass the port that the primary listens on, such as 6379. | `SENTINEL MONITOR` |\n| `ERR Invalid quorum` | You ran `SENTINEL MONITOR` with a quorum that isn't an integer. The quorum is the number of Sentinels that must agree that the primary is down; pass it as a whole number of 1 or more. | `SENTINEL MONITOR` |\n| `ERR invalid regular expression: <reason>` | An `RE` pattern that you passed to `ARGREP` isn't a valid extended regular expression; the end of the message says what's wrong, such as a missing parenthesis. Fix the pattern, and escape characters that have a special meaning. | `ARGREP` |\n| `ERR Invalid replication flags. Use REPL_AOF, REPL_REPLICA, REPL_ALL or REPL_NONE. script: <script>, on <source>:<line>.` | Your script passed `redis.set_repl()` a number that isn't a valid combination of replication flags. Pass one of the constants `redis.REPL_NONE`, `redis.REPL_AOF`, `redis.REPL_REPLICA` or `redis.REPL_ALL`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Invalid RETRYCOUNT option argument for XCLAIM` | The value after `RETRYCOUNT` in `XCLAIM` isn't an integer. Pass the delivery count to set, as a whole number. | `XCLAIM` |\n| `ERR Invalid RETRYCOUNT value, must be >= 0` | You passed `XNACK` a negative `RETRYCOUNT`. Pass 0 or more to set the delivery count of the entries you release. | `XNACK` |\n| `ERR Invalid script shebang` | Your script starts with `#!` but contains no newline, so the shebang line never ends. Put the shebang, such as `#!lua`, alone on the first line, and the Lua code on the lines after it. | `EVAL`, `EVAL_RO`, `SCRIPT LOAD` |\n| `ERR invalid second DB index` | The second database number in `SWAPDB` isn't a whole number. Pass two database numbers, such as `SWAPDB 0 1`. | `SWAPDB` |\n| `ERR invalid size` | You ran `ARRING` with a ring size that isn't an integer. Pass the number of slots in the ring buffer as a whole number of 1 or more. | `ARRING` |\n| `ERR Invalid slot` | `CLUSTER COUNTKEYSINSLOT` takes a hash slot from 0 to 16383, and you passed a number outside that range. | `CLUSTER COUNTKEYSINSLOT` |\n| `ERR Invalid slot info: <slot_info>` | A `CLUSTER SYNCSLOTS CONF` message carried slot details that aren't three non-negative numbers, slot, key count, and expiry count, separated by colons. Nodes send this message to each other during an atomic slot migration, so check that all nodes run the same Redis version. | `CLUSTER SYNCSLOTS` |\n| `ERR Invalid slot or number of keys` | `CLUSTER GETKEYSINSLOT` needs a hash slot from 0 to 16383 and a count of 0 or more, and one of them is out of range. | `CLUSTER GETKEYSINSLOT` |\n| `ERR invalid start ID for the interval` | You passed an exclusive start ID, marked with `(`, that has no ID after it, because it's the largest possible ID. Use a smaller start ID, or remove the `(`. | `XRANGE`, `XREVRANGE`, `XPENDING`, `XAUTOCLAIM` |\n| `ERR Invalid stream ID specified as stream command argument` | A stream entry ID you passed isn't valid. Write it as milliseconds and a sequence number joined by a dash, such as `1526919030474-55`, or as the milliseconds alone. `-` and `+` work only where the command allows them. | `XACK`, `XACKDEL`, `XADD`, `XAUTOCLAIM`, `XCLAIM`, `XDEL`, `XDELEX`, `XGROUP SETID`, `XIDMPRECORD`, `XNACK`, `XPENDING`, `XRANGE`, `XREAD`, `XREADGROUP`, `XREVRANGE`, `XSETID`, `XTRIM` |\n| `ERR Invalid task id` | During an atomic slot migration, a node opened its data connection with a task ID that isn't 40 characters long. This is internal to the migration. Check `CLUSTER MIGRATION STATUS` on the importing node, and import again if the task failed. | `CLUSTER SYNCSLOTS` |\n| `ERR Invalid TIME option argument for XCLAIM` | The value after `TIME` in `XCLAIM` isn't an integer. Pass a Unix time in milliseconds. | `XCLAIM` |\n| `ERR Invalid TTL value, must be >= 0` | The time to live (TTL) you passed to `RESTORE` is negative. Pass the TTL in milliseconds, 0 for no expiry, or a Unix time in milliseconds together with `ABSTTL`. | `RESTORE` |\n| `ERR Invalid value '<value>' to SENTINEL CONFIG SET '<option>'` | You ran `SENTINEL CONFIG SET` with a value that the option named in the message doesn't accept. `resolve-hostnames` and `announce-hostnames` take `yes` or `no`, `announce-port` takes 0 to 65535, and `loglevel` takes `debug`, `verbose`, `notice`, `warning` or `nothing`. | `SENTINEL CONFIG` |\n| `ERR Key should be of string type if conditions are specified` | `DELEX` with a condition works only on string keys, and this key holds another type. Use `DEL` without a condition, or check the key's type with `TYPE`. | `DELEX` |\n| `ERR LBOUND can't be greater than UBOUND` | You passed `INCREX` an `LBOUND` that's larger than its `UBOUND`. Make `LBOUND` the lowest and `UBOUND` the highest value that the result may take. | `INCREX` |\n| `ERR LBOUND is not a valid float` | With `BYFLOAT`, `INCREX` reads `LBOUND` as a decimal number, and the value you passed isn't one. Pass a number such as `0` or `-1.5`. | `INCREX` |\n| `ERR LBOUND is not an integer or out of range` | Without `BYFLOAT`, `INCREX` reads `LBOUND` as a 64-bit integer, and the value you passed isn't one. Pass a whole number, or add `BYFLOAT` to use decimal bounds. | `INCREX` |\n| `ERR Library '<library>' already exists` | A library with the name in the message is already loaded. To overwrite it, run `FUNCTION LOAD REPLACE`, or give the new library a different `name=` in its shebang line. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Library <library> already exists` | The payload you passed to `FUNCTION RESTORE` has a library with the same name as one that's already loaded, and the default `APPEND` policy doesn't overwrite. Add `REPLACE` to overwrite libraries with the same name, or `FLUSH` to delete all existing libraries first. | `FUNCTION RESTORE` |\n| `ERR library name argument was not given` | You ended `FUNCTION LIST` with `LIBRARYNAME` but no pattern after it. Add a library name pattern, such as `LIBRARYNAME mylib*`. | `FUNCTION LIST` |\n| `ERR Library name was not given` | The shebang line of your library has no `name=` option. Start the code with a line such as `#!lua name=mylib`, followed by a newline. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Library names can only contain letters, numbers, or underscores(_) and must be at least one character long` | The library name after `name=` is empty or has characters other than letters, digits, and underscores. Rename the library using only those characters, such as `name=my_lib`. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR Library not found` | No library with the name you passed to `FUNCTION DELETE` is loaded. Library names are case-sensitive, so check the exact name with `FUNCTION LIST`. | `FUNCTION DELETE` |\n| `ERR LIMIT can't be negative` | You passed a `LIMIT` that's negative or not an integer. Pass the most elements to count, or 0 for no limit. | `SINTERCARD`, `SUNIONCARD`, `SDIFFCARD`, `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZUNION`, `ZUNIONSTORE` |\n| `ERR Limit has to lie in between 1 and 16384 (maximum number of slots).` | The value after `LIMIT` in `CLUSTER SLOT-STATS` must be a whole number from 1 to 16384. Pass a value in that range, or leave out `LIMIT` to get all slots. | `CLUSTER SLOT-STATS` |\n| `ERR LIMIT must be positive` | You passed `ARSCAN` or `ARGREP` a `LIMIT` of 0 or less. Pass a count of 1 or more, or leave out `LIMIT` to return every match in the range. | `ARSCAN`, `ARGREP` |\n| `ERR Lua redis lib command arguments must be strings or integers script: <script>, on <source>:<line>.` | Your script passed `redis.call()`, `redis.pcall()` or `redis.acl_check_cmd()` an argument that isn't a string or a number, such as a table, a boolean or `nil`. Convert each argument to a string or number, and pass the elements of a table as separate arguments. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR luaRedisGenericCommand() recursive call detected. Are you doing funny stuff with Lua debug hooks?` | The internal function behind `redis.call()` and `redis.pcall()`, named in the message, was called again while it was still running, which only Lua debug hooks can cause. Scripts can't set debug hooks in normal use, so look for modified Lua code or a debugging tool. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Main channel connection is not established` | During an atomic slot migration, the importing node's main connection to this node closed before its data connection was set up, so this attempt failed. Check the network between the nodes. `CLUSTER MIGRATION STATUS` shows the task's state and retries. | `CLUSTER SYNCSLOTS` |\n| `ERR Mandatory argument FIELDS is missing or not at the right position` | The argument after the key isn't `FIELDS`. These commands need `FIELDS` right after the key, then the number of fields, then the field names, for example `HTTL key FIELDS 2 f1 f2`. | `HGETDEL`, `HEXPIRETIME`, `HPEXPIRETIME`, `HPTTL`, `HTTL`, `HPERSIST` |\n| `ERR Master is down or failed, please use CLUSTER FAILOVER FORCE` | A normal `CLUSTER FAILOVER` needs the primary to be reachable, and this replica sees it as down or failed. Use `CLUSTER FAILOVER FORCE` to fail over without the primary, or `TAKEOVER` if most primaries are unreachable too. | `CLUSTER FAILOVER` |\n| `ERR Master name must not contain control characters` | You ran `SENTINEL MONITOR` with a primary name that contains a control character, such as a newline or a tab. Choose a name made of printable characters only. | `SENTINEL MONITOR` |\n| `ERR MATCH requires a value argument` | You ran `AROP` with the `MATCH` operation but didn't pass exactly one value after it. Add the value to count, for example `AROP key 0 100 MATCH done`. | `AROP` |\n| `ERR max number of clients + cluster connections reached` | The server has reached its `maxclients` limit, which counts both client connections and connections to other cluster nodes. Redis sends this error to the new connection and closes it; close idle connections, or raise `maxclients`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-max-clients/#how-to-fix-it) | New connections |\n| `ERR max number of clients reached` | The server already has `maxclients` connections, 10000 by default, so it refused the new one and closed it. Close idle connections or fix connection leaks in your app, use a connection pool, or raise `maxclients`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-max-clients/#how-to-fix-it) | New connections |\n| `ERR maxage is not an integer or out of range` | The value after `CLIENT KILL MAXAGE` isn't an integer. Pass the minimum connection age in seconds, such as `MAXAGE 3600`. | `CLIENT KILL` |\n| `ERR maxage should be greater than 0` | The value after `CLIENT KILL MAXAGE` is 0 or negative. Pass a positive number of seconds; Redis then kills the connections that are older than that. | `CLIENT KILL` |\n| `ERR MAXCOUNT must be a positive integer` | You passed `XREAD` or `XREADGROUP` a `MAXCOUNT` of 0 or less. Pass the most entries to return across all the streams, which must be 1 or more. | `XREAD`, `XREADGROUP` |\n| `ERR MAXCOUNT must be greater than or equal to COUNT` | `MAXCOUNT` limits the total number of entries across all the streams, so it can't be smaller than `COUNT`, the limit for each stream. Raise `MAXCOUNT` or lower `COUNT`. | `XREAD`, `XREADGROUP` |\n| `ERR MAXLEN can't be negative` | You passed `LPOS` a `MAXLEN` that's negative or not an integer. Pass the number of elements to compare, or 0 to search the whole list. | `LPOS` |\n| `ERR MAXSIZE must be a positive integer` | You passed `XREAD` or `XREADGROUP` a `MAXSIZE` of 0 or less. Pass the largest reply size you want, in bytes, which must be 1 or more. | `XREAD`, `XREADGROUP` |\n| `ERR METRICS count does not match number of metric types provided` | The count after `METRICS` in `HOTKEYS START` is larger than the number of metric names that follow it. Make the count match the names, as in `METRICS 1 CPU` or `METRICS 2 CPU NET`. | `HOTKEYS START` |\n| `ERR METRICS count must be > 0 and <= 2` | The count after `METRICS` in `HOTKEYS START` isn't 1 or 2. Pass the number of metric names that follow it, which can be `CPU`, `NET`, or both. | `HOTKEYS START` |\n| `ERR METRICS CPU defined more than once!` | The `METRICS` list in `HOTKEYS START` names `CPU` more than once. List each metric once, as in `METRICS 2 CPU NET`. | `HOTKEYS START` |\n| `ERR METRICS NET defined more than once!` | The `METRICS` list in `HOTKEYS START` names `NET` more than once. List each metric once, as in `METRICS 2 CPU NET`. | `HOTKEYS START` |\n| `ERR METRICS no valid metrics passed. Supported: CPU\\|NET` | None of the metric names after `METRICS` in `HOTKEYS START` is `CPU` or `NET`. Name at least one of them, as in `METRICS 1 CPU`. | `HOTKEYS START` |\n| `ERR METRICS parameter is required` | `HOTKEYS START` must begin with `METRICS`, a count, and the metric names, before any other option. Start the command as `HOTKEYS START METRICS 1 CPU`, then add `COUNT`, `DURATION`, `SAMPLE`, or `SLOTS`. | `HOTKEYS START` |\n| `ERR min or max is not a float` | A score bound you passed isn't a number. Use a number, a number with `(` in front to exclude it, or `-inf` and `+inf` for no limit. | `ZREMRANGEBYLEX`, `ZREMRANGEBYRANK`, `ZREMRANGEBYSCORE`, `ZCOUNT`, `ZRANGE`, `ZRANGEBYLEX`, `ZRANGEBYSCORE`, `ZRANGESTORE`, `ZREVRANGE`, `ZREVRANGEBYLEX`, `ZREVRANGEBYSCORE` |\n| `ERR min or max not valid string range item` | A lexicographic bound you passed doesn't start with `[` (inclusive) or `(` (exclusive), and isn't `-` or `+`. Write bounds such as `[a` or `(b`, or use `-` and `+` for the lowest and highest values. | `ZREMRANGEBYLEX`, `ZREMRANGEBYRANK`, `ZREMRANGEBYSCORE`, `ZLEXCOUNT`, `ZRANGE`, `ZRANGEBYLEX`, `ZRANGEBYSCORE`, `ZRANGESTORE`, `ZREVRANGE`, `ZREVRANGEBYLEX`, `ZREVRANGEBYSCORE` |\n| `ERR min-idle-time is not an integer or out of range` | The value after `CLAIM` in `XREADGROUP` isn't an integer. Pass the minimum time, in milliseconds, that a pending entry must be idle before this consumer claims it. | `XREAD`, `XREADGROUP` |\n| `ERR min-idle-time must be a positive integer` | The value after `CLAIM` in `XREADGROUP` is negative. Pass 0 or more milliseconds; 0 is accepted even though the message says positive. | `XREAD`, `XREADGROUP` |\n| `ERR Missing argument '<option>' value` | You ran `SENTINEL CONFIG SET`, and the option named in the message, the last one in the command, has no value after it. Give every option a value, in name and value pairs. | `SENTINEL CONFIG` |\n| `ERR missing expire time` | You ended `HGETEX` or `HSETEX` with `EX`, `PX`, `EXAT` or `PXAT` and no time after it. Put the time right after the option, for example `EX 60`. | `HGETEX`, `HSETEX` |\n| `ERR missing FIELDS argument` | The command has no `FIELDS` block, so Redis doesn't know which fields to act on. Add `FIELDS`, the number of fields, and the field names, for example `HEXPIRE key 60 FIELDS 1 field`. | `HGETEX`, `HSETEX`, `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR Missing GROUP option for XREADGROUP` | You ran `XREADGROUP` without the `GROUP` option. Add `GROUP` followed by the group name and the consumer name before `STREAMS`, or use `XREAD` to read without a group. | `XREADGROUP` |\n| `ERR Missing library metadata` | The code you passed to `FUNCTION LOAD` doesn't start with a shebang line. Library code must begin with a line such as `#!lua name=mylib`, followed by a newline and then the Lua code. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR missing ranges argument` | The first argument of `TRIMSLOTS` must be the keyword `RANGES`, followed by the number of ranges and the ranges. Nodes normally send this command themselves after an atomic slot migration. | `TRIMSLOTS` |\n| `ERR missing subcommand. Try <command> HELP.` | You sent a command that only works with a subcommand, such as `CONFIG` or `CLIENT`, without one. Add the subcommand, and run the command followed by `HELP` to list them. For built-in commands, Redis usually reports a wrong number of arguments instead. | Commands with subcommands |\n| `ERR mode must be SILENT, FAIL, or FATAL` | The argument after the group name in `XNACK` isn't a valid mode. Pass `SILENT`, `FAIL` or `FATAL`, which decide how the delivery count of the released entries changes. | `XNACK` |\n| `ERR Module blocking client on auth when not currently undergoing module authentication` | A module tried to block a client for authentication while that client wasn't being authenticated by a module. This is a bug in the module; report it to its developers. | Module commands |\n| `ERR MODULE command not allowed. If the enable-module-command option is set to \"local\", you can run it from a local connection, otherwise you need to set this option in the configuration file, and then restart the server.` | `MODULE` is turned off on this server, which is the default, so you can't load or unload modules at runtime. Set `enable-module-command` to `yes`, or to `local` for local connections only, in the configuration file and restart Redis, or load modules there with `loadmodule`. | `MODULE LOAD`, `MODULE LOADEX`, `MODULE UNLOAD` |\n| `ERR module key failed to copy` | `COPY` asked the module that owns the key's data type to duplicate the value, and the module reported a failure. Check the Redis log and the module's documentation, or re-create the value under the new key with the module's own commands. | `COPY` |\n| `ERR MONITOR isn't allowed for DENY BLOCKING client` | You ran `MONITOR` where Redis expects exactly one reply for each command, such as inside a `MULTI` transaction. Run `MONITOR` on its own, on a connection that you use only for monitoring. | `MONITOR` |\n| `ERR MOVE is not allowed in cluster mode` | In cluster mode there's only database 0, so `MOVE` can't move keys between databases. To move keys to another node, use `MIGRATE`. | `MOVE` |\n| `ERR MULTI calls can not be nested` | You sent `MULTI` while a transaction was already open on this connection, and transactions can't be nested. The open transaction continues, so finish it with `EXEC` or `DISCARD` before you start another. | `MULTI` |\n| `ERR Multiple condition flags specified` | You passed more than one of `NX`, `XX`, `GT` and `LT`, but these commands accept only one condition. Choose the one condition that decides whether the expiration is set. | `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR Multiple filters of the same type are disallowed.` | `CLUSTER SLOT-STATS` got `LIMIT` twice, or more than one of `ASC` and `DESC`. Pass each of these options at most once. | `CLUSTER SLOT-STATS` |\n| `ERR must be exactly 16 hexadecimal characters` | The digest you passed to `IFDEQ` or `IFDNE` in `SET` or `DELEX` isn't 16 characters long. Pass the value's digest exactly as the `DIGEST` command returns it. | `DELEX`, `PSETEX`, `SET`, `SETEX`, `SETNX` |\n| `ERR need numeric height` | The height after `BYBOX` in `GEOSEARCH` or `GEOSEARCHSTORE` isn't a number. Pass the width and the height as numbers, then the unit, as in `BYBOX 10 5 km`. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR need numeric radius` | The radius in `GEORADIUS`, `GEORADIUSBYMEMBER`, or after `BYRADIUS` isn't a number. Pass the radius as a number followed by a separate unit, as in `BYRADIUS 5 km`, not `5km`. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR need numeric width` | The width after `BYBOX` in `GEOSEARCH` or `GEOSEARCHSTORE` isn't a number. Pass the width and the height as numbers, then the unit, as in `BYBOX 10 5 km`. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR No backup in progress` | `BACKUP ABORT` found no backup to cancel. Either none was started, or it was already sealed, aborted, or failed. Check the state with `BACKUP STATUS`, and remove a sealed or failed backup with `BACKUP CLEANUP`. | `BACKUP ABORT` |\n| `ERR No backup ready to seal (must be in the incrementing state)` | `BACKUP SEAL` works only after the backup's snapshot is complete, when `BACKUP STATUS` reports the state `incrementing`. Wait for the snapshot to finish, or run `BACKUP START` first if no backup is running. | `BACKUP SEAL` |\n| `ERR No failover in progress.` | You ran `FAILOVER ABORT`, but no failover is running, so there's nothing to cancel. It may have finished or timed out already. | `FAILOVER` |\n| `ERR No functions registered` | Your library code ran without calling `redis.register_function`, so it defines no functions. Every library must register at least one function in its top-level code. | `FUNCTION LOAD`, `FUNCTION RESTORE` |\n| `ERR No ID yet` | `CLUSTER MYID` found that this node has no node ID yet. Cluster nodes get an ID when they start, so this normally doesn't happen. Check that the server finished starting in cluster mode. | `CLUSTER MYID` |\n| `ERR No samples available for event '<event>'` | `LATENCY GRAPH` has no samples for the event in the message. Redis records an event only when it takes longer than `latency-monitor-threshold` milliseconds, and the default of 0 turns the monitor off; run `LATENCY LATEST` to see which events have samples. | `LATENCY GRAPH`, `LATENCY HISTORY` |\n| `ERR No shard ID yet` | `CLUSTER MYSHARDID` found that this node has no shard ID yet. Cluster nodes get one when they start, so this normally doesn't happen. Check that the server finished starting in cluster mode. | `CLUSTER MYSHARDID` |\n| `ERR No shutdown in progress.` | You ran `SHUTDOWN ABORT`, but no shutdown is in progress, so there's nothing to cancel. A shutdown can be aborted only while it's waiting, for example for replicas to catch up. | `SHUTDOWN` |\n| `ERR No slot migration task in progress` | During an atomic slot migration, the importing node opened its data connection, but this node isn't running any migration, for example because it was canceled or timed out. Check `CLUSTER MIGRATION STATUS` on the importing node. | `CLUSTER SYNCSLOTS` |\n| `ERR No such client` | No connection matches the address you passed to `CLIENT KILL` in its old form, with only an address and port. Check the `addr` field in `CLIENT LIST`, or use the newer form, such as `CLIENT KILL ID 42`, which returns how many clients it killed. | `CLIENT KILL` |\n| `ERR no such fieldset` | `HIMPORT SET` names a fieldset that this connection hasn't prepared. Fieldsets belong to the connection that ran `HIMPORT PREPARE`, and you lose them when you reconnect, run `RESET` or `HIMPORT DISCARD`, or a script ends, so prepare it again on the same connection. | `HIMPORT SET` |\n| `ERR no such key` | The command needs a key that already exists, and the key you passed doesn't, for example the source key of `RENAME`, the list in `LSET`, or the stream in `XINFO` or `XSETID`. Check the key name and the database you're connected to. | `RENAME`, `RENAMENX`, `ARINFO`, `LSET`, `XSETID`, `XIDMPRECORD`, `XINFO CONSUMERS`, `XINFO GROUPS`, `XINFO HELP`, `XINFO STREAM`, `XCFGSET` |\n| `ERR No such master with that name` | This Sentinel doesn't monitor a primary with the name you passed. Names are case-sensitive; run `SENTINEL MASTERS` to list the names it knows, or add the primary with `SENTINEL MONITOR`. | `SENTINEL CKQUORUM`, `SENTINEL FAILOVER`, `SENTINEL MASTER`, `SENTINEL REMOVE`, `SENTINEL REPLICAS`, `SENTINEL SENTINELS` |\n| `ERR No such message in stream` | `XIDMPRECORD` named an entry ID that isn't in the stream, for example because the entry was deleted or trimmed. Pass the ID of an existing entry. | `XIDMPRECORD` |\n| `ERR No such user '<username>'` | The user name you passed to `CLIENT KILL USER` doesn't exist. User names are case-sensitive, so check them with `ACL USERS`. | `CLIENT KILL` |\n| `ERR Node <node_id> not found in cluster` | During an atomic slot migration, a node sent an ID that this node doesn't know. Make sure the importing node has joined the cluster and that `CLUSTER NODES` on this node lists it, then import again. | `CLUSTER SYNCSLOTS` |\n| `ERR Node config epoch is already non-zero` | `CLUSTER SET-CONFIG-EPOCH` works only on a fresh node whose config epoch is still 0, and this node already has one. You only need this command while creating a new cluster. | `CLUSTER SET-CONFIG-EPOCH` |\n| `ERR not enough slot numbers provided` | The count after `SLOTS` in `HOTKEYS START` is larger than the number of slot numbers that follow it. Make the count match the slots you list. | `HOTKEYS START` |\n| `ERR not supported for this module key` | The key holds a module data type that doesn't support `COPY`. In Redis 8.10 this includes vector sets and the Bloom filter, cuckoo filter, count-min sketch, Top-K, and t-digest types, while JSON and time series keys can be copied. | `COPY` |\n| `ERR Notification script seems non existing or non executable` | You ran `SENTINEL SET` with `notification-script`, but the path doesn't point to a file that the Sentinel process can execute. Check the path, and make the file executable for the user that runs Sentinel. | `SENTINEL SET` |\n| `ERR notification-script must not contain control characters` | You ran `SENTINEL SET` with a `notification-script` path that contains a control character, such as a newline or a tab. Pass a plain file path. | `SENTINEL SET` |\n| `ERR NOVALUES option can only be used in HSCAN` | `NOVALUES` returns only the field names of a hash, so it works only with `HSCAN`. Remove it from `SCAN`, `SSCAN`, or `ZSCAN`. | `SCAN`, `SSCAN`, `ZSCAN` |\n| `ERR Number of fields must be a positive integer` | The number after `FIELDS` is 0, negative, or not an integer. Pass the number of field names that follow it, which must be at least 1. | `HGETDEL`, `HEXPIRETIME`, `HPEXPIRETIME`, `HPTTL`, `HTTL`, `HPERSIST` |\n| `ERR number of IDs doesn't match numids` | In `XNACK`, the number after `IDS` is larger than the number of IDs that follow it. Make the count equal to the number of IDs you list. | `XNACK` |\n| `ERR Number of IDs must be a positive integer` | The number after `IDS` is 0, negative, or not an integer. Pass the number of entry IDs that follow it, which must be at least 1. | `XACKDEL`, `XDELEX` |\n| `ERR Number of keys can't be greater than number of args` | The numkeys argument of a command such as `EVAL`, `FCALL`, or `SINTERCARD` is larger than the number of arguments that follow it. Set it to the number of key names you pass right after it, and put any other arguments after the keys. | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO`, `SINTERCARD`, `SUNIONCARD`, `SDIFFCARD` |\n| `ERR Number of keys can't be negative` | The numkeys argument of `EVAL`, `EVALSHA`, `FCALL`, or `FCALL_RO` is negative. Pass `0` if the script or function uses no keys, or otherwise the number of key names that follow. | `EVAL`, `EVALSHA`, `FCALL`, `FCALL_RO` |\n| `ERR numids must be a positive integer` | In `XNACK`, the number after `IDS` is 0, negative, or not an integer. Pass the number of IDs that follow it, which must be at least 1. | `XNACK` |\n| `ERR numkeys should be greater than 0` | The number of keys you passed is 0, negative, or not an integer. Pass the number of keys that follow it, which must be at least 1. | `BLMPOP`, `LMPOP`, `SINTERCARD`, `SUNIONCARD`, `SDIFFCARD`, `BZMPOP`, `ZMPOP` |\n| `ERR NX and XX, GT or LT options at the same time are not compatible` | You combined `NX` with `XX`, `GT`, or `LT` in an expire command. `NX` sets an expiry only when the key has none, so it can't be combined with options that need an existing expiry; `XX` with `GT` or `LT` is allowed. | `EXPIRE`, `EXPIREAT`, `PEXPIRE`, `PEXPIREAT` |\n| `ERR offset is out of range` | You passed `SETRANGE` a negative offset. Pass a byte position of 0 or more; positions past the end pad the string with zero bytes. | `SETRANGE` |\n| `ERR One or more scores can't be converted into double` | `SORT` sorts numerically by default, and at least one element, or a value it read through `BY`, isn't a number. Add `ALPHA` to sort the values as strings, or make sure every value is a number. | `SORT`, `SORT_RO` |\n| `ERR Only HELLO messages are accepted by Sentinel instances.` | You ran `PUBLISH` against a Sentinel on a channel other than `__sentinel__:hello`, the only channel that Sentinels use to announce themselves to each other. Publish your own messages to a Redis server, not to Sentinel. | `PUBLISH` |\n| `ERR Only one of EX, PX, EXAT, PXAT or KEEPTTL arguments can be specified` | You ran `HSETEX` with more than one expiration option. Pass only one of `EX`, `PX`, `EXAT`, `PXAT` or `KEEPTTL`. | `HGETEX`, `HSETEX` |\n| `ERR Only one of EX, PX, EXAT, PXAT or PERSIST arguments can be specified` | You ran `HGETEX` with more than one expiration option. Pass only one of `EX`, `PX`, `EXAT`, `PXAT` or `PERSIST`, or none to leave the fields' expiration as it is. | `HGETEX`, `HSETEX` |\n| `ERR Only one of FXX or FNX arguments can be specified` | You ran `HSETEX` with both `FXX` and `FNX`, or with one of them twice. Use `FXX` to set the fields only if they all exist, or `FNX` to set them only if none of them exist. | `HGETEX`, `HSETEX` |\n| `ERR Only SENTINEL CONFIG GET <param> [<param> <param> ...] / SET <param> <value> [<param> <value> ...] are supported.` | You ran `SENTINEL CONFIG` with a subcommand other than `GET` or `SET`, or with too few arguments, such as `SET` with one option and no value. Use `SENTINEL CONFIG GET` with parameter names, or `SENTINEL CONFIG SET` with name and value pairs. | `SENTINEL CONFIG` |\n| `ERR OPTIN and OPTOUT are not compatible with BCAST` | You combined `BCAST` with `OPTIN` or `OPTOUT` in `CLIENT TRACKING`. Broadcasting mode sends invalidations for every key that matches your prefixes, so opting reads in or out doesn't apply; choose either `BCAST` or one of the opt modes. | `CLIENT TRACKING` |\n| `ERR overlapping import exists for slot range: <start_slot>-<end_slot>` | Another import task already covers the slot range in the message. Check it with `CLUSTER MIGRATION STATUS ALL`, then wait for it or cancel it with `CLUSTER MIGRATION CANCEL` before you import the range again. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS` |\n| `` ERR Parameter `numFields` should be greater than 0 `` | The number after `FIELDS` is 0, negative, or not an integer. Pass the number of field names that follow it, from 1 to 2147483647. | `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR Please specify at least one argument for this redis lib call script: <script>, on <source>:<line>.` | Your script called `redis.call()`, `redis.pcall()` or `redis.acl_check_cmd()` with no arguments. Pass the command name first, followed by its arguments, for example `redis.call('GET', KEYS[1])`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Please use EVAL instead of EVALSHA for debugging` | This connection is in script debugging mode after `SCRIPT DEBUG YES` or `SCRIPT DEBUG SYNC`, and the debugger only works with `EVAL`, which sends the script's source. Run the script with `EVAL`, or turn debugging off with `SCRIPT DEBUG NO`. | `EVALSHA` |\n| `ERR Please use SETSLOT only with masters.` | `CLUSTER SETSLOT` changes slot ownership and must be sent to a primary, and this node is a replica. Send it to the primary instead. | `CLUSTER SETSLOT` |\n| `ERR Pre-GA function format not supported` | The `FUNCTION RESTORE` payload uses the format of a Redis 7.0 release candidate from before general availability (GA), which current versions can't read. Load the libraries from their source code with `FUNCTION LOAD` instead. | `FUNCTION RESTORE` |\n| `ERR Prefix '<prefix>' overlaps with an existing prefix '<existing_prefix>'. Prefixes for a single client must not overlap.` | In `BCAST` mode, a prefix you passed overlaps a prefix that this connection already tracks, because one starts with the other, such as `user:` and `user:1`. Keep only the shorter one, or turn tracking off and on again with the new prefixes. | `CLIENT TRACKING` |\n| `ERR Prefix '<prefix>' overlaps with another provided prefix '<other_prefix>'. Prefixes for a single client must not overlap.` | Two prefixes in the same `CLIENT TRACKING` call overlap, because one starts with the other, such as `user:` and `user:1`. Keep only the shorter one, which already covers the longer. | `CLIENT TRACKING` |\n| `ERR PREFIX option requires BCAST mode to be enabled` | You passed `PREFIX` to `CLIENT TRACKING ON` without `BCAST`. Prefixes only work in broadcasting mode, so add `BCAST`, or drop `PREFIX` to track the keys that this connection reads. | `CLIENT TRACKING` |\n| `ERR producer ID must be non-empty` | `XIDMPRECORD`, an internal command, got an empty producer ID, the argument after the key. Pass a non-empty string. | `XIDMPRECORD` |\n| `ERR Protocol error: expected '$', got '<character>'` | Inside a command sent with the Redis serialization protocol (RESP), an argument didn't start with `$`, and the character in the message came instead. Redis closes the connection; this usually means a bug in the client library, or something other than a Redis client writing to the port. | Any command |\n| `ERR Protocol error: invalid bulk length` | An argument's length in the Redis serialization protocol (RESP) isn't a valid number, is negative, or is larger than `proto-max-bulk-len`, which is 512 megabytes by default. Redis closes the connection; send smaller values, or raise `proto-max-bulk-len`. | Any command |\n| `ERR Protocol error: invalid multibulk length` | The argument count at the start of a command sent with the Redis serialization protocol (RESP) isn't a valid number, or is larger than 2147483647. Redis closes the connection; this usually points to a bug in the client library or a corrupted stream. | Any command |\n| `ERR Protocol error: too big bulk count string` | Redis read more than 64 kilobytes while looking for the end of an argument's length line, so the request isn't valid Redis serialization protocol (RESP). Redis closes the connection; check that the client sends well-formed commands. | Any command |\n| `ERR Protocol error: too big inline request` | Redis received more than 64 kilobytes of plain text without a newline, so it rejected it as an oversized inline command and closed the connection. Send large values with a Redis client, which uses the Redis serialization protocol (RESP), not as plain text. | Any command |\n| `ERR Protocol error: too big mbulk count string` | Redis read more than 64 kilobytes while looking for the end of the line that gives a command's argument count, so the request isn't valid Redis serialization protocol (RESP). Redis closes the connection; check that the client sends well-formed commands. | Any command |\n| `ERR Protocol error: unauthenticated bulk length` | This connection hasn't authenticated yet, and it sent an argument longer than 16384 bytes, which Redis refuses before authentication. Redis closes the connection; authenticate with `AUTH` or `HELLO` first, then send large values. | Any command |\n| `ERR Protocol error: unauthenticated multibulk length` | This connection hasn't authenticated yet, and it sent a command with more than 10 arguments, which Redis refuses before authentication. Redis closes the connection; authenticate with `AUTH` or `HELLO` first. | Any command |\n| `ERR Protocol error: unbalanced quotes in request` | An inline command, sent as plain text such as from `telnet`, has a quote that isn't closed. Redis closes the connection; close the quote, or send the command with a Redis client instead. | Any command |\n| `ERR Protocol version is not an integer or out of range` | The protocol version you passed to `HELLO` isn't an integer. Pass `2` or `3`, as in `HELLO 3`. | `HELLO` |\n| `ERR PSUBSCRIBE isn't allowed for a DENY BLOCKING client` | `PSUBSCRIBE` came from a connection that must get exactly one reply per command, such as a module calling Redis, so it can't enter Pub/Sub mode. Send `PSUBSCRIBE` from a normal client connection instead. | `PSUBSCRIBE` |\n| `ERR Publish message is too large for cluster propagation` | In a cluster, Redis forwards each published message to the other nodes, and the forwarded message, including the channel name, must stay under 4 gigabytes. Publish smaller messages, for example by storing the payload in a key and publishing the key name. | `PUBLISH`, `SPUBLISH` |\n| `ERR Quorum must be 1 or greater.` | You ran `SENTINEL MONITOR` with a quorum of 0 or less. Pass the number of Sentinels that must agree that the primary is down, which must be at least 1 and is usually a majority of your Sentinels. | `SENTINEL MONITOR` |\n| `ERR radius cannot be negative` | The radius in `GEORADIUS`, `GEORADIUSBYMEMBER`, or after `BYRADIUS` is negative. Pass a radius of 0 or more, followed by the unit. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR range exceeds maximum of 1000000 items` | You asked `ARGETRANGE` for more than 1,000,000 positions, and it returns every position in the range, empty ones included. Request smaller ranges, or use `ARSCAN`, which returns only the positions that hold values. | `ARGETRANGE` |\n| `ERR RANK can't be zero: use 1 to start from the first match, 2 from the second ... or use negative to start from the end of the list` | You passed `LPOS` a `RANK` of 0. Use 1 for the first match, 2 for the second and so on, or a negative rank to count matches from the end of the list. | `LPOS` |\n| `ERR reached lua stack limit` | Your script returned a value nested so deeply, such as tables inside tables thousands of levels down, that Lua ran out of stack space while Redis turned it into a reply. Return a flatter structure. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Reconfiguration of scripts path is denied for security reasons. Check the deny-scripts-reconfig configuration directive in your Sentinel configuration` | You ran `SENTINEL SET` with `notification-script` or `client-reconfig-script`, but this Sentinel doesn't let you change script paths at runtime, which is the default. Set the script in the Sentinel configuration file, or set `sentinel deny-scripts-reconfig no` there and restart Sentinel. | `SENTINEL SET` |\n| `ERR redis.log() requires two arguments or more. script: <script>, on <source>:<line>.` | Your script called `redis.log()` with fewer than two arguments. Pass the log level first and then the message, for example `redis.log(redis.LOG_NOTICE, 'done')`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR redis.register_function can only be called on FUNCTION LOAD command script: <script>, on <source>:<line>.` | Your function called `redis.register_function` while it ran with `FCALL`, for example through a reference saved while the library loaded. Only the library's top-level code can register functions, during `FUNCTION LOAD`, so remove the call from the function body. | `FCALL`, `FCALL_RO` |\n| `ERR redis.set_repl() requires one argument. script: <script>, on <source>:<line>.` | Your script called `redis.set_repl()` with no argument or with more than one. Pass exactly one flag, such as `redis.REPL_ALL` or `redis.REPL_NONE`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR redis.setresp() requires one argument. script: <script>, on <source>:<line>.` | Your script called `redis.setresp()` with no argument or with more than one. Pass exactly one value, 2 or 3. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR regular expression backreferences are not supported` | An `RE` pattern that you passed to `ARGREP` uses a backreference, such as `\\1`, which `ARGREP` doesn't support. Rewrite the pattern without backreferences. | `ARGREP` |\n| `ERR regular expression is empty` | You passed `ARGREP` an `RE` predicate with an empty pattern. Pass a regular expression of at least one character. | `ARGREP` |\n| `ERR regular expression is too long, maximum is 2048 bytes` | An `RE` pattern that you passed to `ARGREP` is longer than 2,048 bytes. Use a shorter pattern, or split it into several `RE` predicates, which `ARGREP` combines with `OR` by default. | `ARGREP` |\n| `ERR rename-command arguments must not contain control characters` | You ran `SENTINEL SET` with `rename-command`, and the old or the new command name contains a control character, such as a newline or a tab. Pass the names exactly as `rename-command` sets them on the Redis server. | `SENTINEL SET` |\n| `ERR Replica can't interact with the keyspace` | A connection that registered as a replica with `SYNC` or `PSYNC` then sent a command that reads or writes keys. Replication connections can't access data; open a normal connection for those commands. | Commands that use keys |\n| `ERR REPLICAOF not allowed in cluster mode.` | `REPLICAOF` and `SLAVEOF` don't work on a cluster node, because the cluster manages replication itself. Use `CLUSTER REPLICATE` with the node ID of the primary instead. | `REPLICAOF`, `SLAVEOF` |\n| `ERR REPLICAOF not allowed while failing over.` | A failover started with `FAILOVER` is running, and `REPLICAOF` is blocked until it ends. Wait for it to finish, or cancel it with `FAILOVER ABORT`. | `REPLICAOF`, `SLAVEOF` |\n| `ERR RESP version must be 2 or 3. script: <script>, on <source>:<line>.` | Your script called `redis.setresp()` with a value other than 2 or 3. Pass 2 or 3 to choose the version of the Redis serialization protocol (RESP) that `redis.call()` uses for replies inside the script. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR resulting score is not a number (NaN)` | The increment would make the member's score not a number (NaN), which happens when you add `-inf` to a score of `+inf`, or the reverse. Use a finite increment, or set the score again with `ZADD`. | `ZADD`, `ZINCRBY` |\n| `ERR Rewriting config file: <reason>` | `CONFIG REWRITE` couldn't write the configuration file, for the operating system reason at the end of the message, such as no write permission. Check that the Redis process can write to the file and to its directory. | `CONFIG REWRITE` |\n| `ERR SAMPLE ratio must be positive` | The `SAMPLE` ratio in `HOTKEYS START` isn't a positive integer. Pass 1 to track every key, or a larger number N to track each key with a probability of 1 in N. | `HOTKEYS START` |\n| `ERR Script attempted to access a non local key in a cluster node script: <script>, on <source>:<line>.` | Your script called a command on a key whose hash slot another cluster node serves, usually because the script builds key names instead of taking them from `KEYS`. Pass every key name in `KEYS`, so your client sends the script to the right node. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Script attempted to access a slot being trimmed script: <script>, on <source>:<line>.` | Your script tried to write to a key in a hash slot whose keys this node is deleting in the background, for example after `SFLUSH`. Retry after the deletion finishes. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Script attempted to access a slot not served script: <script>, on <source>:<line>.` | Your script accessed a key in a hash slot that no cluster node serves, so the cluster can't handle that key. Check `CLUSTER INFO` and assign the slot to a node, then retry. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Script attempted to access keys that do not hash to the same slot script: <script>, on <source>:<line>.` | Your script accessed keys in different hash slots, and at least one of them wasn't declared in `KEYS`. Declare every key in `KEYS`, and use hash tags, such as `{user1}:name` and `{user1}:email`, to put the keys in one slot. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Script attempted to execute a command while the cluster is down script: <script>, on <source>:<line>.` | Your script ran a command while the cluster is down, for example because some hash slots have no working node. Fix the cluster, which `CLUSTER INFO` reports as `cluster_state:fail`, then retry. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/clusterdown/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Script attempted to execute a write command while the cluster is down and readonly script: <script>, on <source>:<line>.` | Your script tried to write while the cluster is down. Because `cluster-allow-reads-when-down` is on, reads still work but writes don't; fix the cluster, which `CLUSTER INFO` reports as `cluster_state:fail`, then retry. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/clusterdown/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR SCRIPT DEBUG must be called outside a pipeline` | You sent `SCRIPT DEBUG` in a pipeline, while replies to earlier commands on the connection were still waiting to be sent. Send it on its own and wait for the reply before you continue; `redis-cli --ldb` does this for you. | `SCRIPT DEBUG` |\n| `ERR SCRIPT FLUSH only support SYNC\\|ASYNC option` | You passed `SCRIPT FLUSH` an argument other than `SYNC` or `ASYNC`, or more than one argument. Run `SCRIPT FLUSH SYNC` or `SCRIPT FLUSH ASYNC`, or no option at all to let the `lazyfree-lazy-user-flush` setting choose. | `SCRIPT FLUSH` |\n| `ERR Script killed by user with SCRIPT KILL... script: <script>, on <source>:<line>.` | Your script ran for too long, and another client stopped it with `SCRIPT KILL` or `FUNCTION KILL`. It hadn't changed any data yet, so nothing was left half done. Find out why it runs so long, for example an endless loop, and fix the script. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/busy/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR SELECT is not allowed in cluster mode` | In cluster mode there's only database 0, so `SELECT` accepts only 0. Remove the `SELECT` call, or set the database to 0 in your client's connection settings. | `SELECT` |\n| `ERR SHUTDOWN without NOW or ABORT isn't allowed for DENY BLOCKING client` | A module called `SHUTDOWN` from inside its own code, where the call can't wait for replicas to catch up. The module must pass `NOW`, which skips the wait, or `ABORT`. | `SHUTDOWN` |\n| `ERR size must be positive` | You ran `ARRING` with a ring size of 0 or less. Pass the number of slots that the ring buffer keeps, which must be 1 or more. | `ARRING` |\n| `ERR Slot <slot> is already busy` | `CLUSTER ADDSLOTS` or `CLUSTER ADDSLOTSRANGE` tried to assign the slot in the message, but a node already serves it. Leave out slots that are already assigned, or move them with `CLUSTER SETSLOT` or `CLUSTER MIGRATION IMPORT`. | `CLUSTER SYNCSLOTS` |\n| `ERR Slot <slot> is already unassigned` | `CLUSTER DELSLOTS` or `CLUSTER DELSLOTSRANGE` tried to unassign the slot in the message, but no node serves it. Leave that slot out of the command. | `CLUSTER SYNCSLOTS` |\n| `ERR Slot <slot> is currently in an active atomic slot migration. CLUSTER SETSLOT cannot be used at this time. To perform a legacy slot migration instead, first cancel the ongoing task with CLUSTER MIGRATION CANCEL` | An atomic slot migration is moving the slot in the message, so `CLUSTER SETSLOT` can't change it now. Wait for the migration to finish, or cancel it with `CLUSTER MIGRATION CANCEL` if you want to move the slot the legacy way. | `CLUSTER SETSLOT` |\n| `ERR slot <slot> not handled by this node` | The slot in the message isn't served by the node you sent `HOTKEYS START` to. Send the command to the primary that serves that slot, as `CLUSTER SHARDS` shows, or list only this node's slots. | `HOTKEYS START` |\n| `ERR Slot <slot> specified multiple times` | The same hash slot, shown in the message, appears more than once in your slots or slot ranges, for example in two overlapping ranges. List each slot only once. | `CLUSTER SYNCSLOTS`, `CLUSTER MIGRATION`, `SFLUSH`, `TRIMSLOTS` |\n| `ERR slot has no owner: <slot>` | The slot in the message isn't assigned to any node, so there's no node to import it from. Assign the slot with `CLUSTER ADDSLOTS` instead of migrating it. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS` |\n| `ERR slot migration not allowed on replica.` | You ran `CLUSTER MIGRATION IMPORT` on a replica, and only a primary can import slots. Run it on the primary that should receive the slots. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS` |\n| `ERR slot range is out of range: <start_slot>-<end_slot>` | A slot range goes past slot 16383, the last hash slot. Commands check each slot number before this point, so you usually see this only from cluster tooling that starts a slot migration. Use slots from 0 to 16383. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS`, `SFLUSH`, `TRIMSLOTS` |\n| `ERR slots belong to different source nodes` | An import can take slots from only one source node, and the slots you listed are served by different nodes. Split the command into one `CLUSTER MIGRATION IMPORT` per source node, and run them one after another. | `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS` |\n| `ERR SLOTS count must be between 1 and 16384` | The count after `SLOTS` in `HOTKEYS START` isn't an integer from 1 to 16384. Pass the number of slot numbers that follow it. | `HOTKEYS START` |\n| `ERR SLOTS parameter already specified` | You passed `SLOTS` more than once to `HOTKEYS START`. List all the slots after a single `SLOTS` and its count. | `HOTKEYS START` |\n| `ERR SLOTS parameter cannot be used in non-cluster mode` | You passed `SLOTS` to `HOTKEYS START` on a server that isn't part of a cluster, where hash slots don't apply. Remove `SLOTS` to track keys from the whole server. | `HOTKEYS START` |\n| `ERR source and destination objects are the same` | You called `MOVE` with the database you're already using as the target, or `COPY` with the same key name as source and destination in the same database. Choose another database for `MOVE`, or another destination key or `DB` for `COPY`. | `MOVE`, `COPY` |\n| `ERR SSUBSCRIBE isn't allowed for a DENY BLOCKING client` | You sent `SSUBSCRIBE` inside a `MULTI` transaction, or from a module call, where each command must get exactly one reply. Send `SSUBSCRIBE` on its own from a normal client connection, outside any transaction. | `SSUBSCRIBE` |\n| `ERR start slot number <start_slot> is greater than end slot number <end_slot>` | In a slot range, the first slot must not be higher than the last one, and the message shows a range where it is. Swap the two numbers, for example `1000 2000` instead of `2000 1000`. | `CLUSTER DELSLOTSRANGE`, `CLUSTER MIGRATION`, `CLUSTER SYNCSLOTS`, `SFLUSH`, `TRIMSLOTS` |\n| `ERR Start slot number <start_slot> is greater than end slot number <end_slot>` | In `CLUSTER SLOT-STATS SLOTSRANGE`, the start slot is higher than the end slot. Swap the two numbers so that the range goes from low to high. | `CLUSTER SLOT-STATS` |\n| `ERR STORE option in GEORADIUS is not compatible with WITHDIST, WITHHASH and WITHCOORD options` | You combined `STORE` or `STOREDIST` with `WITHDIST`, `WITHHASH`, or `WITHCOORD` in `GEORADIUS` or `GEORADIUSBYMEMBER`. Stored results can't include those details, so remove them, or drop `STORE` to get the details back. | `GEORADIUS`, `GEORADIUSBYMEMBER` |\n| `ERR string exceeds maximum allowed size (proto-max-bulk-len)` | The string that `APPEND` or `SETRANGE` would create is longer than `proto-max-bulk-len`, 512 MB by default. Keep values smaller or split them across keys, or raise `proto-max-bulk-len` if you need larger strings. | `APPEND`, `SETRANGE` |\n| `ERR String too long for LCS` | One of the strings you passed to `LCS` is about 4 GB or longer, more than `LCS` can handle. Compare shorter strings. | `LCS` |\n| `ERR SUBSCRIBE isn't allowed for a DENY BLOCKING client` | `SUBSCRIBE` came from a connection that must get exactly one reply per command, such as a module calling Redis, so it can't enter Pub/Sub mode. Send `SUBSCRIBE` from a normal client connection instead. | `SUBSCRIBE` |\n| `ERR SWAPDB is not allowed in cluster mode` | In cluster mode there's only database 0, so `SWAPDB` has nothing to swap. Remove the call. | `SWAPDB` |\n| `ERR syntax error` | Redis couldn't make sense of the command's options. An option is misspelled, in the wrong place, missing its value, or combined with one it can't be used with, such as `NX` with `XX`. Compare each option with the command's syntax. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `AUTH`, `BITOP`, `BITCOUNT`, `BITPOS`, `BITFIELD`, `BITFIELD_RO`, `RESTORE`, `MIGRATE`, `CLUSTER SYNCSLOTS`, `CLUSTER FAILOVER`, `CLUSTER RESET`, `CLUSTER SLOT-STATS`, `CONFIG SET`, `FLUSHALL`, `FLUSHDB`, `HSCAN`, `SCAN`, `SSCAN`, `ZSCAN`, `SHUTDOWN`, `COPY`, `GEOADD`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE`, `GEODIST`, `HOTKEYS START`, `CLIENT LIST`, `CLIENT REPLY`, `CLIENT NO-EVICT`, `CLIENT KILL`, `CLIENT TRACKING`, `CLIENT CACHING`, `CLIENT NO-TOUCH`, `MEMORY USAGE`, `BGSAVE`, `FAILOVER`, `COMMAND LIST`, `SORT`, `SORT_RO`, `ARSCAN`, `ARGREP`, `ARLASTITEMS`, `ARINFO`, `HRANDFIELD`, `LINSERT`, `LPOS`, `BLMOVE`, `BLMOVEM`, `BLMPOP`, `LMOVE`, `LMOVEM`, `LMPOP`, `SPOP`, `SRANDMEMBER`, `SINTERCARD`, `SUNIONCARD`, `SDIFFCARD`, `XADD`, `XTRIM`, `XACKDEL`, `XDELEX`, `XRANGE`, `XREVRANGE`, `XREAD`, `XREADGROUP`, `XSETID`, `XPENDING`, `XAUTOCLAIM`, `XCFGSET`, `GETEX`, `MSETEX`, `SET`, `INCREX`, `LCS`, `ZADD`, `ZINCRBY`, `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZUNION`, `ZUNIONSTORE`, `ZRANGE`, `ZRANGEBYLEX`, `ZRANGEBYSCORE`, `ZRANGESTORE`, `ZREVRANGE`, `ZREVRANGEBYLEX`, `ZREVRANGEBYSCORE`, `ZRANK`, `ZREVRANK`, `ZPOPMAX`, `ZPOPMIN`, `ZRANDMEMBER`, `BZMPOP`, `ZMPOP` |\n| `ERR Syntax error in HELLO option '<option>'` | `HELLO` got an option it doesn't understand, shown in the message, or an option without all its values. The options are `SETNAME` with a name, and `AUTH` with both a user name and a password; use `default` as the user name for a plain password. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `HELLO` |\n| `ERR syntax error, expected IDS keyword` | You ran `XNACK` without the `IDS` block. Add `IDS`, the number of IDs, and the entry IDs after the mode. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XNACK` |\n| `ERR syntax error, IDMP requires a non-empty idempotent ID` | You passed `XADD` the `IDMP` option with an empty idempotent ID, the second value after `IDMP`. Pass a non-empty string that identifies this message, so that Redis can recognize a repeated `XADD`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, IDMP requires a non-empty producer ID` | You passed `XADD` the `IDMP` option with an empty producer ID, the first value after `IDMP`. Pass a non-empty string that identifies the producer. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, IDMP/IDMPAUTO can be used only with auto-generated IDs` | You used `IDMP` or `IDMPAUTO` in `XADD` with an entry ID that you chose. Pass `*` as the ID so that Redis generates it; idempotent adds work only with generated IDs. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, IDMP/IDMPAUTO specified multiple times` | You passed `IDMP` or `IDMPAUTO` more than once in one `XADD`, or passed both. Use only one of them, once. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, IDMPAUTO requires a non-empty producer ID` | You passed `XADD` the `IDMPAUTO` option with an empty producer ID. Pass a non-empty string that identifies the producer; Redis computes the idempotent ID from the fields and values. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, LIMIT cannot be used without specifying a trimming strategy` | You passed `LIMIT` without `MAXLEN` or `MINID`, so there's no trim for it to limit. Add a trimming option, for example `MAXLEN ~ 1000 LIMIT 100`, or remove `LIMIT`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, LIMIT cannot be used without the special ~ option` | You passed `LIMIT` with an exact trim. `LIMIT` only works with approximate trimming, so put `~` after `MAXLEN` or `MINID`, or remove `LIMIT`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, LIMIT is only supported in combination with either BYSCORE or BYLEX` | You passed `LIMIT` to a range by index. `LIMIT` only works with `BYSCORE` or `BYLEX`; for an index range, choose the start and stop indexes instead. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `ZRANGE`, `ZRANGEBYLEX`, `ZRANGEBYSCORE`, `ZRANGESTORE`, `ZREVRANGE`, `ZREVRANGEBYLEX`, `ZREVRANGEBYSCORE` |\n| `ERR syntax error, MAXLEN and MINID options at the same time are not compatible` | You passed both `MAXLEN` and `MINID`, or one of them twice. Choose one trimming strategy: `MAXLEN` keeps a number of entries, and `MINID` removes entries with IDs lower than the one you pass. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XADD`, `XTRIM` |\n| `ERR syntax error, WITHSCORES not supported in combination with BYLEX` | You asked for `WITHSCORES` in a lexicographic range. `BYLEX` ranges expect all members to have the same score, so leave out `WITHSCORES`, or read scores with `ZSCORE` or `ZMSCORE`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `ZRANGE`, `ZRANGEBYLEX`, `ZRANGEBYSCORE`, `ZRANGESTORE`, `ZREVRANGE`, `ZREVRANGEBYLEX`, `ZREVRANGEBYSCORE` |\n| `ERR syntax error, XTRIM must be called with a trimming strategy` | You ran `XTRIM` without `MAXLEN` or `MINID`. Add one of them with its threshold, for example `XTRIM key MAXLEN 1000`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-syntax-error/#how-to-fix-it) | `XTRIM` |\n| `ERR Target instance replied with error: <error>` | `MIGRATE` reached the target server, but the target replied with the error after the colon. A common one is `BUSYKEY`, when the key already exists there and you didn't pass `REPLACE`. Others are wrong `AUTH` details or a database number that doesn't exist. | `MIGRATE` |\n| `ERR Target node is not a master` | `CLUSTER SETSLOT` names a node that's a replica, and only primaries can serve slots or move them. Pass the ID of a primary, as shown by `CLUSTER NODES`. | `CLUSTER SETSLOT` |\n| `ERR The $ ID is meaningless in the context of XREADGROUP: you want to read the history of this consumer by specifying a proper ID, or use the > ID to get new messages. The $ ID would just return an empty result set.` | You passed `$` as an ID to `XREADGROUP`, but `$` only works with `XREAD`. Use `>` to get messages that the group hasn't delivered yet, or an ID such as `0` to reread this consumer's pending messages. | `XREADGROUP` |\n| `ERR The 'default' user cannot be removed` | `ACL DELUSER` can't delete the `default` user, and none of the users in the command were deleted. Remove `default` from the list. To stop clients from using it, give it a password or disable it with `ACL SETUSER`. | `ACL DELUSER` |\n| `ERR The + ID is meaningless in the context of XREADGROUP: you want to read the history of this consumer by specifying a proper ID, or use the > ID to get new messages. The + ID would just return an empty result set.` | You passed `+` as an ID to `XREADGROUP`, but `+` only works with `XREAD`. Use `>` to get messages that the group hasn't delivered yet, or an ID such as `0` to reread this consumer's pending messages. | `XREADGROUP` |\n| `ERR The > ID can be specified only when calling XREADGROUP using the GROUP <group> <consumer> option.` | You passed `>` as an ID to `XREAD`, but `>` means messages not yet delivered to a consumer group, so it only works with `XREADGROUP`. With `XREAD`, use `$` for new entries only, or an ID to read the entries after it. | `XREAD` |\n| `` ERR The `numfields` parameter must match the number of arguments `` | The number after `FIELDS` doesn't match the number of field names that follow it. Make the count equal to the number of fields you list. | `HGETDEL`, `HEXPIRETIME`, `HPEXPIRETIME`, `HPTTL`, `HTTL`, `HPERSIST` |\n| `` ERR The `numids` parameter must match the number of arguments `` | The number after `IDS` is larger than the number of IDs that follow it. Make the count equal to the number of entry IDs you list. | `XACKDEL`, `XDELEX` |\n| `ERR the ANY argument requires COUNT argument` | You passed `ANY` to a geospatial search without `COUNT`. `ANY` stops the search as soon as it has found enough matches, so it needs `COUNT` to say how many, as in `COUNT 10 ANY`. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR The bit argument must be 1 or 0.` | `BITPOS` looks for the first bit with a given value, so the bit argument must be `0` or `1`. Pass `1` to find the first set bit, or `0` to find the first clear bit. | `BITPOS` |\n| `ERR The CLAIM option is only supported by XREADGROUP. You called XREAD instead.` | You passed `CLAIM` to `XREAD`, but claiming pending entries needs a consumer group, so only `XREADGROUP` supports it. Use `XREADGROUP` with `GROUP`, or remove `CLAIM`. | `XREAD`, `XREADGROUP` |\n| `ERR The client ID you want redirect to does not exist` | No open connection has the client ID you passed after `REDIRECT` in `CLIENT TRACKING`. Get the ID with `CLIENT ID` on the connection that should receive the invalidation messages, and check that it's still open. | `CLIENT TRACKING` |\n| `ERR The command has no key arguments` | You passed `COMMAND GETKEYS` or `COMMAND GETKEYSANDFLAGS` a command that never takes keys, such as `PING`. There are no keys to find, so you don't need to ask for this command. | `COMMAND GETKEYS`, `COMMAND GETKEYSANDFLAGS` |\n| `ERR The entries_added specified in XSETID is smaller than the target stream length` | In `XSETID`, the `ENTRIESADDED` value is smaller than the number of entries now in the stream. Pass a count at least as large as the stream's length, which `XLEN` returns. | `XSETID` |\n| `ERR The GROUP option is only supported by XREADGROUP. You called XREAD instead.` | You passed `GROUP` to `XREAD`. To read as a member of a consumer group, call `XREADGROUP` with the same arguments instead. | `XREAD`, `XREADGROUP` |\n| `ERR The ID specified in XADD is equal or smaller than the target stream top item` | The entry ID you passed to `XADD` isn't greater than the last ID the stream used, even if that entry was deleted, and stream IDs must always increase. Use `*` to let Redis generate the ID, or pass a larger ID. | `XADD` |\n| `ERR The ID specified in XADD must be greater than 0-0` | You passed `0-0` as the entry ID to `XADD`, but the smallest valid ID is `0-1`. Use `*` to let Redis generate the ID, or pass a larger one. | `XADD` |\n| `ERR The ID specified in XSETID is smaller than current max_deleted_entry_id` | `XSETID` would set the stream's last ID lower than the largest ID already deleted from it. Pass an ID at least as large as the `max-deleted-entry-id` that `XINFO STREAM` shows. | `XSETID` |\n| `ERR The ID specified in XSETID is smaller than the provided max_deleted_entry_id` | In `XSETID`, the ID you passed is smaller than the `MAXDELETEDID` you passed with it, but the last ID can't be lower than the largest deleted ID. Raise the ID or lower `MAXDELETEDID`. | `XSETID` |\n| `ERR The ID specified in XSETID is smaller than the target stream top item` | `XSETID` would set the stream's last ID lower than the ID of its newest entry. Pass an ID at least as large as the last entry's ID, which `XINFO STREAM` shows. | `XSETID` |\n| `ERR The LIMIT argument must be >= 0.` | You passed `XADD` or `XTRIM` a negative `LIMIT`. Pass 0 or more; `LIMIT` caps how many entries an approximate trim, with `~`, removes. | `XADD`, `XTRIM` |\n| `ERR The MAXLEN argument must be >= 0.` | You passed `XADD` or `XTRIM` a negative `MAXLEN`. Pass the number of entries to keep, 0 or more. | `XADD`, `XTRIM` |\n| `ERR The NOACK option is only supported by XREADGROUP. You called XREAD instead.` | You passed `NOACK` to `XREAD`, but only consumer groups track acknowledgments, so only `XREADGROUP` supports it. Remove `NOACK`, or read with `XREADGROUP`. | `XREAD`, `XREADGROUP` |\n| `ERR The server is running without a config file` | `CONFIG REWRITE` saves settings to the configuration file that the server started with, and this server started without one. Start Redis with the path of a configuration file to use this command. | `CONFIG REWRITE` |\n| `ERR the slot <slot> is served by this node` | `TRIMSLOTS` deletes the keys of slots that a primary no longer serves, and the slot in the message is still served by this node. Check the slot's owner with `CLUSTER SHARDS`. Nodes normally send this command themselves after a migration. | `TRIMSLOTS` |\n| `ERR The specified keys must contain string values` | One of the keys you passed to `LCS` holds a value that isn't a string, such as a list or a hash. Pass two keys that hold strings; a key that doesn't exist counts as an empty string. | `LCS` |\n| `ERR The specified node is not a master` | `CLUSTER REPLICAS` takes the node ID of a primary, and the node you passed is a replica. Pass the ID of its primary instead, which `CLUSTER NODES` shows. | `CLUSTER REPLICAS` |\n| `ERR The stream has exhausted the last possible ID, unable to add more items` | The stream's last ID is already the largest possible, `18446744073709551615-18446744073709551615`, so `XADD` can't create a newer one. This follows an `XADD` or `XSETID` with a huge ID; delete the stream and recreate it with normal IDs. | `XADD` |\n| `ERR The user can assign a config epoch only when the node does not know any other node.` | `CLUSTER SET-CONFIG-EPOCH` works only before the node has met any other node. While you create the cluster, run it on each node before `CLUSTER MEET`. | `CLUSTER SET-CONFIG-EPOCH` |\n| `ERR The XGROUP subcommand requires the key to exist. Note that for CREATE you may want to use the MKSTREAM option to create an empty stream automatically.` | The stream key you passed to `XGROUP` doesn't exist. Create the stream first, or add the `MKSTREAM` option to `XGROUP CREATE` so that it creates an empty stream. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/nogroup/#how-to-fix-it) | `XGROUP CREATE`, `XGROUP CREATECONSUMER`, `XGROUP DELCONSUMER`, `XGROUP DESTROY`, `XGROUP HELP`, `XGROUP SETID` |\n| `ERR There is a pending trim job for slot <slot>. Most probably, this is due to a failed atomic slot migration. CLUSTER SETSLOT cannot be used at this time. Please retry later once the trim job is completed.` | This node is still deleting keys of the slot in the message, usually left over from a failed atomic slot migration, so `CLUSTER SETSLOT` can't change the slot now. Wait for the deletion to finish, then retry. | `CLUSTER SETSLOT` |\n| `ERR There was an error trying to save the ACLs. Please check the server logs for more information` | `ACL SAVE` couldn't write the access control list (ACL) file set by `aclfile`, for example because its directory isn't writable or the disk is full. The server log has the exact reason. The users in memory are unchanged. | `ACL SAVE` |\n| `ERR This instance has cluster support disabled` | You ran a cluster command, such as `CLUSTER INFO`, `READONLY`, or `ASKING`, on a server that isn't running in cluster mode. Connect to a cluster node instead, or start this server with `cluster-enabled yes` if you're building a cluster. | Cluster commands |\n| `ERR this node is already the owner of the slot range` | You asked this node to import slots that it already serves. Run `CLUSTER MIGRATION IMPORT` on the node that should receive the slots. | `CLUSTER MIGRATION` |\n| `ERR This node is not the owner of the slots` | The importing node asked this node for slots that this node doesn't serve. This usually means the nodes don't agree yet on who owns the slots. Wait for the cluster configuration to settle, check the owner with `CLUSTER SHARDS`, and import again. | `CLUSTER SYNCSLOTS` |\n| `ERR This Redis command is not allowed from script script: <script>, on <source>:<line>.` | Your script or function called a command that can't run inside scripts, such as `SUBSCRIBE`, `MULTI`, `WATCH`, `EVAL`, or `FUNCTION LOAD`. Run that command from your client instead. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR This Redis instance is not configured to use an ACL file. You may want to specify users via the ACL SETUSER command and then issue a CONFIG REWRITE (assuming you have a Redis configuration file set) in order to store users in the Redis configuration.` | `ACL LOAD` and `ACL SAVE` work only when the server was started with the `aclfile` setting, and this one wasn't. Set `aclfile` in the configuration file and restart, or keep users in the configuration file with `CONFIG REWRITE`. | `ACL SAVE` |\n| `ERR timeout is negative` | The timeout you passed is negative. Pass 0 or more; for blocking commands, 0 means wait with no time limit. | `BLMOVE`, `BLMOVEM`, `BLMPOP`, `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BZMPOP`, `BZPOPMAX`, `BZPOPMIN`, `CLIENT PAUSE`, `LMPOP`, `WAIT`, `WAITAOF`, `XREAD`, `XREADGROUP`, `ZMPOP` |\n| `ERR timeout is not a float or out of range` | The timeout you passed to a blocking list or sorted set command isn't a number. Pass it in seconds, as a decimal such as `0.5` if you need to, or 0 to wait with no time limit. | `BLMOVE`, `BLMOVEM`, `BLMPOP`, `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BZMPOP`, `BZPOPMAX`, `BZPOPMIN`, `CLIENT PAUSE`, `LMPOP`, `WAIT`, `WAITAOF`, `XREAD`, `XREADGROUP`, `ZMPOP` |\n| `ERR timeout is not an integer or out of range` | The timeout you passed isn't a whole number. `XREAD` and `XREADGROUP` with `BLOCK`, `WAIT`, `WAITAOF` and `CLIENT PAUSE` take the timeout in milliseconds, as an integer such as `1500`. | `BLMOVE`, `BLMOVEM`, `BLMPOP`, `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BZMPOP`, `BZPOPMAX`, `BZPOPMIN`, `CLIENT PAUSE`, `LMPOP`, `WAIT`, `WAITAOF`, `XREAD`, `XREADGROUP`, `ZMPOP` |\n| `ERR timeout is out of range` | The timeout is so large that adding it to the current time would overflow. `BLPOP` and the other blocking list and sorted set commands take seconds, while `XREAD`, `WAIT`, `WAITAOF`, and `CLIENT PAUSE` take milliseconds; pass a smaller value, or `0` to make a blocking command wait forever. | `BLMOVE`, `BLMOVEM`, `BLMPOP`, `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BZMPOP`, `BZPOPMAX`, `BZPOPMIN`, `CLIENT PAUSE`, `LMPOP`, `WAIT`, `WAITAOF`, `XREAD`, `XREADGROUP`, `ZMPOP` |\n| `ERR To set a master the node must be empty and without assigned slots.` | A primary can become a replica only when it has no hash slots and no keys. Move its slots to other nodes and delete its keys, for example with `FLUSHALL`, then run `CLUSTER REPLICATE` again. | `CLUSTER REPLICATE` |\n| `ERR too many predicates, maximum is 250` | You passed `ARGREP` more than 250 predicates (`EXACT`, `MATCH`, `GLOB` or `RE`). Combine conditions into fewer predicates, for example one regular expression, or split the search into several calls. | `ARGREP` |\n| `ERR Trim is disabled by module` | A module on this node has paused the deletion of migrated keys, so the node won't start a new slot migration. For example, Redis Search does this for a short time after a migration while indexes exist. Wait, then start the import again. | `CLUSTER SYNCSLOTS` |\n| `ERR Trim job in progress for the slots` | This node is still deleting the keys of some of the requested slots, so it can't send those slots yet. Wait for the deletion to finish, then start the import again. | `CLUSTER SYNCSLOTS` |\n| `ERR UBOUND is not a valid float` | With `BYFLOAT`, `INCREX` reads `UBOUND` as a decimal number, and the value you passed isn't one. Pass a number such as `100` or `99.5`. | `INCREX` |\n| `ERR UBOUND is not an integer or out of range` | Without `BYFLOAT`, `INCREX` reads `UBOUND` as a 64-bit integer, and the value you passed isn't one. Pass a whole number, or add `BYFLOAT` to use decimal bounds. | `INCREX` |\n| `ERR Unbalanced 'xread' list of streams: for each stream key an ID, '+', or '$' must be specified.` | After `STREAMS`, `XREAD` needs all the keys and then one ID for each key, so the number of arguments after `STREAMS` must be even. Add the missing IDs, using `$` to read only new entries, or remove the stray argument. | `XREAD` |\n| `ERR Unbalanced 'xreadgroup' list of streams: for each stream key an ID or '>' must be specified.` | After `STREAMS`, `XREADGROUP` needs all the keys and then one ID for each key, so the number of arguments after `STREAMS` must be even. Add the missing IDs, using `>` for new messages, or remove the stray argument. | `XREADGROUP` |\n| `ERR Unexpected engine in script shebang: <engine>` | The first line of your script names an engine other than Lua, shown in the message. `EVAL` and `SCRIPT LOAD` accept only `#!lua`, in lowercase and with no space after `#!`. | `EVAL`, `EVAL_RO`, `SCRIPT LOAD` |\n| `ERR Unexpected flag in script shebang: <flag>` | A flag in the `flags=` list of your script's shebang line isn't one Redis knows, as the message shows. Valid flags are `no-writes`, `allow-oom`, `allow-stale`, `no-cluster`, and `allow-cross-slot-keys`, in lowercase and separated by commas without spaces. | `EVAL`, `EVAL_RO`, `SCRIPT LOAD` |\n| `ERR unknown argument` | `CLUSTER MIGRATION` didn't recognize an argument. The subcommands are `IMPORT`, `STATUS`, and `CANCEL`, and `STATUS` and `CANCEL` take either `ID` followed by a task ID, or `ALL`. | `CLUSTER MIGRATION` |\n| `ERR Unknown argument <argument>` | `FUNCTION LIST` got the argument in the message, but it accepts only `WITHCODE` and `LIBRARYNAME` followed by a pattern, each at most once. Remove the unknown or repeated argument. | `FUNCTION LIST` |\n| `ERR unknown argument: <argument>` | The command got an argument it doesn't recognize, shown in the message. Check the option names, and check that the number after `FIELDS` matches the fields you list, because extra fields are read as options. | `HGETEX`, `HSETEX`, `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR Unknown category '<category>'` | `ACL CAT` doesn't know the category in the message. Run `ACL CAT` with no argument to list the valid categories, and pass the name without the `@` sign. | `ACL CAT` |\n| `ERR Unknown client type '<type>'` | The client type you passed to `CLIENT LIST TYPE` or `CLIENT KILL TYPE` isn't one Redis knows. Use `normal`, `master`, `replica` (or `slave`), or `pubsub`. | `CLIENT LIST`, `CLIENT KILL` |\n| `ERR unknown command '<command>'` | This server doesn't know the command named in the message. Check the spelling, that your Redis version has the command, that the module that adds it is loaded, and that it isn't renamed or disabled with `rename-command`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-unknown-command/#how-to-fix-it) | Any command |\n| `ERR unknown command '<command>', with args beginning with: <args>` | This server doesn't know the command named in the message; the message also shows the first arguments to help you find the call. Check the spelling, that your Redis version has the command, and that the module that adds it is loaded. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-unknown-command/#how-to-fix-it) | Any command |\n| `ERR Unknown Error for creating instances.` | Sentinel failed to add the primary in `SENTINEL MONITOR` for a reason it doesn't recognize. The known causes have their own messages, so this is unexpected; check the Sentinel log and the arguments, and try again. | `SENTINEL MONITOR` |\n| `ERR Unknown georadius search type` | A geospatial search command reached Redis with an internal search type that Redis doesn't recognize. No arguments that you pass can cause this, so report it as a bug. | `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR Unknown lua shebang option: <option>` | The shebang line of your script has an option other than `flags=`, the only option scripts accept. A space inside the flags list causes this too, as does `name=`, which only function libraries use; write flags as `flags=no-writes,allow-oom`. | `EVAL`, `EVAL_RO`, `SCRIPT LOAD` |\n| `ERR Unknown node <node_id>` | This node doesn't know a node with the ID in the message. Check the ID with `CLUSTER NODES` on this node. IDs are 40 characters long, and a node that joined recently may not be known yet. | `CLUSTER REPLICAS`, `CLUSTER SETSLOT`, `CLUSTER FORGET`, `CLUSTER REPLICATE`, `CLUSTER COUNT-FAILURE-REPORTS` |\n| `ERR unknown operation` | You ran `AROP` with an operation it doesn't support. Use one of `SUM`, `MIN`, `MAX`, `AND`, `OR`, `XOR`, `MATCH` or `USED`. | `AROP` |\n| `ERR Unknown option <option>` | A `CLUSTER SYNCSLOTS CONF` message carried an option this node doesn't know. Nodes send this message to each other during an atomic slot migration, so this usually means they run different Redis versions. Upgrade all nodes to the same version. | `CLUSTER SYNCSLOTS` |\n| `ERR Unknown option given: <option>` | `FUNCTION LOAD` got an option it doesn't know before the library code; `REPLACE` is its only option. This also happens when the code is split across several arguments, so pass the whole library as one quoted argument. | `FUNCTION LOAD` |\n| `ERR Unknown option or number of arguments for CONFIG SET - '<parameter>'` | `CONFIG SET` doesn't know the parameter in the message. Check the spelling with `CONFIG GET`, and for a module setting, check that the module is loaded. | `CONFIG SET` |\n| `ERR Unknown option or number of arguments for SENTINEL SET '<option>'` | You ran `SENTINEL SET` with an option it doesn't know, or without the value it needs, such as a last option with no value or `rename-command` with one name. Check the option and its value. Options before it in the same command were already applied. | `SENTINEL SET` |\n| `ERR Unknown Redis command called from script script: <script>, on <source>:<line>.` | Your script or function called `redis.call` or `redis.pcall` with a command name that doesn't exist, often a typo or a command from a module that isn't loaded. Pass a subcommand as a separate argument, as in `redis.call('CONFIG', 'GET', 'maxmemory')`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR unknown subcommand '<subcommand>'. Try <command> HELP.` | The command named in the message doesn't have the subcommand you passed. Run the command followed by `HELP`, for example `CLIENT HELP`, to list its subcommands, and check that your Redis version has the one you want. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-unknown-command/#how-to-fix-it) | Commands with subcommands |\n| `ERR unknown subcommand or wrong number of arguments` | `HOTKEYS` got a subcommand it doesn't know, or the wrong number of arguments for one. The subcommands are `START`, `STOP`, `GET`, `RESET`, and `HELP`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-unknown-command/#how-to-fix-it) | `HOTKEYS GET`, `HOTKEYS HELP`, `HOTKEYS RESET`, `HOTKEYS START`, `HOTKEYS STOP` |\n| `ERR unknown subcommand or wrong number of arguments for '<subcommand>'. Try <command> HELP.` | You called a command that has subcommands, such as `CONFIG` or `XINFO`, with a subcommand it doesn't have, or with the wrong number of arguments for that subcommand. Run the `HELP` subcommand named in the message to list the valid forms. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-unknown-command/#how-to-fix-it) | Commands with subcommands |\n| `ERR unknown type object` | `COPY` found a key whose data type it doesn't know how to duplicate. Every built-in and module type is handled, so this points to an internal problem; report it as a bug, with the key's `TYPE` and `OBJECT ENCODING`. | `COPY` |\n| `ERR Unmatched parenthesis in acl selector starting at '<argument>'.` | A selector in your `ACL SETUSER` rules starts with `(` but is never closed with `)`. The message shows the argument where the selector starts. Close the selector, for example `(~app:* +get)`. | `ACL SETUSER` |\n| `ERR Unrecognized option '<option>'` | `CLIENT SETINFO` only accepts the `lib-name` and `lib-ver` options, and got the option in the message. Use one of those two, which client libraries set to report their name and version. | `CLIENT SETINFO` |\n| `ERR Unrecognized sort metric for ORDERBY.` | `CLUSTER SLOT-STATS ORDERBY` got a metric it doesn't know, or one that isn't turned on. `key-count` always works, but `cpu-usec`, `network-bytes-in`, `network-bytes-out`, and `memory-bytes` need the matching `cluster-slot-stats-enabled` setting. | `CLUSTER SLOT-STATS` |\n| `ERR Unrecognized XCLAIM option '<option>'` | `XCLAIM` didn't recognize the argument shown in the message. It also reads invalid entry IDs as options, so check both the IDs and the option names: `IDLE`, `TIME`, `RETRYCOUNT`, `FORCE`, `JUSTID` and `LASTID`. | `XCLAIM` |\n| `ERR Unrecognized XNACK option '<option>'` | `XNACK` didn't recognize the argument shown in the message. Use only `IDS`, `RETRYCOUNT` and `FORCE`, and check that the number after `IDS` matches the IDs you list, because extra IDs are read as options. | `XNACK` |\n| `ERR Unsupported option <option>` | An expire command got an argument after the time that isn't `NX`, `XX`, `GT`, or `LT`, shown in the message. Remove it, and check that you didn't add the time unit as a separate word, as in `EXPIRE key 10 seconds`. | `EXPIRE`, `EXPIREAT`, `PEXPIRE`, `PEXPIREAT` |\n| `ERR unsupported unit provided. please use M, KM, FT, MI` | The unit isn't one of `m` (meters), `km` (kilometers), `ft` (feet), or `mi` (miles), in any case. Pass one of these as a separate argument after the distance. | `GEODIST`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE` |\n| `ERR Use SCRIPT DEBUG YES/SYNC/NO` | You passed `SCRIPT DEBUG` a mode other than `YES`, `SYNC`, or `NO`. `YES` debugs in a forked copy of the server, `SYNC` debugs in the server itself and blocks it meanwhile, and `NO` turns debugging off. | `SCRIPT DEBUG` |\n| `ERR User '<username>' not found` | `ACL DRYRUN` doesn't know the user in the message. Check the name with `ACL USERS`. Usernames are case-sensitive. | `ACL DRYRUN` |\n| `ERR user_script:<line>: Script attempted to access nonexistent global variable '<name>' script: <script>, on <source>:<line>.` | Your script or function read a global variable that doesn't exist, named in the message, often because of a typo, a missing `local`, or a library that Redis doesn't load, such as `io`. Declare your variables with `local`, and pass data in as keys and arguments. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Usernames can't contain spaces or null characters` | The username you passed to `ACL SETUSER` contains a space, another whitespace character, or a null character, which usernames can't have. Choose a name without them. | `ACL SETUSER` |\n| `ERR value cannot be Infinity` | The key's current value is infinity, for example stored as `inf`, so `INCREX` with `BYFLOAT` can't add to it. Set the key to a finite number first. | `INCREX` |\n| `ERR value count does not match fieldset field count` | `HIMPORT SET` got a different number of values than the fieldset has fields. Pass one value for each field, in the order you listed the fields in `HIMPORT PREPARE`. | `HIMPORT SET` |\n| `ERR value for ENTRIESREAD must be positive or -1` | You passed `XGROUP CREATE` or `XGROUP SETID` an `ENTRIESREAD` lower than -1. Pass the number of entries the group has read, 0 or more, or -1 if you don't know it. | `XGROUP CREATE`, `XGROUP CREATECONSUMER`, `XGROUP DELCONSUMER`, `XGROUP DESTROY`, `XGROUP HELP`, `XGROUP SETID` |\n| `ERR value is NaN or Infinity` | You passed `HINCRBYFLOAT` an increment of infinity, such as `inf`. Pass a finite number. | `HINCRBYFLOAT` |\n| `ERR value is not a valid float` | An argument that must be a number, such as a score, coordinate, or increment, isn't one; for `INCRBYFLOAT`, the value already in the key can be the problem. Write the number with digits, a dot, and an optional exponent, such as `3.5` or `1e3`, without units or commas. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-not-an-integer/#how-to-fix-it) | `GEOADD`, `GEORADIUS`, `GEORADIUSBYMEMBER`, `GEORADIUSBYMEMBER_RO`, `GEORADIUS_RO`, `GEOSEARCH`, `GEOSEARCHSTORE`, `ZADD`, `ZDIFF`, `ZDIFFSTORE`, `ZINCRBY`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZUNION`, `ZUNIONSTORE`, `BLMOVE`, `BLMOVEM`, `BLMPOP`, `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BZMPOP`, `BZPOPMAX`, `BZPOPMIN`, `CLIENT PAUSE`, `HINCRBYFLOAT`, `INCRBYFLOAT`, `INCREX`, `LMPOP`, `WAIT`, `WAITAOF`, `XREAD`, `XREADGROUP`, `ZMPOP` |\n| `ERR value is not an integer or out of range` | An argument that must be a whole number isn't one, or it's outside the signed 64-bit range; for commands such as `INCR`, the value already in the key can be the problem. Write the number with digits only, without decimals or units, such as `10` or `-3`. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-not-an-integer/#how-to-fix-it) | Commands with number arguments |\n| `ERR value is out of range` | You called `HRANDFIELD` with `WITHVALUES`, or `ZRANDMEMBER` with `WITHSCORES`, and a count whose absolute value is larger than 4611686018427387903. Pass a smaller count. | Commands with number arguments |\n| `ERR value is out of range, must be positive` | An argument that must be a count of 0 or more is negative or isn't an integer, such as the count of `LPOP`, `RPOP`, `SPOP`, `ZPOPMIN`, or `ZPOPMAX`, or the numreplicas argument of `WAITAOF`. Despite the message, `0` is accepted. | `LPOP`, `LPOS`, `RPOP`, `SDIFFCARD`, `SINTERCARD`, `SPOP`, `SUNIONCARD`, `WAITAOF`, `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZPOPMAX`, `ZPOPMIN`, `ZUNION`, `ZUNIONSTORE` |\n| `ERR value is out of range, value must between <min> and <max>` | An integer argument is outside the range it accepts, and the message gives the smallest and largest allowed values. For example, the numlocal argument of `WAITAOF` must be `0` or `1`, and a database number for `SELECT`, `MOVE`, or `COPY` must fit in 32 bits. | Commands with number arguments |\n| `ERR WAIT cannot be used with replica instances. Please also note that since Redis 4.0 if a replica is configured to be writable (which is not the default) writes to replicas are just local and are not propagated.` | You sent `WAIT` to a replica, but it only works on a primary, where it waits for replicas to acknowledge your writes. Send your writes and `WAIT` to the primary. | `WAIT` |\n| `ERR WAITAOF cannot be used when numlocal is set but appendonly is disabled.` | You asked `WAITAOF` to wait for the local append-only file (AOF), with numlocal set to 1, but `appendonly` is off. Turn on `appendonly`, or pass 0 as numlocal to wait only for replicas. | `WAITAOF` |\n| `ERR WAITAOF cannot be used with replica instances. Please also note that writes to replicas are just local and are not propagated.` | You sent `WAITAOF` to a replica, but it only works on a primary. Send your writes and `WAITAOF` to the primary instead. | `WAITAOF` |\n| `ERR WARNING: Duplicate user '<username>' found on line <line>.` | The access control list (ACL) file defines the same user twice, the second time on the line in the message. Despite the WARNING label, this is an error, and `ACL LOAD` changed nothing. Remove or merge the duplicate line. | `ACL LOAD` |\n| `ERR WATCH inside MULTI is not allowed` | You sent `WATCH` after `MULTI`, but keys must be watched before the transaction starts. The transaction stays open; to watch keys, end it with `DISCARD`, then send `WATCH` before `MULTI`. | `WATCH` |\n| `ERR weight value is not a float` | A value after `WEIGHTS` isn't a number. Pass one number for each input key, in the same order as the keys. | `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, `ZINTERSTORE`, `ZUNION`, `ZUNIONSTORE` |\n| `ERR When using MIGRATE KEYS option, the key argument must be set to the empty string` | With the `KEYS` option, `MIGRATE` takes its keys from the end of the command, so the single key argument must be empty. Pass `\"\"` in place of the key, then list the keys after `KEYS`. | `MIGRATE` |\n| `ERR Write commands are not allowed from read-only scripts. script: <script>, on <source>:<line>.` | Your script called a command that writes, but it runs read-only, because you called it with `EVAL_RO`, `EVALSHA_RO`, or `FCALL_RO`, or because it has the `no-writes` flag. Remove the write, or remove the flag and call it with `EVAL`, `EVALSHA`, or `FCALL`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Wrong number of args calling Redis command from script script: <script>, on <source>:<line>.` | Your script or function called a command through `redis.call` or `redis.pcall` with the wrong number of arguments for that command. Compare the call with the command's syntax, and pass each argument as a separate Lua value. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Wrong number of args for redis.acl_check_cmd() script: <script>, on <source>:<line>.` | Your script called `redis.acl_check_cmd()` with a number of arguments that the named command doesn't accept. Pass the command with the full list of arguments you want to check, as you would pass them to `redis.call()`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR wrong number of arguments` | The number after `FIELDS` is larger than the number of fields, or field and value pairs for `HSETEX`, that follow it. Make the count match what you list. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments/#how-to-fix-it) | `HGETEX`, `HSETEX`, `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE`, `HPEXPIREAT` |\n| `ERR wrong number of arguments for '<command>' command` | The command named in the message got more or fewer arguments than it accepts. Compare your call with the command's syntax, and check for an empty list of keys or fields, or a value with spaces that wasn't quoted. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments/#how-to-fix-it) | Any command |\n| `ERR wrong number of arguments for 'hotkeys\\|get' command` | You passed arguments to `HOTKEYS GET`, which takes none. Run `HOTKEYS GET` on its own to get the results of the current or last tracking session. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments/#how-to-fix-it) | `HOTKEYS GET` |\n| `ERR wrong number of arguments for 'hotkeys\\|reset' command` | You passed arguments to `HOTKEYS RESET`, which takes none. Run `HOTKEYS RESET` on its own, after `HOTKEYS STOP`, to free the tracking results. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments/#how-to-fix-it) | `HOTKEYS RESET` |\n| `ERR wrong number of arguments for 'hotkeys\\|stop' command` | You passed arguments to `HOTKEYS STOP`, which takes none. Run `HOTKEYS STOP` on its own to end the tracking session. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments/#how-to-fix-it) | `HOTKEYS STOP` |\n| `ERR wrong number of arguments script: <script>, on <source>:<line>.` | Your script called `redis.sha1hex()` with no argument or with more than one. Pass exactly one string, the value to hash. [How to fix it](https://redis.io/docs/latest/develop/reference/errors/common/err-wrong-number-of-arguments/#how-to-fix-it) | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR wrong number of key-value pairs` | The number of keys you passed to `MSETEX` is larger than the number of key and value pairs that follow it. Make the count match the pairs, and check for a missing value. | `MSETEX` |\n| `ERR wrong number or type of arguments` | Your script called `redis.error_reply()` or `redis.status_reply()` with no argument, more than one, or a value that isn't a string, such as a number. Pass exactly one string, for example `redis.error_reply('ERR invalid input')`. | `EVAL`, `EVALSHA`, `EVAL_RO`, `EVALSHA_RO`, `FCALL`, `FCALL_RO` |\n| `ERR Wrong restore policy given, value should be either FLUSH, APPEND or REPLACE.` | You passed `FUNCTION RESTORE` a policy other than `FLUSH`, `APPEND`, or `REPLACE`. `APPEND`, the default, fails on name conflicts, `REPLACE` overwrites libraries with the same name, and `FLUSH` deletes all libraries first. | `FUNCTION RESTORE` |\n| `ERR XX and NX options at the same time are not compatible` | You passed both `XX` and `NX` to `ZADD`. Use `NX` to only add new members, or `XX` to only update existing ones. | `ZADD`, `ZINCRBY` |\n| `ERR You can't specify both OPTIN mode and OPTOUT mode` | You passed both `OPTIN` and `OPTOUT` to `CLIENT TRACKING`. Choose one: `OPTIN` tracks only the reads after `CLIENT CACHING YES`, and `OPTOUT` tracks all reads except those after `CLIENT CACHING NO`. | `CLIENT TRACKING` |\n| `ERR You can't switch BCAST mode on/off before disabling tracking for this client, and then re-enabling it with a different mode.` | Tracking is already on for this connection, and you tried to turn `BCAST` on or off with another `CLIENT TRACKING ON`. Run `CLIENT TRACKING OFF` first, then turn tracking on again with the new mode. | `CLIENT TRACKING` |\n| `ERR You can't switch OPTIN/OPTOUT mode before disabling tracking for this client, and then re-enabling it with a different mode.` | Tracking is already on in `OPTIN` or `OPTOUT` mode, and you tried to switch to the other mode. Run `CLIENT TRACKING OFF` first, then turn tracking on again with the new mode. | `CLIENT TRACKING` |\n| `ERR You should send CLUSTER FAILOVER to a replica` | `CLUSTER FAILOVER` promotes the replica that receives it, and this node is already a primary. Send the command to one of its replicas instead. | `CLUSTER FAILOVER` |"
    }
  ],
  "examples": []
}
