python aiompq集群_python操作memcached以及分布式

memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、Facebook、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。

许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该 memcached 大显身手了。memcached 是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。

memcached 作为高速运行的分布式缓存服务器,具有以下的特点:

• 协议简单

• 基于 libevent 的事件处理

• 内置内存存储方式

• memcached 不互相通信的分布式

协议简单

memcached 的服务器客户端通信并不使用复杂的 XML 等格式,而使用简单的基于文本行的协议。因此,通过 telnet 也能在 memcached 上保存数据、取得数据。

基于 libevent 的事件处理

libevent 是个程序库,它将 Linux 的 epoll、BSD 类操作系统的 kqueue 等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥 O(1)的性能。memcached 使用这个 libevent 库,因此能在 Linux、BSD、Solaris 等操作系统上发挥其高性能。

内置内存存储方式

为了提高性能,memcached 中保存的数据都存储在 memcached 内置的内存存储空间中。由于数据仅存在于内存中,因此重启 memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于 LRU(Least Recently Used)算法自动删除不使用的缓存。

memcached 本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间。

memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。

顾名思义,这是删除“最近最少使用”的记录的机制。因此,当 memcached 的内存空间不足时就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

memcached 不互相通信的分布式

memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个 memcached 不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。

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" />

分布式

下面假设 memcached 服务器有 node1~node3 三台,应用程序要保存键名为“tokyo”、“kanagawa”、“chiba”、“saitama”、“gunma”的数据。

首先向 memcached 中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的 memcached 服务器。服务器选定后,即命令它保存“tokyo”及其值。接下来获取保存的数据。

获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送 get 命令。只要数据没有因为某些原因被删除,就能获得保存的值。

这样,将不同的键保存到不同的服务器上,就实现了 memcached 的分布式。

memcached 服务器增多后,键就会分散,即使一台 memcached 服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

部署 Memcached

yum install libevent-devel

============================================================[root@localhost tmp]# tar xf libevent-2.0.15-stable.tar.gz

[root@localhost tmp]# cd libevent-2.0.15-stable

[root@localhost libevent-2.0.15-stable]# ./configure --prefix=/usr/local/libevent && make &&make install

[root@localhost tmp]#vim/etc/ld.so.conf.d/libevent.conf/usr/local/libevent/lib/[root@localhost memcached-1.4.10]# ldconfig -v

安装libevent

[root@localhost tmp]# tar xf memcached-1.4.5.tar.gz

[root@localhost tmp]# cd memcached-1.4.5[root@localhost memcached-1.4.5]# ./configure --prefix=/usr/local/memcache --with-libevent=/usr/local/libevent && make &&make install

[root@localhost memcached-1.4.5]# /usr/local/memcache/bin/memcached -h

安装memcached

开启memcached监听

[root...]# /usr/local/memcache/bin/memcached -p 11211 -l 192.168.122.10 -u root -m 64 -c 10 -vvv

参数说明:

-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..

python操作Memcached

安装API

python操作Memcached使用Python-memcached模块

下载安装:https://pypi.python.org/pypi/python-memcached

1、第一次操作

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 表示运行出现错误时,现实错误信息,上线后移除该参数。

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

3、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重复添加,失败!!!

4、replace

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

5、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'})

6、delete 和 delete_multi

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

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

#!/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'])

7、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"])

8、append 和 prepend

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

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

#!/usr/bin/env python

# -*- coding:utf-8 -*-

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"

9、decr 和 incr

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

decr 自减,将Memcached中的某一个值减少 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', '777')

mc.incr('k1')

# k1 = 778

mc.incr('k1', 10)

# k1 = 788

mc.decr('k1')

# k1 = 787

mc.decr('k1', 10)

# k1 = 777

10、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', "899")

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

Memcached 真的过时了吗?

以上就是python操作memcached以及分布式的全部内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值