pyredis.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from django.core.exceptions import ImproperlyConfigured
  2. from celery.backends.base import KeyValueStoreBackend
  3. from celery.loaders import load_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. settings = load_settings()
  31. self.redis_host = redis_host or \
  32. getattr(settings, "REDIS_HOST", self.redis_host)
  33. self.redis_port = redis_port or \
  34. getattr(settings, "REDIS_PORT", self.redis_port)
  35. self.redis_db = redis_db or \
  36. getattr(settings, "REDIS_DB", self.redis_db)
  37. self.redis_timeout = redis_timeout or \
  38. getattr(settings, "REDIS_TIMEOUT",
  39. self.redis_timeout)
  40. self.redis_connect_retry = redis_connect_retry or \
  41. getattr(settings, "REDIS_CONNECT_RETRY",
  42. self.redis_connect_retry)
  43. if self.redis_port:
  44. self.redis_port = int(self.redis_port)
  45. if not self.redis_host or not self.redis_port:
  46. raise ImproperlyConfigured(
  47. "In order to use the Redis result store backend, you have to "
  48. "set the REDIS_HOST and REDIS_PORT settings")
  49. super(RedisBackend, self).__init__()
  50. self._connection = None
  51. def open(self):
  52. """Get :class:`redis.Redis`` instance with the current
  53. server configuration.
  54. The connection is then cached until you do an
  55. explicit :meth:`close`.
  56. """
  57. # connection overrides bool()
  58. if self._connection is None:
  59. self._connection = redis.Redis(host=self.redis_host,
  60. port=self.redis_port,
  61. db=self.redis_db,
  62. timeout=self.redis_timeout,
  63. retry_connection=self.redis_connect_retry)
  64. self._connection.connect()
  65. return self._connection
  66. def close(self):
  67. """Close the connection to redis."""
  68. if self._connection is not None:
  69. self._connection.disconnect()
  70. self._connection = None
  71. def process_cleanup(self):
  72. self.close()
  73. def get(self, key):
  74. return self.open().get(key)
  75. def set(self, key, value):
  76. self.open().set(key, value)