def memcached(keys=False, stats=False, clear=False): """List memcached stored keys and server stats""" if 'CACHE_MEMCACHED_SERVERS' in app.config: servers = app.config['CACHE_MEMCACHED_SERVERS'] pp = pprint.PrettyPrinter(indent=4) for server in servers: host, port = server.split(':') mem = MemcachedStats(host, port) print '%s' % '=' * 80 print 'SERVER: %s:%s' % (host, port) if keys: print 'KEYS:' pp.pprint(mem.keys()) if stats: print 'STATS:' pp.pprint(mem.stats()) # clear keys if clear: cache = memcache.Client(servers, debug=0) if cache.flush_all(): print 'Memcached data flushed' else: print 'Could not flush memcached' else: print 'There is no memcached servers in the config files'
def persist_hits(): if is_cached_hitcount_enabled() and using_memcache(): backend, location, params = parse_backend_conf(CACHED_HITCOUNT_CACHE) host, port = location.split(':') hitcount_cache = get_hitcount_cache() lock = hitcount_cache.get(CACHED_HITCOUNT_LOCK_KEY) #print 'persist_hits - check %s lock = %s' % (CACHED_HITCOUNT_LOCK_KEY, lock) if lock is None or lock != 1: try: #acquire a lock so no updates will occur while we are persisting the hits to DB hitcount_cache.set(CACHED_HITCOUNT_LOCK_KEY, 1, CACHED_HITCOUNT_CACHE_TIMEOUT) #print 'acquire %s lock = %s ' % (CACHED_HITCOUNT_LOCK_KEY, hitcount_cache.get(CACHED_HITCOUNT_LOCK_KEY)) mem = MemcachedStats(host, port) keys = mem.keys() content_types = { } #used for keeping track of the content types so DB doesn't have to be queried each time for cache_key in keys: if "hitcount__" in cache_key and not CACHED_HITCOUNT_IP_CACHE in cache_key: cache_key = cache_key.split( ':' )[-1] #the key is a combination of key_prefix, version and key all separated by : - all we need is the key count = hitcount_cache.get(cache_key) if count: #only update the hit count if the is not None hitcount, ctype_pk, object_pk = cache_key.split( '__') if ctype_pk in content_types.keys(): content_type = content_types[ctype_pk] else: content_type = ContentType.objects.get( id=ctype_pk) content_types[ctype_pk] = content_type with transaction_atomic(): #save a new hit or increment this hits on an existing hit hit, created = Hit.objects.select_for_update( ).get_or_create(added=datetime.utcnow().date(), object_pk=object_pk, content_type=content_type) if hit and created: hit.hits = long(count) hit.save() elif hit: hit.hits = hit.hits + long(count) hit.save() #reset the hitcount for this object to 0 - even if it was previously None hitcount_cache.set(cache_key, 0, CACHED_HITCOUNT_CACHE_TIMEOUT) #print 'reset key %s to zero = %s ' % (cache_key, hitcount_cache.get(cache_key)) except Exception, ex: logger.error('Unable to persist hits') logger.error(ex) raise ex finally:
def get_relevant_keys(self): cache_stats = MemcachedStats("127.0.0.1", 8001) all_keys = cache_stats.keys() relevant_keys = [ key.replace(":1:", "") for key in all_keys if key.split("|")[0].replace(":1:", "") == str(self.pk) ] return relevant_keys
def reset_cache_layer(self, layer_key_name): cache = caches[self.cache_name] location = self._get_location() location = location[0] if isinstance(location, list) else location location = location.split(':') mem = MemcachedStats(location[0], location[1]) keys = mem.keys() for key in keys: if key.startswith('{}/{}/{}'.format(self.memcache_key_prefix, '0', layer_key_name)): cache.delete(key)
class AnguisMemcached(AnguisBase): def __init__(self, host='localhost', port=11211, *args, **kwargs): self.client = mc.Client((host, port)) self.client_stats = MemcachedStats(host, port) super(AnguisMemcached, self).__init__() def __del__(self): super(AnguisMemcached, self).__del__() def __getitem__(self, key): return self.unserialize(self.client.get(key)) def __setitem__(self, key, obj): self.client.set(key, self.serialize(obj)) def __delitem__(self, key): self.client.delete(key) def __iter__(self): return iter(self.client_stats.keys()) def __len__(self): return len(self.client_stats.keys())
def get_data(host = '127.0.0.1',port = '11211'): from memcached_stats import MemcachedStats m = MemcachedStats(host, port) import pylibmc import time shared = pylibmc.Client([host], binary=True) shared.behaviors = {"tcp_nodelay": True, "ketama": True} str_data = '<head>\n<meta http-equiv="refresh" content="20">\n</head>\n' str_data = str_data + '<b>Data of internal memchache server:</b></br>\n' str_data = str_data + str(time.strftime("%x %X %Z", time.localtime())) + '</br>\n' dict_data = shared.get_multi( m.keys()) for k,v in sorted(dict_data.items()): str_data = str_data + str(k) + " : " + str(v) + " </br>\n" str_data = str_data + "-"*30 + " </br>\n" return str_data;
def persist_hits(): if is_cached_hitcount_enabled() and using_memcache(): backend, location, params = parse_backend_conf(CACHED_HITCOUNT_CACHE) host, port = location.split(':') hitcount_cache = get_hitcount_cache() lock = hitcount_cache.get(CACHED_HITCOUNT_LOCK_KEY) #print 'persist_hits - check %s lock = %s' % (CACHED_HITCOUNT_LOCK_KEY, lock) if lock is None or lock != 1: try: #acquire a lock so no updates will occur while we are persisting the hits to DB hitcount_cache.set(CACHED_HITCOUNT_LOCK_KEY, 1, CACHED_HITCOUNT_CACHE_TIMEOUT) #print 'acquire %s lock = %s ' % (CACHED_HITCOUNT_LOCK_KEY, hitcount_cache.get(CACHED_HITCOUNT_LOCK_KEY)) mem = MemcachedStats(host, port) keys = mem.keys() content_types = {}#used for keeping track of the content types so DB doesn't have to be queried each time for cache_key in keys: if "hitcount__" in cache_key and not CACHED_HITCOUNT_IP_CACHE in cache_key: cache_key = cache_key.split(':')[-1]#the key is a combination of key_prefix, version and key all separated by : - all we need is the key count = hitcount_cache.get(cache_key) if count:#only update the hit count if the is not None hitcount, ctype_pk, object_pk = cache_key.split('__') if ctype_pk in content_types.keys(): content_type = content_types[ctype_pk] else: content_type = ContentType.objects.get(id=ctype_pk) content_types[ctype_pk] = content_type with transaction_atomic(): #save a new hit or increment this hits on an existing hit hit, created = Hit.objects.select_for_update().get_or_create(added=datetime.utcnow().date(), object_pk=object_pk, content_type=content_type) if hit and created: hit.hits = long(count) hit.save() elif hit: hit.hits = hit.hits + long(count) hit.save() #reset the hitcount for this object to 0 - even if it was previously None hitcount_cache.set(cache_key, 0, CACHED_HITCOUNT_CACHE_TIMEOUT) #print 'reset key %s to zero = %s ' % (cache_key, hitcount_cache.get(cache_key)) except Exception, ex: logger.error('Unable to persist hits') logger.error(ex) raise ex finally:
def get_nip_records_from_cache(nip_pk, nip_name): mem = MemcachedStats() nip_uid = "%d_%s" % (nip_pk, nip_name) relevant_keys = [key for key in mem.keys() if nip_uid in key] data = {} for key in relevant_keys: time = key.splt("_")[2] data[key] = json.loads(cache.get(key)) return data
from memcached_stats import MemcachedStats mem = MemcachedStats() keys = mem.keys() print keys import memcached2 memcache = memcached2.Memcache(('memcached://localhost/',)) import pprint pprint.pprint(memcache.get_multi(keys))