==========================================================
 Using Celery with Redis/Database as the messaging queue.
==========================================================

There's a plug-in for celery that enables the use of Redis or an SQL database
as the messaging queue. This is not part of celery itself, but exists as
an extension to `carrot`_.

.. _`carrot`: http://pypi.python.org/pypi/carrot
.. _`ghettoq`: http://pypi.python.org/pypi/ghettoq

.. contents::
    :local:

Installation
============

You need to install the `ghettoq`_ library::

    $ pip install -U ghettoq

Redis
=====

For the Redis support you have to install the Python redis client::

    $ pip install -U redis

Configuration
-------------

Configuration is easy, set the carrot backend, and configure the location of
your Redis database::

    CARROT_BACKEND = "ghettoq.taproot.Redis"

    BROKER_HOST = "localhost"  # Maps to redis host.
    BROKER_PORT = 6379         # Maps to redis port.
    BROKER_VHOST = "celery"    # Maps to database name.

Database
========

Configuration
-------------

The database backend uses the Django ``DATABASE_*`` settings for database
configuration values.

#. Set your carrot backend::

    CARROT_BACKEND = "ghettoq.taproot.Database"


#. Add ``ghettoq`` to ``INSTALLED_APPS``::

    INSTALLED_APPS = ("ghettoq", )


#. Verify you database settings::

    DATABASE_ENGINE = "mysql"
    DATABASE_NAME = "mydb"
    DATABASE_USER = "myuser"
    DATABASE_PASSWORD = "secret"

  The above is just an example, if you haven't configured your database before
  you should read the Django database settings reference:
  http://docs.djangoproject.com/en/1.1/ref/settings/#database-engine


#. Sync your database schema.

    When using Django::

        $ python manage.py syncdb

Important notes
---------------

These message queues does not have the concept of exchanges and routing keys,
there's only the queue entity. As a result of this you need to set the
name of the exchange to be the same as the queue::

    CELERY_DEFAULT_EXCHANGE = "tasks"

or in a custom queue-mapping:

.. code-block:: python

    CELERY_QUEUES = {
        "tasks": {"exchange": "tasks"},
        "feeds": {"exchange": "feeds"},
    }

This isn't a problem if you use the default queue setting, as the default is
already using the same name for queue/exchange.
