#!/usr/bin/env python # -*- coding: utf-8 -*- """ http://www.cnblogs.com/wupeiqi/articles/5132791.html memcached:只支持一种数据类型 key-->value(value只能是字符串) 本质:通过socket连接发送命令 安装:pip3 install python-memcached """ import memcache mc = memcache.Client(['192.168.1.22:12000'],debug=True) # python-memcached模块支持集群功能,即能连接多个memcached服务器,并对每个服务器设置权重 # mc = memcache.Client([('192.168.1.22:12000',1),('192.168.1.23:12000',2)],debug=True) mc.set("foo","bar") # 设置一个键值对,如果key不存在,则创建,如果key存在,则修改存:key:value--->foo:bar mc.set_multi({'k1':'v1','k2':'v2'}) # 设置多个键值对,如果key不存在,则创建,如果key存在,则修改 mc.add('key','value') # 添加,如果key已存在则报错 mc.replace('key','value') # 修改key的value值,如果key不存在则报错 mc.delete('key') # 在Memcached中删除指定的一个键值对 mc.delete_multi(['key1', 'key2']) # 在Memcached中删除指定的多个键值对 ret = mc.get('foo') # 获取一个键值对 print(ret) item_dict = mc.get_multi(["key1", "key2", "key3"]) # 获取多个个键值对 print(item_dict) ############################################################# # k1 = "v1" mc.append('k1', 'after') # 修改指定key的值,在该值 后面 追加内容 # k1 = "v1after" mc.prepend('k1', 'before') # 修改指定key的值,在该值 前面 插入内容 # k1 = "beforev1after" ############################################################# #k1 = 777 mc.incr('k1') # 自增,将Memcached中的某一个值增加 N ( N默认为1 ) # k1 = 778 mc.incr('k1', 10) # k1 = 788 mc.decr('k1') # 自减,将Memcached中的某一个值减少 N ( N默认为1 ) # k1 = 787 mc.decr('k1', 10) # k1 = 777 ############################################################# # 如商城商品剩余个数,假设改值保存在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 mc = memcache.Client(['10.211.55.4:12000'], debug=True, cache_cas=True) v = mc.gets('product_count') # ... # 如果有人在gets之后和cas之前修改了product_count,那么,下面的设置将会执行失败,剖出异常,从而避免非正常数据的产生 mc.cas('product_count', "899") # Ps:本质上每次执行gets时,会从memcache中获取一个自增的数字(这是一个标记数字)和key的value,通过cas去修改gets的值时,会携带 # 之前获取的自增数字和memcache中的自增数字进行比较,如果相等,则可以提交(提交后,该自增数字加1),如果不相等,那表示在gets和 # cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改。
关注我的公众号,不定期推送资讯
本文来自博客园,作者:链条君,转载请注明原文链接:https://www.cnblogs.com/MacoLee/articles/6125677.html