pyredis.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import warnings
  2. from django.core.exceptions import ImproperlyConfigured
  3. from celery.backends.base import KeyValueStoreBackend
  4. from celery.loaders import load_settings
  5. try:
  6. import redis
  7. except ImportError:
  8. redis = None
  9. class RedisBackend(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 = "localhost"
  19. redis_port = 6379
  20. redis_db = "celery_results"
  21. redis_password = None
  22. redis_timeout = None
  23. redis_connect_retry = None
  24. deprecated_settings = frozenset(["REDIS_TIMEOUT",
  25. "REDIS_CONNECT_RETRY"])
  26. def __init__(self, redis_host=None, redis_port=None, redis_db=None,
  27. redis_timeout=None,
  28. redis_password=None,
  29. redis_connect_retry=None,
  30. redis_connect_timeout=None):
  31. if redis is None:
  32. raise ImproperlyConfigured(
  33. "You need to install the redis library in order to use "
  34. + "Redis result store backend.")
  35. settings = load_settings()
  36. self.redis_host = redis_host or \
  37. getattr(settings, "REDIS_HOST", self.redis_host)
  38. self.redis_port = redis_port or \
  39. getattr(settings, "REDIS_PORT", self.redis_port)
  40. self.redis_db = redis_db or \
  41. getattr(settings, "REDIS_DB", self.redis_db)
  42. self.redis_password = redis_password or \
  43. getattr(settings, "REDIS_PASSWORD",
  44. self.redis_password)
  45. for setting_name in self.deprecated_settings:
  46. if getattr(settings, setting_name, None) is not None:
  47. warnings.warn(
  48. "The setting '%s' is no longer supported by the "
  49. "python Redis client!" % setting_name.upper(),
  50. DeprecationWarning)
  51. if self.redis_port:
  52. self.redis_port = int(self.redis_port)
  53. if not self.redis_host or not self.redis_port:
  54. raise ImproperlyConfigured(
  55. "In order to use the Redis result store backend, you have to "
  56. "set the REDIS_HOST and REDIS_PORT settings")
  57. super(RedisBackend, self).__init__()
  58. self._connection = None
  59. def open(self):
  60. """Get :class:`redis.Redis`` instance with the current
  61. server configuration.
  62. The connection is then cached until you do an
  63. explicit :meth:`close`.
  64. """
  65. # connection overrides bool()
  66. if self._connection is None:
  67. self._connection = redis.Redis(host=self.redis_host,
  68. port=self.redis_port,
  69. db=self.redis_db,
  70. password=self.redis_password)
  71. return self._connection
  72. def close(self):
  73. """Close the connection to redis."""
  74. if self._connection is not None:
  75. self._connection.save()
  76. self._connection.connection.disconnect()
  77. self._connection = None
  78. def process_cleanup(self):
  79. self.close()
  80. def get(self, key):
  81. return self.open().get(key)
  82. def set(self, key, value):
  83. self.open().set(key, value)