標籤:
本文轉載自:http://my.oschina.net/flynewton/blog/10660
將memcached.pyc拷貝到工作目錄
1 #!/usr/bin/env python2 3 import memcache4 5 mc = memcache.Client([‘127.0.0.1:12000‘],debug=0)6 mc.set("foo","bar")7 value = mc.get("foo")8 print value
輸出得到bar
4.Python-memcached API總結
主要方法如下:
1 @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, 使用方法如下
1 >>> mc.set_multi({‘k1‘ : 1, ‘k2‘ : 2}, key_prefix=‘pfx_‘) == []2 3 >>> 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,使用如下
1 >>> mc.set("counter", "20") 2 3 >>> mc.incr("counter")4 5 216 7 @decr(key,delta=1)
自減變數減去delta,預設減1
5._set方法
很多方法內部都調用了_set方法,其源碼如下:
注: memcached 的用戶端使用TCP連結與伺服器通訊, 一個運行中的memcached伺服器監視一些連接埠, 用戶端串連這些連接埠,發送命令到伺服器,讀取回應,最後關閉串連。(具體命令請參考《Memcached 協議中文版》)
6.python-memcached安全執行緒
python-memcached是不是安全執行緒的
答案是肯定的,為什麼我們需要安全執行緒的memcached client,因為我們的實際應用一般是多線程的模型,例如cherrypy、twisted,如果python-memcached不是安全執行緒的話,引起的問題不僅僅是並發修改共用變數這麼簡單,是外部socket連結的資料流的混亂
python-memcached怎麼實現安全執行緒的呢?查看原始碼看到
1 try:2 # Only exists in Python 2.4+3 from threading import local4 except ImportError:5 # TODO: add the pure-python local implementation6 class local(object):7 pass8 9 class Client(local):
很取巧的讓Client類繼承threading.local,也就是Client裡面的每一個屬性都是跟當前線程綁定的。實現雖然不太優雅,但是很實在。但是別以為這樣就可以隨便線上程裡面用python-memcached了,因為這種thread local的做法,你的應用必須要使用thread pool的模式,而不能不停建立銷毀thread,因為每一個新線程的建立,對於就會使用一個全新的Client,也就是一個全新的socket連結,如果不停開啟建立銷毀thread的話,就會導致不停的建立銷毀socket連結,導致效能大量下降。幸好,無論是cherrypy還是twisted,都是使用了thread pool的模式
python-memcached包使用方法