Memcached是一个高性能的分布式内存对象缓存系统,用于Web应用以减轻数据库的负载。

它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

Memcached基于一个存储键/值对的hashmap。

其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

1.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文件

Memcached命令:

 存储命令: set/add/replace/append/prepend/cas
获取命令: get/gets
其他命令: delete/stats..

2.Python操作Memcached

安装API:

 python操作Memcached使用Python-memcached模块
下载安装:https://pypi.python.org/pypi/python-memcached

简单操作:

 import memcache

 mc = memcache.Client(['10.211.55.4:12000'], debug=True)
mc.set("foo", "bar")
ret = mc.get('foo')
print ret

Ps:debug = True 表示运行出现错误时,实现错误信息,上线后移除该参数。

天生支持集群:

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')

3.基本操作

(1)add

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

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True)
mc.add('k1', 'v1')
# mc.add('k1', 'v2') # 报错,对已经存在的key重复添加,失败!!!

(2)replace

修改某个key的值,如果key不存在,则异常

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True)
# 如果memcache中存在kkkk,则替换成功,否则一场
mc.replace('kkkk','')

(3)set和set_multi

set:设置一个键值对,如果key不存在,则创建,如果key存在,则修改

set_multi:设置多个键值对,如果key不存在,则创建,如果key存在,则修改

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True) mc.set('key0', 'wupeiqi') mc.set_multi({'key1': 'val1', 'key2': 'val2'})

(4)delete和delete_multi

delete:删除一个键值对

delete_multi:删除多个键值对

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True) mc.delete('key0')
mc.delete_multi(['key1', 'key2'])

(5)get和get_multi

get:获取一个键值对

get_multi:获取多个键值对

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True) val = mc.get('key0')
item_dict = mc.get_multi(["key1", "key2", "key3"])

(6)append和prepend

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

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

(7)decr和incr

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

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

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True)
mc.set('k1', '') mc.incr('k1')
# k1 = 778 mc.incr('k1', 10)
# k1 = 788 mc.decr('k1')
# k1 = 787 mc.decr('k1', 10)
# k1 = 777

(8)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 即可,如:

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
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', "")

Ps:本质上每次执行gets时,会从memcache中获取一个自增的数字,通过cas去修改gets的值时,

会携带之前获取的自增值和memcache中的自增值进行比较,如果相等,则可以提交,

如果不相等,那表示在gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改。

Python操作——Memcached的更多相关文章

  1. python操作memcached以及分布式

    memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件.现在已成为 mixi.Facebook.Live ...

  2. Python操作memcached及redis

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  3. Python之路第十一天,高级(3)-Python操作 Memcached、Redis

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  4. python操作----Memcached

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  5. python 操作Memcached

    启动Memcached memcached -d -m 10 -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid 参数说明: -d ...

  6. Python操作Memcached

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  7. Python自动化开发 - Python操作Memcached、Redis、RabbitMQ

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...

  8. Python操作Memcached使用Python-memcached模块

    安装Python的memcached驱动模块 pip install python-memcached 简单的操作示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/ ...

  9. 使用Python操作Memcached

    1.安装 yum install memcached easy_install python-memcached 2.操作memcached import memcache mc = memcache ...

随机推荐

  1. Nginx编译安装第三方模块http_substitutions_filter_module

    Nginx编译安装第三方模块http_substitutions_filter_module 分类:服务器技术  作者:rming  时间:-- . >>ngx_http_substitu ...

  2. 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

    [视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...

  3. hMailServer 附件大小限制

    修改php.ini文件 1.post_max_size = 10M 表单提交最大数据为10M.此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的. 2.file_uploads = ...

  4. C#中基本类型占用字节数

    bool -> System.Boolean (布尔型,其值为 true 或者 false) byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ...

  5. spring过滤器和拦截器的区别和联系

    一 简介 (1)过滤器: 依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.在实现上基于函数回调,可 ...

  6. 基于AFNetworking封装的网络请求工具类【原创】

    今天给大家共享一个我自己封装的网络请求类,希望能帮助到大家. 前提,导入AFNetworking框架, 关于修改AFN源码:通常序列化时做对text/plan等的支持时,可以一劳永逸的修改源代码,在a ...

  7. hadoop_百科

    一.发音是:[hædu:p]. 二.简介:Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储 ...

  8. 更改系统环境设置,让alias永远生效

        alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入.如果经常与 CLI 打交道,那么使用 alias 不仅会节省时间,而且 ...

  9. EXCEL VBA代码,实现点击Sheet1按钮控件保存不连续单元格的数据到Sheet2中,然后清空输入内容

    Private Sub SaveAndClear() Dim Header, Deatil, Order As Range Dim lastrow1, lastrow2 As Long Dim i A ...

  10. Spring MVC列表多选框

    以下示例显示如何在使用Spring Web MVC框架的表单中使用列表框(Listbox).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己所善长的技术(多选)的功能.并按 ...