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不互相通信的分布式
libevent官网:https://libevent.org/old-releases.html#2.0
#下载libevent
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
#编译安装
tar -xvf libevent-2.0.21-stable.tar.gz
cd ibevent-2.0.21-stable
./configure --prefix=/usr/local/libevent-2.0.21-stable --libdir=/usr/lib64
make
make install
#检查是否安装成功
ls -al /usr/local/libevent-2.0.21-stable/lib | grep libevent
#安装
yum install memcached
#查看帮助信息
memcached -h
-p <num> 监听的端口
-l <ip_addr> 连接的IP地址, 默认是本机
-d start 启动memcached 服务
-d restart 重起memcached 服务
-d stop|shutdown 关闭正在运行的memcached 服务
-d install 安装memcached 服务
-d uninstall 卸载memcached 服务
-u <username> 以<username>的身份运行 (仅在以root运行的时候有效)
-m <num> 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c <num> 最大同时连接数,默认是1024
-f <factor> 块大小增长因子,默认是1.25
-n <bytes> 最小分配空间,key+value+flags默认是48
-h 显示帮助
#启动memcached
memcached -d -m 1024 -u root -p 11211 -P /tmp/memcached.pid
yum install telnet
格式<command name> <key> <flags> <exptime> <bytes>
<command name>的值可以是set,add,replace,append,prepend。
<key>此处的值是mykey
<flags>是一个任意的16-bit的无符号number。我们这里给的值是0
<exptime>指定过期时间,0代表永远不会过期。如果非0,则当过了过期时间就无法获取它。
<bytes>存的值的长度。这里给的值是16,就是I Love Memcached的字符个数。
[root@localhost ~]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set mykey 0 300 16
I Love Memcached
STORED
get mykey
VALUE mykey 0 16
I Love Memcached
END
quit
Connection closed by foreign host.
[root@localhost ~]#
#安装
pip3 install python3-memcached
测试脚本
import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=0) print("\n") #添加值 #add添加一个键值对,如果存在key,重复执行add则异常 mc.add("key0", "value0") print('mc.add("key0", "value0")',"->",mc.get("key0")) mc.add("key0", "value00") print('mc.add("key0", "value0")',"->",mc.get("key0")) print("\n") #设置值 #set设置一个键值对,如果key不存在,则创建,如果key存在则修改 mc.set("key1", "value1") print('mc.set("key1", "value1")',"->",mc.get("key1")) print("\n") #设置多个值 #set_multi设置多个键值对,如果key不存在,则创建,如果key存在,则修改 mc.set_multi({'key11':'value11','key21':'value21'}) print("mc.set_multi({'key11':'value11','key21':'value21'})","->",mc.get("key11"),mc.get("key21")) print("\n") #获取多个键值对 print("mc.get_multi(['key11','key21'])","->",mc.get_multi(['key11','key21'])) print("\n") #修改 #append:修改指定key的值,在该值后面追加内容 #prepend:修改指定key的值,在该值前面插入内容 mc.append('key11','after') mc.prepend('key21','before') print("mc.append('key11','after')-mc.prepend('key21','before')","->",mc.get_multi(['key11','key21'])) print("\n") #删除多个值 #delete_multi在memcached中删除指定的多个键值对 mc.delete_multi(['key11','key21']) print("mc.delete_multi(['key11','key21'])","->",mc.get("key11"),mc.get("key21")) print("\n") #获取多个键值对 print("mc.get_multi(['key11','key21'])","->",mc.get_multi(['key11','key21'])) print("\n") #删除值 #delete在memcached中删除指定的一个键值对 mc.set("key2", 3) print('mc.set("key2", 3)',"->",mc.get("key2")) mc.delete("key2") print('mc.delete("key2")',"->",mc.get("key2")) print("\n") #增加减少值 #incr:自增,将memcached中的某个值增加N(默认为1)mc.incr('k1',2) #decr:自减,将memcached中的某分值减少N(默认为1)mc.decr('k1',3) mc.set("key3", "1") print('mc.set("key3", "1")') mc.incr("key3") print('mc.incr("key3")',"->",mc.get("key3")) mc.decr("key3") print('mc.decr("key3")',"->",mc.get("key3")) print("\n") #替换值 #replace修改某个key的值,如果key不存在,则异常 mc.set("key4", "1") print('mc.set("key4", "1")',"->",mc.get("key4")) mc.replace('key4','v4') print('mc.replace("key4","v4")',"->",mc.get("key4")) print("\n") #cas:执行一个检查并设置的操作,它仅在当前客户端最后一次取值后,该Key对应的值没有被其他客户端修改的情况下, 才能够将值写入。 mc.cas('key5','999') print("mc.cas('key5','999')","->",mc.get("key5")) print("\n") #gets:gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空 print("mc.gets('key5')",mc.gets('key5'))
输出
[root@localhost ~]# python3 test_mem.py mc.add("key0", "value0") -> value0 mc.add("key0", "value0") -> value0 mc.set("key1", "value1") -> value1 mc.set_multi({'key11':'value11','key21':'value21'}) -> value11 value21 mc.get_multi(['key11','key21']) -> {'key11': 'value11', 'key21': 'value21'} mc.append('key11','after')-mc.prepend('key21','before') -> {'key11': 'value11after', 'key21': 'beforevalue21'} mc.delete_multi(['key11','key21']) -> None None mc.get_multi(['key11','key21']) -> {} mc.set("key2", 3) -> 3 mc.delete("key2") -> None mc.set("key3", "1") mc.incr("key3") -> 2 mc.decr("key3") -> 1 mc.set("key4", "1") -> 1 mc.replace("key4","v4") -> v4 mc.cas('key5','999') -> 999 mc.gets('key5') 999 [root@localhost ~]#