python-memcached支持一致性哈希和二进制协议吗?
Python-memcached 是 Django 官方支持的 memcached 驱动程序。
它是否支持:
- 一致性哈希
- 二进制协议
如果支持的话,我该如何在 Django 中使用这些功能呢?我找不到相关的文档。
6 个回答
如果你想要一个简单易用的解决方案来搭配django,可以试试 django-memcached-hashring
: https://github.com/jezdez/django-memcached-hashring。
它是一个围绕 django.core.cache.backends.memcached.MemcachedCache
和 hash_ring
库的适配器。
你可以试试这个链接:http://amix.dk/blog/post/19370
这个链接介绍了一种方法,它封装了python-memcache的Client类,这样可以通过一致性哈希来分配键。
编辑:我在查看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确实做了一致性哈希)
不过我觉得提问者可能想要的是更“强大”的一致性哈希,比如libketama。我认为目前没有现成的解决方案,看来你需要动手编译和安装一个更高级的memcached库,比如pylibmc,并写一个自定义的Django后端来使用它,而不是使用python-memcached。
无论如何,当你添加或移除存储桶时,键的重新映射是不可避免的(即使使用libketama,也会发生,只是比其他算法少一些)。
在查看python-memcached v1.45中的_get_server
方法时,发现它并没有使用一致性哈希,而是用了一个简单的计算方式hash % len(buckets)
。
同样,对于python-memcache使用的二进制协议,按照我在源代码中看到的,它只使用了文本命令。