summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOllie Rutherfurd <orutherfurd@gmail.com>2012-04-19 14:50:10 -0400
committerOllie Rutherfurd <orutherfurd@gmail.com>2012-04-19 14:50:10 -0400
commit3e854bb705eda7236d4aa85adb657ae88d9046e5 (patch)
tree4a8d1ff61669344c289db2ac2a295612ff2b8ea7
parent74abf2cd21acc5e6c83f65fc6386200ea1a131ca (diff)
downloaddogpile-cache-3e854bb705eda7236d4aa85adb657ae88d9046e5.tar.gz
add a Redis backend
-rw-r--r--docs/build/api.rst3
-rw-r--r--dogpile/cache/backends/__init__.py1
-rw-r--r--dogpile/cache/backends/redis.py67
-rw-r--r--tests/cache/test_redis_backend.py27
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,
+ }
+ }
+