Skip to content

Instantly share code, notes, and snippets.

@roboslone
Created August 18, 2016 10:24
Show Gist options
  • Save roboslone/60e82831106707a01cdbf188357015f0 to your computer and use it in GitHub Desktop.
Save roboslone/60e82831106707a01cdbf188357015f0 to your computer and use it in GitHub Desktop.
Redis Cluster cache backend for Django
import pickle
from logging import getLogger
from rediscluster import StrictRedisCluster
class RedisClusterCache(StrictRedisCluster):
def __init__(self, _, options=None, **kwargs):
options = options or {}
if 'OPTIONS' in options:
# Django style cache settings.
options = options['OPTIONS']
options.update(**kwargs)
super().__init__(**options)
self.logger = getLogger('ydl.cache')
def set(self, name, value, ex=None, px=None, nx=False, xx=False, **kwargs):
ex = ex or kwargs.get('timeout')
self.logger.debug('-> {}'.format(name))
return super().set(name, pickle.dumps(value), ex=ex, px=px, nx=nx, xx=xx)
def get(self, name, **kwargs):
value = super().get(name)
if value is None:
return None
try:
value = pickle.loads(super().get(name))
self.logger.debug('<- {}'.format(name))
except TypeError:
self.logger.exception('bad cached value type')
except Exception as e:
self.logger.exception('failed to deserialize cached value', exc_info=e)
return value
def delete(self, name, version=None):
return super().delete(name)
def clear(self):
return self.flushall()
@staticmethod
def close(*args, **kwargs):
"""Does nothing, added for compatibility with django.contrib.sessions.backends.cached_db session engine."""
pass
add = set
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment