diff options
author | Ollie Rutherfurd <orutherfurd@gmail.com> | 2012-04-19 14:50:10 -0400 |
---|---|---|
committer | Ollie Rutherfurd <orutherfurd@gmail.com> | 2012-04-19 14:50:10 -0400 |
commit | 3e854bb705eda7236d4aa85adb657ae88d9046e5 (patch) | |
tree | 4a8d1ff61669344c289db2ac2a295612ff2b8ea7 | |
parent | 74abf2cd21acc5e6c83f65fc6386200ea1a131ca (diff) | |
download | dogpile-cache-3e854bb705eda7236d4aa85adb657ae88d9046e5.tar.gz |
add a Redis backend
-rw-r--r-- | docs/build/api.rst | 3 | ||||
-rw-r--r-- | dogpile/cache/backends/__init__.py | 1 | ||||
-rw-r--r-- | dogpile/cache/backends/redis.py | 67 | ||||
-rw-r--r-- | tests/cache/test_redis_backend.py | 27 |
4 files changed, 98 insertions, 0 deletions
diff --git a/docs/build/api.rst b/docs/build/api.rst index 9392fcb..32b8311 100644 --- a/docs/build/api.rst +++ b/docs/build/api.rst @@ -28,6 +28,9 @@ Backends .. automodule:: dogpile.cache.backends.memcached :members: +.. automodule:: dogpile.cache.backends.redis + :members: + .. automodule:: dogpile.cache.backends.file :members: diff --git a/dogpile/cache/backends/__init__.py b/dogpile/cache/backends/__init__.py index 92afb11..a0c111b 100644 --- a/dogpile/cache/backends/__init__.py +++ b/dogpile/cache/backends/__init__.py @@ -5,3 +5,4 @@ register_backend("dogpile.cache.pylibmc", "dogpile.cache.backends.memcached", "P register_backend("dogpile.cache.bmemcached", "dogpile.cache.backends.memcached", "BMemcachedBackend") register_backend("dogpile.cache.memcached", "dogpile.cache.backends.memcached", "MemcachedBackend") register_backend("dogpile.cache.memory", "dogpile.cache.backends.memory", "MemoryBackend") +register_backend("dogpile.cache.redis", "dogpile.cache.backends.redis", "RedisBackend") diff --git a/dogpile/cache/backends/redis.py b/dogpile/cache/backends/redis.py new file mode 100644 index 0000000..191231a --- /dev/null +++ b/dogpile/cache/backends/redis.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import +from dogpile.cache.api import CacheBackend, NO_VALUE +from dogpile.cache.util import pickle + + +class RedisBackend(CacheBackend): + """A `Redis <http://redis.io/>`_ backend. + + Example configuration:: + + from dogpile.cache import make_region + + region = make_region().configure( + 'dogpile.cache.redis', + arguments = { + 'host': 'localhost', + 'port': 6379, + 'db': 0, + 'redis_expiration_time': 60*60*2, # 2 hours + } + ) + + Arguments accepted in the arguments dictionary: + + :param host: string, default is ``localhost``. + + :param port: integer, default is ``6379``. + + :param db: integer, default is ``0``. + + :param redis_expiration_time: integer, number of seconds after setting + a value that Redis should expire it. This should be larger than dogpile's + cache expiration. By default no expiration is set. + """ + + def __init__(self, arguments): + self._imports() + self.host = arguments.pop('host', 'localhost') + self.port = arguments.pop('port', 6379) + self.db = arguments.pop('db', 0) + self.redis_expiration_time = arguments.pop('redis_expiration_time', 0) + self.client = self._create_client() + + def _imports(self): + # defer imports until backend is used + global redis + import redis + + def _create_client(self): + # creates client instace (so test harness can test connection) + return redis.StrictRedis(host=self.host, port=self.port, db=self.db) + + def get(self, key): + value = self.client.get(key) + if value is None: + return NO_VALUE + return pickle.loads(value) + + def set(self, key, value): + if self.redis_expiration_time: + self.client.setex(key, self.redis_expiration_time, + pickle.dumps(value)) + else: + self.client.set(key, pickle.dumps(value)) + + def delete(self, key): + self.client.delete(key) diff --git a/tests/cache/test_redis_backend.py b/tests/cache/test_redis_backend.py new file mode 100644 index 0000000..55e57bd --- /dev/null +++ b/tests/cache/test_redis_backend.py @@ -0,0 +1,27 @@ +from ._fixtures import _GenericBackendTest +from nose import SkipTest + +class _TestRedisConn(object): + @classmethod + def _check_backend_available(cls, backend): + try: + client = backend._create_client() + client.set("x", "y") + assert client.get("x") == "y" + client.delete("x") + except: + raise SkipTest( + "redis is not running or " + "otherwise not functioning correctly") + + +class RedisTest(_TestRedisConn, _GenericBackendTest): + backend = 'dogpile.cache.redis' + config_args = { + "arguments":{ + 'host': '127.0.0.1', + 'port': 6379, + 'db': 0, + } + } + |