1. 程式人生 > >Python學習——七周四次課(12月7日)

Python學習——七周四次課(12月7日)

add cas 存儲 創建 不存在 數字 bin 集合體 內容

七周四次課(12月7日)
13.12/13.13 memcache常用方法

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

add方法
添加一條鍵值對,如果已經存在的key,重復執行add操作會報異常。
import memcache

mc = memcache.Client([‘192.168.48.128:11211‘], debug=True)
# mc.set("foo", "bar")
# ret = mc.get("foo")
mc.add(‘k1‘,‘v1‘)
mc.add(‘k1‘,‘v1‘)
# print(ret)

replace方法
replace修改某個key的值,如果key不存在,則異常。
import memcache

mc = memcache.Client([‘192.168.48.128:11211‘], debug=True)
# mc.set("foo", "bar")
# ret = mc.get("foo")
mc.add(‘k1‘,‘v1‘)
# mc.add(‘k1‘,‘v1‘)
# print(ret)
mc.replace("k1", "666")
print(mc.get("k1"))
結果:
666

set和set_multi方法
set :設置一個鍵值對,如果key不存在,則創建,如果key存在,則修改;
set_multi:設置多個鍵值對,如果key不存在,則創建,如果key存在,則修改。
import memcache

mc = memcache.Client([‘192.168.48.128:11211‘], debug=True)
mc.set("k10", "v10")
mc.set_multi({"k11": "v11", "k12": "v12"})

set方法和add方法的區別
set = add + replace
1、memcache::add 方法:add方法用於向memcache服務器添加一個要緩存的數據。

註意:如果memcache服務器中已經存在要存儲的key,此時add方法調用失敗。

2、memcache::set 方法:set方法用於設置一個指定key的緩存內容,set方法是add方法和replace方法的集合體。

註意:

1)、如果要設置的key不存在時,則set方法與add方法的效果一致;

2)、如果要設置的key已經存在時,則set方法與replace方法效果一樣。

3、 mmecache::replace方法: replace方法用於替換一個指定key的緩存內容,如果key不存在則返回false


delete和delete_multi方法
delete:在Memcached中刪除指定的一個鍵值對;
delete_multi:在Memcached中刪除指定的多個鍵值對。
import memcache

mc = memcache.Client([‘192.168.48.128:11211‘], debug=True)
# mc.set("k10", "v10")
# mc.set_multi({"k11": "v11", "k12": "v12"})
#
mc.delete("k10")
mc.delete_multi(["k11", "k12"])

get和get_multi方法
get : 獲取一個鍵值對;
get_multi:獲取多個鍵值對。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2017/9/20 10:37
# @Author : lingxiangxiang
# @File : demon1.py

import memcache

mc = memcache.Client([‘192.168.48.128:11211‘], debug=True)
mc.set("k10", "v10")
mc.set_multi({"k11": "v11", "k12": "v12"})
#
# mc.delete("k10")
# mc.delete_multi(["k11", "k12"])

val = mc.get(‘k1‘)
print(val)

item_dict = mc.get_multi([‘k11‘, ‘k12‘])
print(item_dict)

append和prepend方法
append:修改指定key的值,在該值後面追加內容;
prepend:修改指定key的值,在該值前面插入內容。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import memcache

mc = memcache.Client([‘192.168.10.128:12000‘], debug=True)

mc.append(‘k1‘,‘after‘)
val1 = mc.get(‘k1‘)
print(val1)

mc.prepend(‘k1‘,‘brefore‘)
val2 = mc.get(‘k1‘)
print(val2)

#結果:
v1afterafter
breforev1afterafter


incr:自增,將Memcached中的某一個值增加N(N默認為1);
decr:自減,將Memcached中的某一個值減少N(N默認為1)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import memcache

mc = memcache.Client([‘192.168.10.128:12000‘], debug=True)

mc.set(‘k1‘,‘777‘)

#mc.incr(‘k1‘) #778,默認自增1

mc.incr(‘k1‘,10)
val1 = mc.get(‘k1‘)
print(val1)

mc.decr(‘k1‘,20)
val2 = mc.get(‘k1‘)
print(val2)

#結果

787 #自增後的結果
767 #自減後的結果

gets和cas:
如商城商品剩余個數,假設改值保存在memcache中,product_count =9000
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即可,如:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author:HaiFeng Di

import memcache

mc = memcache.Client([‘192.168.10.128:12000‘], debug=True)

v = mc.gets(‘product_count‘)
print(v)

#如果有人在gets之後和cas之前修改了product_count,那麽下面的設置將會執行失敗,拋出異常,從而避免非正常數據的產出
v1 = mc.cas(‘product_count‘,"899")
print(v1)

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

Python學習——七周四次課(12月7日)