Python-memcached的基本使用 - Flynewton成长点滴 - 开源中国社区
生活随笔
收集整理的這篇文章主要介紹了
Python-memcached的基本使用 - Flynewton成长点滴 - 开源中国社区
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Python-memcached的基本使用 - Flynewton成長點(diǎn)滴 - 開源中國社區(qū)
Python-memcached的基本使用 發(fā)表于3年前(2010-12-04 00:02)?? 閱讀(9601)?|?評(píng)論(3) 12人收藏此文章, 我要收藏 贊1 python memcached 想學(xué)Python,又想研究下memcached的客戶端,于是拿Python-memcached研究研究~~~ 1.memcached的安裝 請(qǐng)參考本博另一文章《Linux下安裝memcached》 啟動(dòng)一個(gè)memcached實(shí)例:memcached -m 10 -p 12000 2.Python-memcached安裝 到ftp://ftp.tummy.com/pub/python-memcached/下載最新版本的API,并解壓tar包 輸入python setup.py install命令進(jìn)行安裝 3.小例子演示 將memcached.pyc拷貝到工作目錄 #!/usr/bin/env python import memcache mc = memcache.Client(['127.0.0.1:12000'],debug=0) mc.set("foo","bar") value = mc.get("foo") print value 輸出得到bar 4.Python-memcached API總結(jié) 整個(gè)memcache.py只有1241行,相當(dāng)精簡(jiǎn) 主要方法如下: @set(key,val,time=0,min_compress_len=0) 無條件鍵值對(duì)的設(shè)置,其中的time用于設(shè)置超時(shí),單位是秒,而min_compress_len則用于設(shè)置zlib壓縮(注:zlib是提供數(shù)據(jù)壓縮用的函式庫) @set_multi(mapping,time=0,key_prefix='',min_compress_len=0) 設(shè)置多個(gè)鍵值對(duì),key_prefix是key的前綴,完整的鍵名是key_prefix+key,?使用方法如下 ??>>> mc.set_multi({'k1' : 1, 'k2' : 2}, key_prefix='pfx_') == [] ??>>> mc.get_multi(['k1', 'k2', 'nonexist'], key_prefix='pfx_') == {'k1' : 1, 'k2' : 2} @add(key,val,time=0,min_compress_len=0) 添加一個(gè)鍵值對(duì),內(nèi)部調(diào)用_set()方法 @replace(key,val,time=0,min_compress_len=0) 替換value,內(nèi)部調(diào)用_set()方法 @get(key) 根據(jù)key去獲取value,出錯(cuò)返回None @get_multi(keys,key_prefix='') 獲取多個(gè)key的值,返回的是字典。keys為key的列表 @delete(key,time=0) 刪除某個(gè)key。time的單位為秒,用于確保在特定時(shí)間內(nèi)的set和update操作會(huì)失敗。如果返回非0則代表成功 @incr(key,delta=1) 自增變量加上delta,默認(rèn)加1,使用如下 >>> mc.set("counter", "20") ? >>> mc.incr("counter") 21 @decr(key,delta=1) 自減變量減去delta,默認(rèn)減1 5._set方法 很多方法內(nèi)部都調(diào)用了_set方法,其源碼如下: def _set(self, cmd, key, val, time, min_compress_len = 0): self.check_key(key) server, key = self._get_server(key) if not server: return 0 self._statlog(cmd) store_info = self._val_to_store_info(val, min_compress_len) if not store_info: return(0) if cmd == 'cas': if key not in self.cas_ids: return self._set('set', key, val, time, min_compress_len) fullcmd = "%s %s %d %d %d %d\r\n%s" % ( cmd, key, store_info[0], time, store_info[1], self.cas_ids[key], store_info[2]) else: fullcmd = "%s %s %d %d %d\r\n%s" % ( cmd, key, store_info[0], time, store_info[1], store_info[2]) try: server.send_cmd(fullcmd) return(server.expect("STORED") == "STORED") except socket.error, msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return 0 注: memcached 的客戶端使用TCP鏈接與服務(wù)器通訊, 一個(gè)運(yùn)行中的memcached服務(wù)器監(jiān)視一些端口, 客戶端連接這些端口,發(fā)送命令到服務(wù)器,讀取回應(yīng),最后關(guān)閉連接。(具體命令請(qǐng)參考《Memcached 協(xié)議中文版》) ? 6.python-memcached線程安全 本部分轉(zhuǎn)自http://weavesky.com/2009/01/22/is-python-memcached-threadsafe/ python-memcached是不是線程安全的 答案是肯定的,前提你在使用Python 2.4+和python-memcached 1.36+ 為什么我們需要線程安全的memcached client,因?yàn)槲覀兊膶?shí)際應(yīng)用一般是多線程的模型,例如cherrypy、twisted,如果python-memcached不是線程安全的話,引起的問題不僅僅是并發(fā)修改共享變量這么簡(jiǎn)單,是外部socket鏈接的數(shù)據(jù)流的混亂 python-memcached怎么實(shí)現(xiàn)線程安全的呢?查看源代碼看到 try: # Only exists in Python 2.4+ from threading import local except ImportError: # TODO: add the pure-python local implementation class local(object): pass class Client(local): ? 很取巧的讓Client類繼承threading.local,也就是Client里面的每一個(gè)屬性都是跟當(dāng)前線程綁定的。實(shí)現(xiàn)雖然不太優(yōu)雅,但是很實(shí)在。但是別以為這樣就可以隨便在線程里面用python-memcached了,因?yàn)檫@種thread local的做法,你的應(yīng)用必須要使用thread pool的模式,而不能不停創(chuàng)建銷毀thread,因?yàn)槊恳粋€(gè)新線程的創(chuàng)建,對(duì)于就會(huì)使用一個(gè)全新的Client,也就是一個(gè)全新的socket鏈接,如果不停打開創(chuàng)建銷毀thread的話,就會(huì)導(dǎo)致不停的創(chuàng)建銷毀socket鏈接,導(dǎo)致性能大量下降。幸好,無論是cherrypy還是twisted,都是使用了thread pool的模式總結(jié)
以上是生活随笔為你收集整理的Python-memcached的基本使用 - Flynewton成长点滴 - 开源中国社区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 需求规格说明书评审
- 下一篇: 基于python的电影推荐系统论文_一种