Вы можете использовать это: http://amix.dk/blog/post/19370
Он инкапсулирует класс Client в python-memcache, поэтому ключи распределяются с использованием согласованного хеширования.
РЕДАКТИРОВАТЬ - я копаю python-memcached
1.4.5 исходный код, и похоже, что он на самом деле может поддерживать согласованное хеширование.
Соответствующий код:
from binascii import crc32 # zlib version is not cross-platform
def cmemcache_hash(key):
return((((crc32(key) & 0xffffffff) >> 16) & 0x7fff) or 1)
serverHashFunction = cmemcache_hash
-- SNIP --
def _get_server(self, key):
if isinstance(key, tuple):
serverhash, key = key
else:
serverhash = serverHashFunction(key)
for i in range(Client._SERVER_RETRIES):
server = self.buckets[serverhash % len(self.buckets)]
if server.connect():
#print "(using server %s)" % server,
return server, key
serverhash = serverHashFunction(str(serverhash) + str(i))
return None, None
Исходя из этого кода, похоже, что он реализует алгоритм, если только cmemcache_hash
не является значимым именем и не является реальным алгоритмом. (теперь вышедший на пенсию cmemcache выполняет согласованное хеширование)
Но я думаю, что OP имеет в виду более «устойчивое» согласованное хеширование, например libketama . Я не думаю, что есть какое-то решение для этого, похоже, вам нужно закатать рукава, скомпилировать / установить более продвинутую библиотеку memcached, такую как pylibmc , и написать собственный бэкэнд Django, который использует это вместо python-memcached.
Во всяком случае, в любом случае при добавлении / удалении сегментов в пул произойдет некоторое перераспределение ключей (даже при использовании libketama, чуть меньше, чем при использовании других алгоритмов)