The Fix
pip install redis==7.1.0
Based on closed redis/redis-py issue #2437 · PR/commit linked
Production note: Most teams hit this during upgrades or environment changes. Roll out with a canary and smoke critical endpoints (health, OpenAPI/docs) before 100%.
@@ -316,6 +316,25 @@ async def _split_command_across_slots(self, command: str, *keys: KeyT) -> int:
return sum(await self._execute_pipeline_by_slot(command, slots_to_keys))
+ async def _execute_pipeline_by_slot(
+ self, command: str, slots_to_args: Mapping[int, Iterable[EncodableT]]
+ ) -> List[Any]:
cluster = RedisCluster(
host=config.REDIS_HOST,
port=config.REDIS_PORT,
decode_responses=True,
read_from_replicas=read_from_replicas,
skip_full_coverage_check=True,
)
await cluster.delete("foo") # -> KeyError
cluster = RedisCluster(
host=config.REDIS_HOST,
port=config.REDIS_PORT,
decode_responses=True,
read_from_replicas=read_from_replicas,
skip_full_coverage_check=True,
)
await cluster.ping()
await cluster.delete('foo') # -> Success
Option A — Upgrade to fixed release\npip install redis==7.1.0\nWhen NOT to use: This fix should not be applied if the application relies on uninitialized cluster states.\n\n
Why This Fix Works in Production
- Trigger: KeyError in asyncio cluster get_node_from_slot
- Mechanism: The KeyError occurs due to missing initialization before executing multi-key commands in the async cluster
- Why the fix works: Fixes a KeyError in the async cluster by ensuring initialization occurs before executing multi-key commands. (first fixed release: 7.1.0).
- If left unfixed, the same config can fail only in production (env differences), causing startup failures or partial feature outages.
Why This Breaks in Prod
- Shows up under Python 3.8.10 in real deployments (not just unit tests).
- The KeyError occurs due to missing initialization before executing multi-key commands in the async cluster
- Surfaces as: KeyError in asyncio cluster get_node_from_slot
Proof / Evidence
- GitHub issue: #2437
- Fix PR: https://github.com/redis/redis-py/pull/2439
- First fixed release: 7.1.0
- Reproduced locally: No (not executed)
- Last verified: 2026-02-07
- Confidence: 0.95
- Did this fix it?: Yes (upstream fix exists)
- Own content ratio: 0.69
Discussion
High-signal excerpts from the issue thread (symptoms, repros, edge-cases).
“I think I have a reproducible example: However, if I run cluster.ping() first, it works: Similarly, if I run await cluster.initialize(), this also fixes it”
“Seems like there might be an auto-initialization piece missing in some of the asyncio cluster code, or .initialize() needs to be enforced as a required…”
“@sman591 Thanks for reporting this bug! All the details you provided helped us find exactly what is the problem. I opened this PR to fix…”
“Sweet! That PR looks great. I'll keep an eye out for the next release. Thank also for porting all of the asyncio + cluster support…”
Failure Signature (Search String)
- KeyError in asyncio cluster get_node_from_slot
Error Message
Stack trace
Error Message
-------------
KeyError in asyncio cluster get_node_from_slot
Minimal Reproduction
cluster = RedisCluster(
host=config.REDIS_HOST,
port=config.REDIS_PORT,
decode_responses=True,
read_from_replicas=read_from_replicas,
skip_full_coverage_check=True,
)
await cluster.delete("foo") # -> KeyError
Environment
- Python: 3.8.10
What Broke
Users experience intermittent KeyErrors when deleting keys from the cluster, causing operational disruptions.
Why It Broke
The KeyError occurs due to missing initialization before executing multi-key commands in the async cluster
Fix Options (Details)
Option A — Upgrade to fixed release Safe default (recommended)
pip install redis==7.1.0
Use when you can deploy the upstream fix. It is usually lower-risk than long-lived workarounds.
Fix reference: https://github.com/redis/redis-py/pull/2439
First fixed release: 7.1.0
Last verified: 2026-02-07. Validate in your environment.
When NOT to Use This Fix
- This fix should not be applied if the application relies on uninitialized cluster states.
Verify Fix
cluster = RedisCluster(
host=config.REDIS_HOST,
port=config.REDIS_PORT,
decode_responses=True,
read_from_replicas=read_from_replicas,
skip_full_coverage_check=True,
)
await cluster.ping()
await cluster.delete('foo') # -> Success
Did This Fix Work in Your Case?
Quick signal helps us prioritize which fixes to verify and improve.
Prevention
- Capture the exact failing error string in logs and tests so you can reproduce via a minimal script.
- Pin production dependencies and upgrade only with a reproducible test that hits the failing path.
Version Compatibility Table
| Version | Status |
|---|---|
| 7.1.0 | Fixed |
Related Issues
No related fixes found.
Sources
We don’t republish the full GitHub discussion text. Use the links above for context.