pyredis.py 3.2 KB

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