python在生产环境可选的memcached lib
memcached对动态语言帮助很大,因为动态语言的模式和实际的部署模型,python/php/ruby等不可能像Java那样在JVM内存中开辟一块内存来缓冲数据(而实际上Java这样做也会遇到容量不够,GC,集群等问题)。不过在实际使用中,我发现python memcached lib并没有想象中那么成熟、完整,经过一番研究之后,目前至少能勉强在生产环境中使用。
从memcached官方wiki中可以看到,python还是有不少可以使用的lib的,但是经过测试和比较之后,发现选择的方案也不多。我们还是从比较出名的web框架入手吧,毫无疑问,Django是目前python最好的框架之一,在生产环境使用它的人也比较多,而且它的文档很详细,有一节就是专门提到cache的部分 。Django推荐使用cmemcache,在不能使用cmemcache的情况(例如windows机器),就使用python-memcached。经过我的实际测试,这个或许不是性能最好,版本最新,功能最多的选择,但是是一个很稳靠的选择。
cmemcache封装的是libmemcache,这个类库很久没有更新了,目前libmemcached比较活跃,功能也比较全面。这里值得一提的是Python libmemcached是来自豆瓣贡献的类库,不过因为使用的人不多,所以最终我没有选择。另外还有一个pylibmc也是对libmemcached的封装,这是cmemcache_hash的作者写的类库(稍后会提到cmemcache_hash),很可惜我一直没有编译成功。
但是实际使用cmemcache/python-memcached的组合也是要进行一些封装的,首先有cmemcache不是线程安全的问题 ,另外就是Python libmemcached的hash算法有问题。什么?你从来不用超过1个的memcached服务器?我还是建议你至少用2个memcached服务器吧,至少有backup。
而cmemcache和Python libmemcached的hash算法不一样。这里我们还需要cmemcache_hash,名字可能有少少误导,它的作用是领到Python libmemcached的hash跟cmemcache一致
于是我们的封装代码大概是这样
try: import cmemcache as memcache logger.warn('load cmemcache') # although cmemcache might be thread safe # but we still make it thread local # also it can use separate socket connect in each thread for more performance from threading import local except ImportError, e: logger.warn('cmemcache error: %s', e) import memcache import cmemcache_hash logger.warn('load python-memcache with cmemcache_hash') # python-memcache is already using thread local class local(): pass class Memcache(local): def __init__(self, servers): self._current = memcache.Client(servers) def current(self): return self._current
Recent Comments