Jusene's Blog

python3 操作 memcached

字数统计: 1.1k阅读时长: 5 min
2017/05/26 Share

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模块原生支持集群操作,其原理是在内存中维护一个主机列表,且集群中主机的群众的权重值和主机在列表中重复出现的次数成正比:

用户如果要在内存中创建一个键值对,那么需要执行如下步骤:

  1. 根据算法将key转换成一个数字
  2. 将数字和主机列表长度求余数,得到一个值N(0<=N<长度)
  3. 在主机列表中根据第二步得到的值为索引获取主机
  4. 连接将第三步中获取的主机,将键对值放至该服务器的内存中
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)
CATALOG
  1. 1. memcached模块安装
    1. 1.1. 简单操作
    2. 1.2. memcache集群
    3. 1.3. 基本操作