[轉]Python-memcached的基本使用

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-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的模式

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章