python操作memcached方法

2021-09-02 23:57:45 字數 3712 閱讀 3016

1.建立memcache物件

#!/usr/bin/env python

# -*-coding:utf-8-*-

import memcache

mc = memcache.client(["192.168.31.10:11211"], debug=true) #debug為除錯引數

mc.set("foo", "123")

print mc.get("foo")

2.python使用memcache集群

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

集群memcache伺服器,python 對資料儲存在那台伺服器位置的演算法是如下

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

集群設定方法:

#!/usr/bin/env python

# -*-coding:utf-8-*-

import memcache

mc = memcache.client([("192.168.31.10:11211", 1), ("192.168.31.7:11211", 3), ("192.168.31.7:11211", 1)], debug=true)

mc.set("foo", "abc")

print mc.get("foo")

注:集群設定中,伺服器的列表位址元素是元組了(主機位址, 權重)

3.增加資料add

對已經存在的key使用add會報異常.set方法不會.這點也是他們2的區別

#!/usr/bin/env python

# -*-coding:utf-8-*-

import memcache

mc = memcache.client([("192.168.31.10:11211", 1), ("192.168.31.7:11211", 3), ("192.168.31.7:11211", 1)], debug=true)

mc.set("foo", "abc")

print mc.get("foo")

mc.set("foo", "456")

print mc.get("foo")

mc.add("foo", "abc")

4.修改資料replace

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

mc.replace("k1", "v2")

print mc.get("k1")

上述**中,k1的鍵是不存在的.執行replace會報如下異常

memcached: while expecting 'stored', got unexpected response 'not_stored'

non

5.設定鍵值對set和set _multi

set 設定乙個鍵值對,如果key不存在,則建立,如果key存在,則修改.

set_multi 設定多個鍵值對,如果key不存在,則建立,如果key存在,則修改.

mc.set("k1", "v1")

print mc.get("k1")

mc.set_multi()

print mc.get("k3")

執行結果

v1

v3

6.delete 和 delete_multi

delete 在memcached中刪除指定的乙個鍵值對

delete_multi 在memcached中刪除指定的多個鍵值對.引數是列表

mc.set("k1", "v1")

print mc.get("k1")

mc.delete("k1")

print mc.get("k1")

mc.set_multi()

print mc.get("k3")

mc.delete_multi(["k3"])

print mc.get("k3")

執行結果

v1

none

v3none

mc.set("k1", "abc")

print mc.get("k1")

mc.prepend("k1", "pre--")

print mc.get("k1")

print mc.get("k1")

執行結果

abc

pre--abc

8.自增或者自減值decr 和 incr

incr 自增,將memcached中的某乙個值增加 n ( n預設為1 )

decr 自減,將memcached中的某乙個值減少 n ( n預設為1 )

mc.set("k1", "10")

print mc.get("k1")

mc.incr("k1")

print mc.get("k1")

mc.incr("k1", 10)

print mc.get("k1")

mc.decr(("k1"))

print mc.get("k1")

執行結果

10

1121

20

9.避免髒資料產生的獲取和設定方法

如**商品剩餘個數,假設改值儲存在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 即可,如:

import memcache

import time

mc = memcache.client([("192.168.31.10:11211", 1), ("192.168.31.7:11211", 3), ("192.168.31.7:11211", 1)], debug=true, cache_cas=true)

print mc.gets("foo")

print mc.cas_ids

time.sleep(10)

mc.cas("foo", '999')

print mc.cas_ids

2個這客戶端同時修改同乙份資料時.會報如下錯誤

999

memcached: while expecting 'stored', got unexpected response 'exists'

:cache_cas=true 一定要開啟.不然無法使用上面的特性

eAccelerator與memcached的區別

歡迎各位加入群 206981178,共同學習 eaccelerator和memcached,是目前較為主流的兩個可使用在php之中的快取加速工具.eaccelerator專門為php開發,而memcached不僅僅用在php之中,其他所有的語言都可以使用.eaccelerator的主要功能 1.快取...

PHP Windows下使用Memcached擴充套件

github上發現了乙個很好用的小檔案,能夠 模擬出php memcached.dll的php memcached擴充套件。php memcached client 已知pcel有兩個memcache client的擴充套件,乙個是memcache,乙個是memcached,他們的實現方式不同,後者...

修改ThinkPHP快取為Memcache的方法

一般來說,thinkphp的預設快取方式是以file檔案方式實現的,執行時會在 runtime temp 下生成很多的快取檔案。有的情況下伺服器裝了memcached之後,需要將thinkphp的快取方式更改成memecache方式 具體操作步驟如下 在conf config.php 中新增 dat...