redis.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """celery.backends.tyrant"""
  2. from django.core.exceptions import ImproperlyConfigured
  3. from celery.backends.base import KeyValueStoreBackend
  4. from celery.loaders import settings
  5. try:
  6. import redis
  7. except ImportError:
  8. redis = None
  9. class Backend(KeyValueStoreBackend):
  10. """Redis based task backend store.
  11. .. attribute:: redis_host
  12. The hostname to the Redis server.
  13. .. attribute:: redis_port
  14. The port to the Redis server.
  15. Raises :class:`django.core.exceptions.ImproperlyConfigured` if
  16. :setting:`REDIS_HOST` or :setting:`REDIS_PORT` is not set.
  17. """
  18. redis_host = None
  19. redis_port = None
  20. redis_db = "celery_results"
  21. redis_timeout = None
  22. redis_connect_retry = None
  23. def __init__(self, redis_host=None, redis_port=None, redis_db=None,
  24. redis_timeout=None, redis_connect_timeout=None):
  25. if not redis:
  26. raise ImproperlyConfigured(
  27. "You need to install the redis library in order to use "
  28. + "Redis result store backend.")
  29. self.redis_host = redis_host or \
  30. getattr(settings, "REDIS_HOST", self.redis_host)
  31. self.redis_port = redis_port or \
  32. getattr(settings, "REDIS_PORT", self.redis_port)
  33. self.redis_db = redis_db or \
  34. getattr(settings, "REDIS_DB", self.redis_db)
  35. self.redis_timeout = redis_timeout or \
  36. getattr(settings, "REDIS_TIMEOUT",
  37. self.redis_timeout)
  38. self.redis_connect_retry = redis_connect_retry or \
  39. getattr(settings, "REDIS_CONNECT_RETRY",
  40. self.redis_connect_retry)
  41. if self.redis_port:
  42. self.redis_port = int(self.redis_port)
  43. if not self.redis_host or not self.redis_port:
  44. raise ImproperlyConfigured(
  45. "In order to use the Redis result store backend, you have to "
  46. "set the REDIS_HOST and REDIS_PORT settings")
  47. super(Backend, self).__init__()
  48. self._connection = None
  49. def open(self):
  50. """Get :class:`redis.Redis`` instance with the current
  51. server configuration.
  52. The connection is then cached until you do an
  53. explicit :meth:`close`.
  54. """
  55. # connection overrides bool()
  56. if self._connection is None:
  57. self._connection = redis.Redis(host=self.redis_host,
  58. port=self.redis_port,
  59. db=self.redis_db,
  60. timeout=self.redis_timeout,
  61. connect_retry=self.redis_connect_retry)
  62. return self._connection
  63. def close(self):
  64. """Close the redis connection and remove the cache."""
  65. # connection overrides bool() # XXX Was the case with tyrant lib!
  66. if self._connection is not None:
  67. self._connection.close()
  68. self._connection = None
  69. def process_cleanup(self):
  70. self.close()
  71. def get(self, key):
  72. return self.open().get(key)
  73. def set(self, key, value):
  74. self.open().set(key, value)