import memcache mc = memcache.Client(['127.0.0.1:8081'],debug=True) mc.set("key","val") ret = mc.get("key") print(ret)
set:
mc.set("key","val")
add:
#mc.add("key",'val')已存在则不允许添加 #MemCached: while expecting 'STORED', got unexpected response 'NOT_STORED'
replace:
mc.replace("key","valr") #不存在则不允许修改
上面的add,和replace不常使用,因为set完全可以替换,更加灵活,set()可以创建,可以修改
set_multi使用:
mc.set_multi({'k1':'v1','k2':'v2'})
delete和delete_multi
mc.delete("k1") mc.delete_multi("key1","key")
get和get_multi
ret = mc.get("k1")#返回结果 ret = mc.get_multi(["k1","k2"])#返回结果集
append和prepend,在设置的键后面的值上进行修改
mc.set("k1","v1") #k1 == > v1 mc.append("k1","after") #k1 == >v1after mc.prepend("k1","before") #k1 ==>beforev1after
decr和incr:
decr自减一,incr自加一(在未设置步长时),针对所存值都为int类型的数据
mc.set("key","1") mc.set("key",1) #上面两种都可以 mc.incr("key") ret = mc.get("key") print(ret) #结果为2 mc.decr('key') print(ret) #结果为1
mc.incr("key",2)#自增2
mc.decr("key",2)#自减2
gets和cas:防止有脏数据,类似加锁(实际是在内部维护了一个计数器),使数据保持正确,谁先获取这个数据,只有当他处理完成后,其他人,才可以再去获取,不允许同时获取数据,不然报错,所以可以通过这个try修改顺序
使用:
进程一:
import memcache mc = memcache.Client(['127.0.0.1:8081'],debug=True,cache_cas=True) mc = memcache.Client(['127.0.0.1:8081'],debug=True,cache_cas=True) r = mc.gets('c1') print(r) input(">>>") mc.cas('c1',99) r = mc.get('c1') print(r)
进程二:
import memcache mc = memcache.Client(['127.0.0.1:8081'],debug=True,cache_cas=True) r = mc.gets('c1') print(r) input(">>>") mc.cas('c1',99) r = mc.get('c1') print(r)
当1执行后堵塞,再执行2(本质上每次执行gets时,会从memcache中获取一个自增的数字),获取数据输出后,两个都堵塞
执行2,(通过cas去修改gets的值时,会携带之前获取的自增值和memcache中的自增值进行比较,如果相等,则可以提交)
再去执行1,cas数据是其自增值和内存不一致(由于2已经修改过),则报错
MemCached: while expecting 'STORED', got unexpected response 'EXISTS'
memcache和Redis比较:https://www.oschina.net/news/26691/memcached-timeout