Start here. This is the direct spoken answer to practice first.
Overview
Reuses bounded redis-py pools for the application lifetime and closes async resources deliberately.
A redis-py client uses a connection pool, so I normally create one configured client per application or event-loop lifetime and reuse it. Creating a client for every request wastes connections and can exhaust Redis under load. I configure connection and socket timeouts, health behavior, and a bounded maximum that fits both the service and Redis capacity. Pipelines and PubSub objects have their own lifecycle and are not shared as general clients.