python-memcached支持一致性哈希和二进制协议吗?

4 投票
6 回答
2486 浏览
提问于 2025-04-15 21:28

Python-memcached 是 Django 官方支持的 memcached 驱动程序。

它是否支持:

  1. 一致性哈希
  2. 二进制协议

如果支持的话,我该如何在 Django 中使用这些功能呢?我找不到相关的文档。

6 个回答

1

如果你想要一个简单易用的解决方案来搭配django,可以试试 django-memcached-hashringhttps://github.com/jezdez/django-memcached-hashring

它是一个围绕 django.core.cache.backends.memcached.MemcachedCachehash_ring 库的适配器。

1

你可以试试这个链接: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,也会发生,只是比其他算法少一些)。

2

在查看python-memcached v1.45中的_get_server方法时,发现它并没有使用一致性哈希,而是用了一个简单的计算方式hash % len(buckets)

同样,对于python-memcache使用的二进制协议,按照我在源代码中看到的,它只使用了文本命令。

撰写回答