python之Memcached 安裝及操作

來源:互聯網
上載者:User

標籤:plain   space   緩衝系統   body   bsp   啟動   style   coding   strong   

一、Memcached

Memcached 是一個高效能的分布式記憶體對象緩衝系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是用戶端可以用任何語言來編寫,並通過memcached協議與守護進程通訊。

二、memcached的安裝基本使用

1、memcached安裝:

wget http://memcached.org/latesttar -zxvf memcached-1.x.x.tar.gzcd memcached-1.x.x./configure && make && make test && sudo make install PS:依賴libevent       yum install libevent-devel       apt-get install libevent-dev

2、啟動Memcached

memcached -d -m 10    -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid 參數說明:    -d 是啟動一個守護進程    -m 是分配給Memcache使用的記憶體數量,單位是MB    -u 是運行Memcache的使用者    -l 是監聽的伺服器IP地址    -p 是設定Memcache監聽的連接埠,最好是1024以上的連接埠    -c 選項是最大啟動並執行並發串連數,預設是1024,按照你伺服器的負載量來設定    -P 是設定儲存Memcache的pid檔案

3、Memcached命令

儲存命令: set/add/replace/append/prepend/cas擷取命令: get/gets其他命令: delete/stats..

Python操作Memcached

三、安裝API

12 python操作Memcached使用Python-memcached模組下載安裝:https://pypi.python.org/pypi/python-memcached

1、第一次操作

123456 import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True)mc.set("foo""bar")ret = mc.get(‘foo‘)print ret

Ps:debug = True 表示運行出現錯誤時,現實錯誤資訊,上線後移除該參數。

2、天生支援叢集

python-memcached模組原生支援叢集操作,其原理是在記憶體維護一個主機列表,且叢集中主機的權重值和主機在列表中重複出現的次數成正比

1234567      主機    權重    1.1.1.1   1    1.1.1.2   2    1.1.1.3   1 那麼在記憶體中主機列表為:    host_list = ["1.1.1.1""1.1.1.2""1.1.1.2""1.1.1.3", ]

如果使用者根據如果要在記憶體中建立一個索引值對(如:k1 = "v1"),那麼要執行一下步驟:

  • 根據演算法將 k1 轉換成一個數字
  • 將數字和主機列表長度求餘數,得到一個值 N( 0 <= N < 列表長度 )
  • 在主機列表中根據 第2步得到的值為索引擷取主機,例如:host_list[N]
  • 串連 將第3步中擷取的主機,將 k1 = "v1" 放置在該伺服器的記憶體中

代碼實現如下:

123 mc = memcache.Client([(‘1.1.1.1:12000‘1), (‘1.1.1.2:12000‘2), (‘1.1.1.3:12000‘1)], debug=True) mc.set(‘k1‘‘v1‘)

3、add
添加一條索引值對,如果已經存在的 key,重複執行add操作異常

1234567 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True)mc.add(‘k1‘‘v1‘)# mc.add(‘k1‘, ‘v2‘) # 報錯,對已經存在的key重複添加,失敗!!!

4、replace
replace 修改某個key的值,如果key不存在,則異常

1234567 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True)# 如果memcache中存在kkkk,則替換成功,否則一場mc.replace(‘kkkk‘,‘999‘)

5、set 和 set_multi

set            設定一個索引值對,如果key不存在,則建立,如果key存在,則修改
set_multi   設定多個索引值對,如果key不存在,則建立,如果key存在,則修改

123456789 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True) mc.set(‘key0‘‘wupeiqi‘) mc.set_multi({‘key1‘‘val1‘‘key2‘‘val2‘})

6、delete 和 delete_multi

delete             在Memcached中刪除指定的一個索引值對
delete_multi    在Memcached中刪除指定的多個索引值對

12345678 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True) mc.delete(‘key0‘)mc.delete_multi([‘key1‘‘key2‘])

7、get 和 get_multi

get            擷取一個索引值對
get_multi   擷取多一個索引值對

12345678 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True) val = mc.get(‘key0‘)item_dict = mc.get_multi(["key1""key2""key3"])

8、append 和 prepend

append    修改指定key的值,在該值 後面 追加內容
prepend   修改指定key的值,在該值 前面 插入內容

123456789101112 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True)# k1 = "v1" mc.append(‘k1‘‘after‘)# k1 = "v1after" mc.prepend(‘k1‘‘before‘)# k1 = "beforev1after"

9、decr 和 incr  

incr  自增,將Memcached中的某一個值增加 N ( N預設為1 )
decr 自減,將Memcached中的某一個值減少 N ( N預設為1 )

123456789101112131415161718 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcache mc = memcache.Client([‘10.211.55.4:12000‘], debug=True)mc.set(‘k1‘‘777‘) mc.incr(‘k1‘)# k1 = 778 mc.incr(‘k1‘10)# k1 = 788 mc.decr(‘k1‘)# k1 = 787 mc.decr(‘k1‘10)# k1 = 777

10、gets 和 cas

如商城商品剩餘個數,假設改值儲存在memcache中,product_count = 900
A使用者重新整理頁面從memcache中讀取到product_count = 900
B使用者重新整理頁面從memcache中讀取到product_count = 900

如果A、B使用者均購買商品

A使用者修改商品剩餘個數 product_count=899
B使用者修改商品剩餘個數 product_count=899

如此一來緩衝內的資料便不在正確,兩個使用者購買商品後,商品剩餘還是 899
如果使用python的set和get來操作以上過程,那麼程式就會如上述所示情況!

如果想要避免此情況的發生,只要使用 gets 和 cas 即可,如:

123456789 #!/usr/bin/env python# -*- coding:utf-8 -*-import memcachemc = memcache.Client([‘10.211.55.4:12000‘], debug=True, cache_cas=True) = mc.gets(‘product_count‘)# ...# 如果有人在gets之後和cas之前修改了product_count,那麼,下面的設定將會執行失敗,剖出異常,從而避免非正常資料的產生mc.cas(‘product_count‘"899")

Ps:本質上每次執行gets時,會從memcache中擷取一個自增的數字,通過cas去修改gets的值時,會攜帶之前擷取的自增值和memcache中的自增值進行比較,如果相等,則可以提交,如果不想等,那表示在gets和cas執行之間,又有其他人執行了gets(擷取了緩衝的指定值), 如此一來有可能出現非正常資料,則不允許修改

python之Memcached 安裝及操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.