I have a code which add extra memcache instance at run time, but this makes my keys lost. I know there are several libraries available like consistent_hash, hash_ring but I am unable to use them in my code. I know there is ketama available but couldn't find python code sample for it.
class MemcacheClient(memcache.Client): """ A memcache subclass. It currently allows you to add a new host at run time. Sadly, this truely messes with the our keys. I.E. Adding a host at runtime effectively wipes our cache all together...Wonder why? """ def _get_server(self, key): """ Current implementation of Memcache client """ return super(MemcacheClient, self)._get_server(key) def add_server(self, server): """ Adds a host at runtime to client """ # Create a new host entry server = memcache._Host( server, self.debug, dead_retry=self.dead_retry, socket_timeout=self.socket_timeout, flush_on_reconnect=self.flush_on_reconnect ) # Add this to our server choices self.servers.append(server) # Update our buckets self.buckets.append(server) def random_key(size): """ Generates a random key """ return ''.join(random.choice(string.letters) for _ in range(size)) if __name__ == '__main__': # We have 7 running memcached servers servers = ['127.0.0.1:1121%d' % i for i in range(1,8)] # We have 100 keys to split across our servers keys = [random_key(10) for i in range(100)] # Init our subclass client = MemcacheClient(servers=servers) # Distribute the keys on our servers for key in keys: client.set(key, 1) # Check how many keys come back valid_keys = client.get_multi(keys) print '%s percent of keys matched' % ((len(valid_keys)/float(len(keys))) * 100) # We add another server...and pow! client.add_server('127.0.0.1:11218') print 'Added new server' valid_keys = client.get_multi(keys) print '%s percent of keys stil matched' % ((len(valid_keys)/float(len(keys))) * 100)