Вы могли бы использовать это: http://amix.dk/blog/post/19370
Он инкапсулирует класс клиента Python-Memcache, с тем ключи распределяются с использованием последовательного хэширования.
EDIT- Я копаю в 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 lib, например pylibmc, и написать собственный бэкэнд Django, который использует это вместо python- Memcached.
Во всяком случае, в любом случае, некоторые переназначение клавиш будет происходить при добавлении/удалении ведрами в бассейн (даже с libketama, только меньше, чем с другими алгоритмами)
Есть ли способ сделать Python-Memcached использовать последовательное хэширование? – Continuation
[hash_ring] (http://pypi.python.org/pypi/hash_ring) имеет подкласс «memcache.Client», реализующий последовательное хеширование, [из версии 1.1] (http://amix.dk/blog/post/ 19370). Затем вы можете реализовать [пользовательский кеш-сервер] (http://docs.djangoproject.com/en/dev/topics/cache/#using-a-custom-cache-backend) в django, подклассифицируя исходный сервер memcached поэтому он использует «MemcacheRing». –
Действительно ли вы это подтвердили или нет? См. Мой ответ выше. – adamJLev