Created
August 18, 2016 10:24
-
-
Save roboslone/60e82831106707a01cdbf188357015f0 to your computer and use it in GitHub Desktop.
Redis Cluster cache backend for Django
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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