redis protocol_error ai_generated true

ERR Protocol error: invalid bulk length

ID: redis/err-protocol-bad-int

Also available as: JSON · Markdown · 中文
80%Fix Rate
88%Confidence
1Evidence
2023-06-20First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Redis 6.2.6 active
Redis 7.0.11 active
ioredis 5.3.2 active
Jedis 4.3.1 active

Root Cause

The Redis server received a malformed RESP (Redis Serialization Protocol) message with an invalid bulk string length, often due to a network corruption or a buggy client implementation.

generic

中文

Redis 服务器收到了格式错误的 RESP 协议消息,其中包含无效的批量字符串长度,通常由网络损坏或客户端实现错误导致。

Official Documentation

https://redis.io/docs/latest/develop/reference/protocol-spec/

Workarounds

  1. 80% success Enable Redis connection pooling with health checks to automatically drop corrupted connections. Example in Node.js using ioredis: `const redis = new Redis({ maxRetriesPerRequest: 3, retryStrategy: (times) => Math.min(times * 50, 2000) });`
    Enable Redis connection pooling with health checks to automatically drop corrupted connections. Example in Node.js using ioredis: `const redis = new Redis({ maxRetriesPerRequest: 3, retryStrategy: (times) => Math.min(times * 50, 2000) });`
  2. 70% success Add a proxy or load balancer that validates RESP protocol before forwarding to Redis, such as using HAProxy with a custom TCP health check.
    Add a proxy or load balancer that validates RESP protocol before forwarding to Redis, such as using HAProxy with a custom TCP health check.
  3. 85% success Upgrade the client library to the latest version that includes better RESP parsing. For Java Jedis: `jedis.close(); jedis = new Jedis(host, port);` after catching the error.
    Upgrade the client library to the latest version that includes better RESP parsing. For Java Jedis: `jedis.close(); jedis = new Jedis(host, port);` after catching the error.

中文步骤

  1. Enable Redis connection pooling with health checks to automatically drop corrupted connections. Example in Node.js using ioredis: `const redis = new Redis({ maxRetriesPerRequest: 3, retryStrategy: (times) => Math.min(times * 50, 2000) });`
  2. Add a proxy or load balancer that validates RESP protocol before forwarding to Redis, such as using HAProxy with a custom TCP health check.
  3. Upgrade the client library to the latest version that includes better RESP parsing. For Java Jedis: `jedis.close(); jedis = new Jedis(host, port);` after catching the error.

Dead Ends

Common approaches that don't work:

  1. 95% fail

    The error is about incoming data, not outgoing buffers.

  2. 80% fail

    TLS may add overhead but is not the cause of malformed bulk lengths.