TL;DR: Nothing is listening where redis-py is connecting. Start the Redis server, or fix the host/port (and Docker networking) so the client reaches it.

```text
redis.exceptions.ConnectionError: Error 111 connecting to [host]:6379. Connection refused.
```

## Fix it

1. Check the server: redis-cli -h [host] -p 6379 ping. Expected: PONG. Connection refused here confirms the server side.
2. Start Redis: sudo systemctl start redis-server, or docker run -p 6379:6379 redis. Expected: redis-cli then returns PONG.
3. In Docker Compose, connect to the service name (redis, not the loopback address) and make sure the app container shares the network. Expected: ping works from inside the app container.
4. Verify from Python: python -c "import redis; print(redis.Redis(host='[host]').ping())". Expected: True.

## When this applies
- ConnectionError with Error 111 connection refused.

## When it doesn't
- WRONGPASS or NOAUTH: the server is up; credentials are the problem.
- Timeout (not refused): firewall or wrong host dropping packets.

## Compatibility
- redis-py 3.x/4.x/5.x; Redis server 6+.

## Why it happens
Errno 111 means the OS refused the TCP connection: no process bound to that port. redis-py reports the host:port it tried, so read it carefully before assuming defaults.

## Edge cases
- Redis bound to the loopback address in redis.conf refuses non-local connections; set bind and protected-mode appropriately.
- Port 6380 vs 6379 mixups are common when running multiple instances.
