博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之路-Memcache
阅读量:5078 次
发布时间:2019-06-12

本文共 4061 字,大约阅读时间需要 13 分钟。

Memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的。其(daemon )是用写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

Memcached安装和基本使用

wget http: // memcached.org / latest

tar - zxvf memcached - 1. x.x.tar.gz
cd memcached - 1. x.x
./ configure & & make & & make test & & sudo make install
PS:依赖libevent
yum install libevent - devel
apt - get install libevent - dev
启动Memcached

memcached
-
d
-
m
10   
-
u root
-
l
10.211
.
55.4
-
p
12000
-
c
256
-
P
/
tmp
/
memcached.pid
 
参数说明:
    
-
d 是启动一个守护进程
    
-
m 是分配给Memcache使用的内存数量,单位是MB
    
-
u 是运行Memcache的用户
    
-
l 是监听的服务器IP地址
    
-
p 是设置Memcache监听的端口,最好是
1024
以上的端口
    
-
c 选项是最大运行的并发连接数,默认是
1024
,按照你服务器的负载量来设定
    
-
P 是设置保存Memcache的pid文件
memcache命令:
存储命令:
set
/
add
/
replace
/
append
/
prepend
/
cas
获取命令: get
/
gets
其他命令: delete
/
stats..
 

Python操作Memcached

本质:通过socket链接。

安装API

python操作Memcached使用Python
-
memcached模块
下载安装:https:
/
/
pypi.python.org
/
pypi
/
python
-
memcached
python setup.py install
如果用pycharm的话直接安装python-memecached模块
第一次操作
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True)mc.set("foo", "bar")ret = mc.get('foo')print ret

2、天生支持集群

python-memcached模块原生支持集群操作,其原理是在内存维护一个主机列表,且集群中主机的权重值和主机在列表中重复出现的次数成正比

主机    权重

    
1.1
.
1.1  
1
    
1.1
.
1.2  
2
    
1.1
.
1.3  
1
 
那么在内存中主机列表为:
    
host_list
=
[
"1.1.1.1"
,
"1.1.1.2"
,
"1.1.1.2"
,
"1.1.1.3"
, ]
 

如果用户根据如果要在内存中创建一个键值对(如:k1 = "v1"),那么要执行一下步骤:

  • 根据算法将 k1 转换成一个数字
  • 将数字和主机列表长度求余数,得到一个值 N( 0 <= N < 列表长度 )
  • 在主机列表中根据 第2步得到的值为索引获取主机,例如:host_list[N]
  • 连接 将第3步中获取的主机,将 k1 = "v1" 放置在该服务器的内存中

代码实现如下:

mc = memcache.Client([('1.1.1.1:12000', 1), ('1.1.1.2:12000', 2), ('1.1.1.3:12000', 1)], debug=True) mc.set('k1', 'v1')

add

添加一条键值对,如果已经存在的 key,重复执行add操作异常

import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
mc.add(
'k1'
,
'v1'
)
# mc.add('k1', 'v2') # 报错,对已经存在的key重复添加,失败!!!
 
replace
replace  修改某个key的值,如果key不存在,则异常
import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
# 如果memcache中存在kkkk,则替换成功,否则一场
mc.replace(
'kkkk'
,
'999'
)
 
set 和 set_multi
import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
 
mc.
set
(
'key0'
,
'wupeiqi'
)
 
mc.set_multi({
'key1'
:
'val1'
,
'key2'
:
'val2'
})
 
delete 和 delete_multi

delete             在Memcached中删除指定的一个键值对

delete_multi    在Memcached中删除指定的多个键值对

import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
 
mc.delete(
'key0'
)
mc.delete_multi([
'key1'
,
'key2'
])
 
get 和 get_multi

get            获取一个键值对

get_multi   获取多一个键值对

import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
 
val
=
mc.get(
'key0'
)
item_dict
=
mc.get_multi([
"key1"
,
"key2"
,
"key3"
])
 
append 和 prepend

append    修改指定key的值,在该值 后面 追加内容

prepend   修改指定key的值,在该值 前面 插入内容

import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
# k1 = "v1"
 
mc.append(
'k1'
,
'after'
)
# k1 = "v1after"
 
mc.prepend(
'k1'
,
'before'
)
# k1 = "beforev1after"
 
decr 和 incr  

incr  自增,将Memcached中的某一个值增加 N ( N默认为1 )

decr 自减,将Memcached中的某一个值减少 N ( N默认为1 )

import
memcache
 
mc
=
memcache.Client([
'10.211.55.4:12000'
], debug
=
True
)
mc.
set
(
'k1'
,
'777'
)
 
mc.incr(
'k1'
)
# k1 = 778
 
mc.incr(
'k1'
,
10
)
# k1 = 788
 
mc.decr(
'k1'
)
# k1 = 787
 
mc.decr(
'k1'
,
10
)
# k1 = 777
 
gets 和 cas

如商城商品剩余个数,假设改值保存在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 memcachemc = memcache.Client(['192.168.12.78:12000'],debug=True,cache_cas=True)v= mc.gets('liwenqiang')mc.cas('liwenqiang','899')
import memcacheimport timemc = memcache.Client(['192.168.12.78:12000'],debug=True,cache_cas=True)v = mc.gets('liwenqiang')time.sleep(120)mc.cas('liwenqiang',899)

通过get获取,如果中间在有人写过,你在通过cas写的话就会失败。

会报错:

本质上每次执行gets时,会从memcache中获取一个自增的数字,通过cas去修改gets的值时,会携带之前获取的自增值和memcache中的自增值进行比较,如果相等,则可以提交,如果不相等,那表示在gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改。

实例中:购物商城订单

转载于:https://www.cnblogs.com/l-w-q/p/6265466.html

你可能感兴趣的文章
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>
http://yusi123.com/
查看>>
文件文本的操作
查看>>
Ubuntu linux下gcc版本切换
查看>>
记一次Web服务的性能调优
查看>>
jQuery.form.js使用
查看>>
(转)linux sort,uniq,cut,wc命令详解
查看>>
关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)
查看>>
UVa540 Team Queue(队列queue)
查看>>
mysql数据增删改查
查看>>
shell中下载最新版本或指定版本的办法(Dockerfile 中通用)
查看>>
极客时间-左耳听风-程序员攻略-分布式架构工程设计
查看>>
akka之种子节点
查看>>
不知道做什么时
查看>>
matlab 给某一列乘上一个系数
查看>>
密码学笔记——培根密码
查看>>
Screening technology proved cost effective deal
查看>>
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>