memcached模块安装
下载安装:https://pypi.python.org/pypi/python-memcached
1 | ~]# tar xf python-memcached-1.58.tar.gz |
2 | ~]# cd python-memcached-1.58 |
3 | python-memcached-1.58]# ls |
4 | ChangeLog do_release Makefile MANIFEST.in memcache.py PKG-INFO PSF.LICENSE README.md requirements.txt setup.cfg setup.py test-requirements.txt tests tox.ini |
5 | python-memcached-1.58]# python setup.py install |
简单操作
1 | import memcache |
2 | |
3 | mc=memcache.Client(['127.0.0.1:11211'],debug=True,time=300) |
4 | |
5 | # 插入 |
6 | mc.set('name','python') |
7 | |
8 | #读取 |
9 | ret=mc.get('name') |
10 | print(ret) |
11 | |
12 | #输出结果 |
13 | python |
14 | |
15 | #debug=True表示运行出错时,可以显示错误信息,正式环境不要添加 |
memcache集群
python-memcache模块原生支持集群操作,其原理是在内存中维护一个主机列表,且集群中主机的群众的权重值和主机在列表中重复出现的次数成正比:
用户如果要在内存中创建一个键值对,那么需要执行如下步骤:
- 根据算法将key转换成一个数字
- 将数字和主机列表长度求余数,得到一个值N(0<=N<长度)
- 在主机列表中根据第二步得到的值为索引获取主机
- 连接将第三步中获取的主机,将键对值放至该服务器的内存中
1 | import memcache |
2 | mc=memcache.Client([('1.1.1.1:11211',1),('2.2.2.2:11211',2),('3.3.3.3:11211',3)]) |
3 | mc.set('k1','v1') |
4 | ret=mc.get('k1') |
5 | print(ret) |
基本操作
- add
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.add('k1','v1') |
4 | mc.add('k1','v2') #报错,对已经存在的key重复添加,失败! |
- replace
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.set('name','tom') |
4 | re=mc.get('name') |
5 | print(re) |
6 | tom |
7 | |
8 | replace=mc.replace('name','jack') |
9 | re=mc.get('name') |
10 | print(replace,re) |
11 | True jack |
12 | |
13 | 如果不存在key,修改失败,返回空值 |
14 | False None |
- set和set_multi
set:设置一个键值对,如果key不存在,则创建,如果key存在,则修改。
set_multi:设置多个键值对,如果key不存在,则创建,如果key存在,则修改
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.set('name','tom') |
4 | re=mc.get('name') |
5 | print(re) #设置一个键值对 |
6 | |
7 | dic={'name':'jusene','age':'23','job':'IT'} |
8 | mc.set_multi(dic) |
9 | mcname=mc.get('name') |
10 | mcage=mc.get('age') |
11 | mcjob=mc.get('job') |
12 | print(mcname,mcage,mcjob) |
- delete和delete_multi
delete:在Memcached中删除指定的一个键值对
delete_multi:在Mencached中删除指定的多个键值对
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.set('name','tom') |
4 | re=mc.get('name') |
5 | print(re) |
6 | re=mc.delete('name') |
7 | print(re) |
8 | |
9 | dic={'name':'jusene','age':'23','job':'IT'} |
10 | mc.set_multi(dic) |
11 | retm=mc.get_multi(['name','age','job']) |
12 | print(retm) |
13 | mc.delete_multi(['name','age','job']) |
14 | etm=mc.get_multi(['name','age','job']) |
15 | print(retm) |
- append 和 prepend
append: 修改指定key的值,在该值后面追加内容
prepend:修改指定key的值,在该值前面插入内容
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.set('name','and') |
4 | re=mc.get('name') |
5 | print(re) |
6 | |
7 | mc.append('name',' jerry') |
8 | mc.prepend('name','tom ') |
9 | mc.get('name') |
10 | tom and jerry |
- incr 和 decr
decr:自减,将memcached中的一个值减少n(默认1)
incr:自增,将memcached中的一个值增加n (默认1)
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.set('num','1') |
4 | mc.incr('num') |
5 | 2 |
6 | mc.incr('num',3) |
7 | 5 |
8 | mc.decr('num',2) |
9 | 3 |
- gets 和 cas
使用缓存系统共享数据资源就必然绕不开数据争夺和脏数据(数据混乱)的问题。
假设商城某件商品的剩余个数保存在memcache中,product_count = 900
A用户刷新页面从memecache中读取到product_count = 900
B用户刷新页面从memecache中读取到product_count = 900
A,B用户均购买商品,并修改product_count的值
A修改后,product_count = 899
B修改后,product_count = 899
然而正确数字应该是898,数据就混乱了。
如果想要避免这种情况的发生,则可以使用 gets 和 cas
1 | import memcache |
2 | mc=memcache.Client(['127.0.0.1:11211']) |
3 | mc.set('count','10') |
4 | reget=mc.get(‘count’) |
5 | print('件数',reget) |
6 | |
7 | regets=mc.gets('count') |
8 | print(regets) |
9 | 如果有人在gets和cas之前修改了count,那么下面的设置将会失败,异常 |
10 | recas=mc.cas('count',11) |
11 | print(recas) |
12 | regets=mc.gets('count') |
13 | print('修改',regets) |