1.memcached的安裝
安裝省略
啓動一個memcached實例:memcached -m 10 -p 12000
2.Python-memcached安裝
到ftp://ftp.tummy.com/pub/python-memcached/下載最新版本的API,並解壓tar包
輸入python setup.py install命令進行安裝
3.小例子演示
將memcached.pyc拷貝到工作目錄
輸出得到bar
4.Python-memcached API總結
整個memcache.py只有1241行,相當精簡
主要方法如下:
@set(key,val,time=0,min_compress_len=0)
無條件鍵值對的設置,其中的time用於設置超時,單位是秒,而min_compress_len則用於設置zlib壓縮(注:zlib是提供數據壓縮用的函式庫)
@set_multi(mapping,time=0,key_prefix='',min_compress_len=0)
設置多個鍵值對,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)
添加一個鍵值對,內部調用_set()方法
@replace(key,val,time=0,min_compress_len=0)
替換value,內部調用_set()方法
@get(key)
根據key去獲取value,出錯返回None
@get_multi(keys,key_prefix='')
獲取多個key的值,返回的是字典。keys爲key的列表
@delete(key,time=0)
刪除某個key。time的單位爲秒,用於確保在特定時間內的set和update操作會失敗。如果返回非0則代表成功
@incr(key,delta=1)
自增變量加上delta,默認加1,使用如下
>>> mc.set("counter", "20")
>>> mc.incr("counter")
21
@decr(key,delta=1)
自減變量減去delta,默認減1
5._set方法
很多方法內部都調用了_set方法,其源碼如下:
注: memcached 的客戶端使用TCP鏈接與服務器通訊, 一個運行中的memcached服務器監視一些端口, 客戶端連接這些端口,發送命令到服務器,讀取回應,最後關閉連接。
6.python-memcached線程安全
答案是肯定的,前提你在使用Python 2.4+和python-memcached 1.36+
爲什麼我們需要線程安全的memcached client,因爲我們的實際應用一般是多線程的模型,例如cherrypy、twisted,如果python-memcached不是線程安全的話,引起的問題不僅僅是併發修改共享變量這麼簡單,是外部socket鏈接的數據流的混亂
python-memcached怎麼實現線程安全的呢?查看源代碼看到
很取巧的讓Client類繼承threading.local,也就是Client裏面的每一個屬性都是跟當前線程綁定的。實現雖然不太優雅,但是很實在。但是別以爲這樣就可以隨便在線程裏面用python-memcached了,因爲這種thread local的做法,你的應用必須要使用thread pool的模式,而不能不停創建銷燬thread,因爲每一個新線程的創建,對於就會使用一個全新的Client,也就是一個全新的socket鏈接,如果不停打開創建銷燬thread的話,就會導致不停的創建銷燬socket鏈接,導致性能大量下降。幸好,無論是cherrypy還是twisted,都是使用了thread pool的模式