class PymemcacheCacheBackend(NoCacheBackend): def __init__(self, config): cache_settings = config['cache_backend_settings'] host = cache_settings.get('host') port = cache_settings.get('port') if not host or not port: raise ValueError( ('Must provide `config.cache_backend_settings.[host|port]`' ' with `PymemcacheCacheBackend!')) self.host = host self.port = port self._make_client() def _make_client(self): self.client = PooledClient( (self.host, self.port), serde=serde.pickle_serde, ) def get(self, key): try: return self.client.get(key) except Exception as e: print(f'FAILED CACHE GET: {e.__class__.__name__}({e.args})') def set(self, key, value): try: return self.client.set(key, value) except Exception as e: print(f'FAILED CACHE SET: {e.__class__.__name__}({e.args})') def delete(self, key): try: return self.client.delete(key) except Exception as e: print(f'FAILED CACHE DELETE: {e.__class__.__name__}({e.args})')
class MemcachedCache(Cache): def serialize(self, key, value): print key, type(value) if type(value) == str: # only str, not unicode or extend classes #print 1, len(value) return value, 1 if isinstance(value, np.ndarray): # any ndarray #return zlib.compress(value.dumps()), 2 #print 2, key, len(value.dumps()) return value.dumps(), 2 # other types #print 3, len(json.dumps(value)) try: print json.dumps(value) except Exception as e: #print 4, e raise return json.dumps(value), 3 def deserialize(self, key, value, flags): if flags == 1: # str return value if flags == 2: # ndarray #return np.loads(zlib.decompress(value)) return np.loads(value) if flags == 3: # other return json.loads(value) raise TypeError("Unknown flags for value: %d" % flags) def __init__(self, server=('localhost', 11211), key_prefix='', del_on_server=False, raise_on_key=False, raise_on_none=True): self._client = PooledClient(server, key_prefix=key_prefix, serializer=self.serialize, deserializer=self.deserialize) self._keys = set() self._del_on_server = del_on_server self._raise_on_key = raise_on_key self._raise_on_none = raise_on_none def __getitem__(self, key): if self._raise_on_key and key not in self._keys: raise KeyError value = self._client.get(key) if self._raise_on_none and value is None: raise KeyError return value def __setitem__(self, key, value): self._client.set(key, value) self._keys.add(key) def __delitem__(self, key): if self._del_on_server: self._client.delete(key) self._keys.discard(key) def __len__(self): return len(self._keys) def __iter__(self): return self._keys.__iter__() def keys(self): return list(self._keys) def clear(self): for key in self._keys: del self[key] def __del__(self): self.clear() self._client.close()