通达oa httpss://rmoa.cib.co...

This page is also available in: ,
Syria: Peace is possible
How is your hunger
Hurricane Matthew in Haiti ‘catastrophic’
Our mission
Towards a civilization of love
Caritas Internationalis reflects the social mission and core values of the Catholic Church. We believe in dignity, solidarity and stewardship on behalf of the world’s most vulnerable people
Support Caritas
Your contribution makes a difference
Giving to Caritas Internationalis allows us to strengthen the global confederation of over 160 national Catholic charities. We serve all poor people, of all faiths, all over the world.
Latin America & Caribbean
Caritas at work in your region.
The Caritas Latin America and Caribbean region covers a vast geographical area with great cultural and economic diversity. Region members focus on peace, social and economic justice and safe migration.
Join our fight for the world’s poor
Stay up-to-date on our good work around the world and be the first to hear about how to help in an emergency.
Caritas updates from around the world
22 November 2016Following COP22, Caritas urges more action and clarification on key issues over the next two years to ensure the Paris Agreement really delivers for the poor.
17 November 2016Pope Francis asked Caritas to have a prophetic courage "in rejecting everything that demeans human beings and to be “peacemakers and reconcilers between peoples, communities and believers.”
17 November 2016Pope Francis has taken the issue of migrants to his heart, especially child migrants. Caritas Internationalis (CI) joins the Pope asking for durable solutions to protect migrant children.
Our causes
Support Caritaspython操作memcached以及分布式的例子-python-Php教程-壹聚教程网python操作memcached以及分布式的例子
下面我们来看一篇关于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 不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
下面假设 memcached 服务器有 node1~node3 三台,应用程序要保存键名为&tokyo&、&kanagawa&、&chiba&、&saitama&、&gunma&的数据。
首先向 memcached 中添加&tokyo&。将&tokyo&传给客户端程序库后,客户端实现的算法就会根据&键&来决定保存数据的 memcached 服务器。服务器选定后,即命令它保存&tokyo&及其值。接下来获取保存的数据。
获取时也要将要获取的键&tokyo&传递给函数库。函数库通过与数据保存时相同的算法,根据&键&选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送 get 命令。只要数据没有因为某些原因被删除,就能获得保存的值。
这样,将不同的键保存到不同的服务器上,就实现了 memcached 的分布式。
memcached 服务器增多后,键就会分散,即使一台 memcached 服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。
部署 Memcached
yum install libevent-devel
&安装libevent
&安装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
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')
&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')
添加一条键值对,如果已经存在的 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(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改
上一页:没有了 &&&&&下一页:相关内容}

我要回帖

更多关于 https oa.hdbp.com 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信