python3之memcached
1、memcached介绍
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
memcached分布式缓存服务器的特点:协议简单、基于libevent的事件处理、内置内存存储方式、memcached不互相通信的分布式
2、Memcached安装和基本使用
Memcached 支持许多平台:Linux、FreeBSD、Solaris、Mac OS,也可以安装在Windows上。
linux系统安装memcached首先要安装Libevent库:
sudo apt-get install libevent libevent-deve 自动下载安装(Ubuntu/Debian) yum install libevent libevent-devel 自动下载安装(Redhat/Fedora/Centos)
安装memcached:
sudo apt-get install memcached #ubuntu/debian yum install memcached #redhat/fedora/centos portmaster databases/memcached #freeBSD
memcached命令的运行:
$ /usr/local/memcached/bin/memcached -h #获得帮助
如果使用自动安装memcached命令位于/usr/local/bin/memcached。
启动选项:
-p <num> TCP监听端口(default: 11211)
-U <num> UDP监听端口(default: 11211, 0 is off)
-s <file> UNIX套接字路径侦听
-a <mask> UNIX套接字的访问掩码,八进制(默认值:0700)
-l <addr> 侦听接口地址默认为所以地址可以指定主机加端口可以使用逗号分隔多个地址
-d 作为守护进程运行
-r 最大文件描述符
-u <username> 指定运行用户
-m <num> 最大内存(默认为64 MB)
-M 内存耗尽时返回错误而不删除项目
-c <num> 最大同时连接数默认为1024
-k 锁定所有分页内存
-v 显示错误或警告事件
-vv 相信错误
-vvv 详细错误信息及内部状态转换
-h 打印此帮助
-i 打印内存缓存和许可证
-P <file> 指定PID文件,只与-d选择一起使用
-f <factor> 块大小生长因子,默认值为1.25
-n <bytes> 为键值标志的最小空间,默认为48
-L 使用大内存页,增加的内存页大小可以减少TLB命中数提高性能
-D <char> 使用<char>作为密钥前缀和IDS之间的分隔符
-t <num> 使用的线程数,默认为4
-R 每个事件的最大请求数默认为20
-C 禁用CAS的使用
-b <num> 设置积压队列限制默认值1024
-B 绑定协议——ASCII、二进制或AUTO(默认)之一
-I 重写每个板页的大小。调整最大项目大小(默认值:1MB,MI:1K,MAX:128M)
-S 打开SASL认证
-o 逗号分隔的扩展或实验选项列表
[root@python bin]# memcached -d -m 1024 -u nobody -l 192.168.146.129 -p 11211 -c 2048 -P /tmp/memcached.pid [root@python bin]# netstat -lntup|grep 11211 tcp 0 0 192.168.146.129:11211 0.0.0.0:* LISTEN 42059/memcached udp 0 0 192.168.146.129:11211 0.0.0.0:* 42059/memcached
memcached存储命令:
set命令用于将value存储在指定的key键中,如果set的key已经存储,该命令可更新该key所对应的原来数据,实现更新的作用
set key flags exptime bytes [noreply]
key:键值key-value结构中的key,用于查找缓存值
flags:可以包括键值对的整理参数,客户机使用它存储关于键值对的额外信息
exptime:在缓存中保存键值对的时间长度,以秒为单位0表示永远
bytes:在存储中存储的字节数
noreply:该参数告知服务器不需要返回数据
value:存储的值
set www 0 0 9 panjiayua STORED get www VALUE www 0 9 panjiayua END
add 命令用于将 value(数据值) 存储在指定的 key(键) 中
add web 0 0 5 junai STORED
replace 命令用于替换已存在的 key(键) 的 value(数据值)
replace web 0 0 5 aijun STORED get web VALUE web 0 5 aijun END
append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据
append web 0 0 9 1314 STORED get web VALUE web 0 9 aijun1314
prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据
prepend web 0 0 2 im STORED get web VALUE web 0 11 imaijun1314 END
memcached查找命令:
get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空
gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空
delete 命令用于删除已存在的 key(键)
incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作
memcached统计命令:
stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等
stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)
stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats sizes 命令用于显示所有item的大小和个数;该信息返回两列,第一列是 item 的大小,第二列是 item 的个数
flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对;该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作
3、python操作memcached
import memcache #链接memcached服务器,指定IP和端口,debug表示显示错误信息 mc = memcache.Client(['192.168.146.129:11211'],debug=True) #设置键值对 mc.set('foo','pythonTomemcache') #查看键值 print(mc.get('foo'))
add:添加一个键值对,如果存在key,重复执行add则异常
mc.add('k1','v1')
replace: 修改某个key的值,如果key不存在,则异常
mc.replace('k2','v2')
set:设置一个键值对,如果key不存在,则创建,如果key存在则修改
mc.set('k3','v3')
set_multi:设置多个键值对,如果key不存在,则创建,如果key存在,则修改
mc.set_multi({'key1':'value1','key2':'value2'})
delete:在memcached中删除指定的一个键值对
mc.delete('key1')
delete_multi:在memcached中删除指定的多个键值对
mc.delete_multi(['key1','key2','key3'])
get:获取一个键值对
get_multi:获取多个键值对
mc.get('key3') mc.get_multi(['key1','key2'])
append:修改指定key的值,在该值后面追加内容
prepend:修改指定key的值,在该值前面插入内容
mc.append('k1','after') mc.prepend('k2','before')
incr:自增,将memcached中的某个值增加N(默认为1)
decr:自减,将memcached中的某分值减少N(默认为1)
mc.set('k1',10) mc.incr('k1',2) print(mc.get('k1')) mc.decr('k1',3) print(mc.get('k1'))
gets:gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空
cas:执行一个检查并设置的操作,它仅在当前客户端最后一次取值后,该Key对应的值没有被其他客户端修改的情况下, 才能够将值写入。
mc.cas('key5','999') print(mc.gets('key5'))
------------------------------------------------------------