python访问memcached
2019独角兽企业重金招聘Python工程师标准>>>
python访问memcached
memcached介绍
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcached在实现分布式群集部署时,memcached服务之间是不能进行通讯的,分布式也是通过客户端的算法把数据保存在不同的memcached中。magent是一款开源的代理服务软件,我们可以通过它来实现缓存数据的同步。magent还可以使用keepalived来实现高可用。
memcached安装
安装
在linux下安装
安装libevent
Libevent 是一个异步事件处理软件函式库,以 BSD 许可证释出。Memcached 依赖 Libevent,因此必须先安装 Libevent。1
yum install libevent-devel
安装memcached
1 2 3 4 5 6
cd /usr/local/src wget http://memcached.org/latest tar zxf memcached-1.5.7.tar.gz mv memcached-1.5.7 memcached cd memcached/ ./configure && make && make install
启动
1 |
memcached -d -u root |
启动参数说明
memcached -d -m 10 -u root -l 127.0.0.1 -p 12000 -c 256 -P /tmp/memcache/logs/memcache.pid
-p 指定端口号(默认11211)
-m 指定最大使用内存大小(默认64MB)
-t 线程数(默认4)
-l 连接的IP地址, 默认是本机
-d 以后台守护进程的方式启动
-c 最大同时连接数,默认是1024
-P 制定memecache的pid文件
-h 打印帮助信息
启动确认
1 2 3 4 5 6 |
[root@VM_0_4_centos memcached]# ps aux|grep memcache root 24421 0.0 0.0 413792 1080 ? Ssl 07:45 0:00 memcached -d -u root root 24436 0.0 0.0 112644 964 pts/0 R+ 07:45 0:00 grep --color=auto memcache [root@VM_0_4_centos memcached]# netstat -lntp|grep memcached tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 24421/memcached tcp6 0 0 :::11211 :::* LISTEN 24421/memcached |
python访问memcached
python访问memcached需要安装python-memcached模块。
1 |
pip install python-memcached |
操作实例
1 2 3 4 5 |
import memcachemem = memcache.Client(["118.24.18.158:11211"]) mem.set("db", "oracle") print(mem.get("db")) #输出结果:oracle |
另外,python-memcached模块原生支持集群操作,其原理是在内存中维护一个主机列表,且集群中主机的权重值和主机在列表中重复出现的次数成正比。
1 2 3 4 |
主机IP 权重 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 = “value1”),那么要执行以下步骤:
根据算法将k1转换成一个数字
将数字和主机列表长度求余数,得到一个值N(0 <= N < 长度)
在主机列表中根据第二步得到的值为索引获取主机,例如: host_list[N]
连接将第三步中获取的主机,将k1 = “value1” 放置在该服务器的内存中
代码如下:
1 2 3 4 5 6 7 |
#!/usr/bin/env python3 #coding:utf8 import memcache mc = memcache.Client([('1.1.1.1:11211', 1), ('1.1.1.2:11211', 2),('1.1.1.3:11211',1)]) mc.set('k1','value1') ret = mc.get('k1') print (ret) |
memcached常用操作
- set(key, val)
在memcache中设置key的值为val。若key不存在则创建,否则修改。 - get(key)
获取memcache中key对应的值或者None
。 - set_multi(mapping)
一次设置多个key/value对。以列表方式传入。若key不存在则创建,否则修改。 get_multi(keys)
一次获取多个keys1 2 3 4
mem.set_multi({"db1": "oracle", "db2": "mysql"}) mem.set("db3", "memcache") print(mem.get("db1")) #输出结果:oracle print(mem.get_multi(["db2", "db3"])) #输出结果:{'db2': 'mysql', 'db3': 'memcache'}
add(key, val)
在memcache中添加新的键值对。若已存在则返回False。1 2 3
print(mem.add("db", "memcache")) #输出结果:True print(mem.get("db")) #输出结果:memcache print(mem.add("db", "memcache")) #输出结果:False
replace(key, val)
修改key的值为val,若不存在则返回False。1 2 3 4
mem.add("db", "memcache") print(mem.replace("db", "redis")) #输出结果:True print(mem.get("db")) #输出结果:redis print(mem.replace("db1", "redis")) #输出结果:False
delete(key)
删除一个指定的key/value对。delete_multi(keys)
删除多个指定的key/value对。1 2 3 4
mem.set_multi({"db1": "oracle", "db2": "mysql", "db3": "memcache"}) mem.delete("db1") mem.delete_multi(["db2", "db3"]) print(mem.get_multi(["db1", "db2", "db3"])) #输出结果:{}
append(key, val)
在指定key对应的value后面
追加内容。- prepend(key, val)
在指定key对应的额value前面
追加内容。 stats
查看历史操作1 2 3 4 5 6 7
mem.set("db", "oracle") print(mem.get("db")) #输出结果:oracle mem.append("db", " or mysql") print(mem.get("db")) #输出结果:oracle or mysql mem.prepend("db", "redis or ") print(mem.get("db")) #输出结果:redis or oracle or mysql print(mem.stats) #输出结果:{'set': 1, 'get': 3, 'append': 1, 'prepend': 1}
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 2 3 4 5
mem = memcache.Client(["118.24.18.158:11211"]) mem.set("count", "100") print(mem.get("count")) #输出结果:100 print(mem.cas("count", "99")) #输出结果:True print(mem.gets("count")) #输出结果:99
gets和cas一起使用,cas是check and set
操作。它仅当当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能够将值写入。
转载于:https://my.oschina.net/u/3803404/blog/1815846
python访问memcached相关推荐
- Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和?
Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和? 1. 效果图 2. 源码 参考 上一篇博客介绍了Python访问街区所有节点最短路径问题,并结合matplotlib可视化 ...
- Python访问街区所有节点最短路径问题,并结合matplotlib可视化
Python访问街区所有节点最短路径问题,并结合matplotlib可视化 1. 效果图 2. 源码 2.1 5个点全排列(递归+非递归算法) 2.2 python遍历全路径计算距离+matplot可 ...
- Nginx HttpMemcModule和直接访问memcached效率对比测试
测试环境: 测试客户机A: HP DL380G4,2个双核CPU,4G Ram,2块10k RPM SAS盘做raid 1,ext3 Nginx所在服务器B:DELL R710,E5620 * 2,3 ...
- Python操作Memcached
Memcached是一个高性能的分布式内存对象缓存系统,用于动态WEB应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态,数据库网站的速度.Memcached基于一 ...
- Python访问MySQL
Python高级 Python DB-API Python中用于访问关系型数据可的一个技术标准,通过它可以统一地访问所有主流数据库,代码几乎是完全一样的,DB-API定义了访问数据库必须的一些类(比如 ...
- 将python3.7降为3.5_python3.7降至3.5【python cookbook】python访问子字符串
访问子字符串最简单的的方式是使用切片 afiled=theline[3:8]但一次只能取一个子字符串 如果还要考虑字段的长度struct.unpack可能更合适 importstruct #得到一个5 ...
- python 访问 zookeeper
python 访问 zookeeper 1.安装: zookeeper python客户端依赖c客户端,所以要先安装c版本客户端 > wget -c http://apache.fayea.co ...
- python访问web网页_python访问web的利器:urllib2
使用Python访问网页主要有三种方式: urllib, urllib2, httplib urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session 1. 最简单的页 ...
- linux python连接oracle数据库_Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法...
本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL.Oracle.SQL Server数据库. 其中包括以下几个软件的安装及配置: ...
最新文章
- php对mongo操作问题
- 使用PHP+Redis实现延迟任务,实现自动取消订单功能
- linxu其他用户登录mysql_Linux系统的MySQL用户如何开启远程登录权限
- 细数那些不能直视的IE6BUG
- Acer 4750 安装黑苹果_黑苹果 Mac OS 10.14.5 Mojave 安装
- 基于linux嵌入式课程设计报告,嵌入式linux课程设计报告.doc
- setValuesForKeysWithDictionary崩溃
- 关于RAM,ROM,EEPROM,FLASH,DDR,CACHE
- pyhton分类时画混淆矩阵
- [1164]python用numpy计算均值,方差,标准差
- Tapdata 的 2.0 版 ,开源的 Live Data Platform 现已发布
- 如何运用计算机进行课堂教学,运用多媒体进行课堂教学的心得体会(精选6篇)...
- Web编程——新闻爬虫+网站搭建
- 索骥馆-美工设计之《配色设计原理》扫描版[PDF]
- Python输入圆的半径,计算圆的周长和面积
- 2021年化工自动化控制仪表考试试卷及化工自动化控制仪表模拟考试题库
- 微软拟建统一通信平台 实施大范围战略扩张
- 深圳考公务员计算机专业的试卷,2021年公务员考试计算机专业试卷综合试题含参考答案.docx...
- executing external native build for ndkBuild
- 关于网站微博和QQ第三方的登陆
热门文章
- javascript中文网学习
- Win10双系统设置默认启动系统的图文教程
- Android开发高手课笔记--如何打造高质量应用?
- LeetCode 4 两个排序数组的中位数
- 【Android View事件分发机制】关于拦截事件的注意点
- (018)java后台开发之语法输出流flush()方法
- (007) java后台开发之Scanner报错java.util.NoSuchElementException
- python输出n阶矩阵_python-递归计算矩阵(nxn)的行列式
- Windows Azure Cloud Service (4) Windows Azure 平台高可用性的实现
- 作业4(列表增加或者修改)