--- title: "RQ: Connections" layout: docs --- ### The connection parameter Each RQ object (queues, workers, jobs) has a `connection` keyword argument that can be passed to the constructor - this is the recommended way of handling connections. ```python from redis import Redis from rq import Queue redis = Redis('localhost', 6789) q = Queue(connection=redis) ``` This pattern allows for different connections to be passed to different objects: ```python from rq import Queue from redis import Redis conn1 = Redis('localhost', 6379) conn2 = Redis('remote.host.org', 9836) q1 = Queue('foo', connection=conn1) q2 = Queue('bar', connection=conn2) ``` Every job that is enqueued on a queue will know what connection it belongs to. The same goes for the workers. ### Connection contexts (precise and concise)
Note:

The use of Connection context manager is deprecated. Please don't use Connection in your scripts. Instead, use explicit connection management.

There is a better approach if you want to use multiple connections, though. Each RQ object instance, upon creation, will use the topmost Redis connection on the RQ connection stack, which is a mechanism to temporarily replace the default connection to be used. An example will help to understand it: ```python from rq import Queue, Connection from redis import Redis with Connection(Redis('localhost', 6379)): q1 = Queue('foo') with Connection(Redis('remote.host.org', 9836)): q2 = Queue('bar') q3 = Queue('qux') assert q1.connection != q2.connection assert q2.connection != q3.connection assert q1.connection == q3.connection ``` You can think of this as if, within the `Connection` context, every newly created RQ object instance will have the `connection` argument set implicitly. Enqueueing a job with `q2` will enqueue it in the second (remote) Redis backend, even when outside of the connection context. ### Pushing/popping connections If your code does not allow you to use a `with` statement, for example, if you want to use this to set up a unit test, you can use the `push_connection()` and `pop_connection()` methods instead of using the context manager. ```python import unittest from rq import Queue from rq import push_connection, pop_connection class MyTest(unittest.TestCase): def setUp(self): push_connection(Redis()) def tearDown(self): pop_connection() def test_foo(self): """Any queues created here use local Redis.""" q = Queue() ``` ### Sentinel support To use redis sentinel, you must specify a dictionary in the configuration file. Using this setting in conjunction with the systemd or docker containers with the automatic restart option allows workers and RQ to have a fault-tolerant connection to the redis. ```python SENTINEL: { 'INSTANCES':[('remote.host1.org', 26379), ('remote.host2.org', 26379), ('remote.host3.org', 26379)], 'MASTER_NAME': 'master', 'DB': 2, 'USERNAME': 'redis-user', 'PASSWORD': 'redis-secret', 'SOCKET_TIMEOUT': None, 'CONNECTION_KWARGS': { # Eventual addition Redis connection arguments 'ssl_ca_path': None, }, 'SENTINEL_KWARGS': { # Eventual Sentinels connections arguments 'username': 'sentinel-user', 'password': 'sentinel-secret', }, } ``` ### Timeout To avoid potential issues with hanging Redis commands, specifically the blocking `BLPOP` command, RQ automatically sets a `socket_timeout` value that is 10 seconds higher than the `default_worker_ttl`. If you prefer to manually set the `socket_timeout` value, make sure that the value being set is higher than the `default_worker_ttl` (which is 420 by default). ```python from redis import Redis from rq import Queue conn = Redis('localhost', 6379, socket_timeout=500) q = Queue(connection=conn) ``` Setting a `socket_timeout` with a lower value than the `default_worker_ttl` will cause a `TimeoutError` since it will interrupt the worker while it gets new jobs from the queue. ### Encoding / Decoding The encoding and decoding of Redis objects occur in multiple locations within the codebase, which means that the `decode_responses=True` argument of the Redis connection is not currently supported. ```python from redis import Redis from rq import Queue conn = Redis(..., decode_responses=True) # This is not supported q = Queue(connection=conn) ```