本文打印版文档下载地址
【山外笔记-数据库】Memcached详解教程-打印版.pdf
一、Memcached数据库概述
1、Memcached简介
(1)Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表来存储各种格式的数据。
(2)Memcached本质上是一个基于内存的key-value存储系统,用来存储小块的任意数据(字符串、对象)。
(3)Memcached的守护进程(daemon )用C语言编写,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
(4)Memcached是以守护程序(监听)方式运行于一个或者多个服务器中,随时会接受客户端的连接和操作。
(5)Memcached客户端有各种语言的版本,包括java,c,php,.net等等。
(6)Memcached通过在内存中缓存数据和对象来减少读取数据库的次数,提高动态、数据库驱动网站的速度,减轻数据库负载。
(7)Memcached的API兼容大部分流行的开发语言,其中包括Perl、PHP、Python、RubyC#、C/C++、Lua等。
2、Memcached的特点
(1)协议简单
(2)基于libevent的事件处理
libevent是一个将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一接口的程序库。
(3)内置内存存储方式
-
memcached中保存的数据都存储在memcached内置的内存存储空间中。
-
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。
-
内存容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
-
memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
(4)分布式memcached互不通信
-
memcached尽管是分布式缓存服务器,但服务器端并没有分布式功能。
-
各个memcached不会互相通信以共享信息。
3、Memcached的工作原理:缓存式的Web应用程序架构
(1)在传统的app层和db层之间加入cache层, 每个app服务器都可以绑定一个mc(memcached)。
(2)每次数据的读取都可以从ms(内置分配内存的组件)中取得,如果没有,再从db层读取。
(3)当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用)+ 到期失效策略,失效数据首先被替换,然后再替换到最近未使用的数据。。
(4)当数据要进行更新时,除了要发送update的 sql给db层,同时也要将更新的数据发给,让mc去更新ms中的数据。
4、Memcached的安装
(1)Linux Memcached安装
-
Ubuntu/Debian在线安装
sudo apt-get install libevent ibevent-dev sudo apt-get install memcached
-
Redhat/Fedora/Centos在线安装
yum install libevent libevent-devel yum install memcached
-
源代码安装
wget http://memcached.org/latest 下载最新版本 tar -zxvf memcached-1.x.x.tar.gz 解压源码 cd memcached-1.x.x 进入目录 ./configure --prefix=/usr/local/memcached 配置 make && make test 编译 sudo make install 安装
(2)Windows Memcached安装
在 1.4.5 版本以前 Memcached可以作为一个服务安装,而在 1.4.5 及之后的版本删除了该功能。因此需要采用不同的安装方式。
Memcached安装包下载地址:https://github.com/memcached/memcached/releases
-
Memcached 1.4.5 以前的版本
-
解压下载的安装包到指定目录。
-
memcached 可以作为一个服务安装,cmd窗口执行
c:memcachedmemcached.exe -d install
-
启动和关闭 memcached 服务
c:memcachedmemcached.exe -d start c:memcachedmemcached.exe -d stop
-
修改 memcached 的缓存配置项
c:memcachedmemcached.exe -d runservice -m 512
-
查看memcached 的的帮助信息
c:memcachedmemcached.exe -h
-
卸载memcached
c:memcachedmemcached.exe -d uninstall
-
Memcached 1.4.5 以后的版本
-
解压下载的安装包到指定目录。
-
memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,设置开机自动启动。
schtasks /create /sc onstart /tn memcached /tr "'c:memcachedmemcached.exe' -m 512"
-
删除 memcached 的任务计划
schtasks /delete /tn memcached
-
5、Memcached的运行
(1)Linux自动安装 memcached 命令位于 /usr/local/bin/memcached。
(2)查看Memcached命令的帮助:memcached -h
- -d选项:启动一个守护进程;
- -m选项:分配给Memcached使用的内存数量,单位是MB;
- -u选项:运行Memcached的用户;
- -l选项:监听的服务器IP地址,可以有多个地址;
- -p选项:设置Memcached监听的端口,最好是1024以上的端口;
- -c选项:最大运行的并发连接数,默认是1024;
- -P选项:设置保存Memcached的pid文件。
(3)启动Memcached服务
memcached -d -m 64M -u root -l 192.168.0.120 -p 11211 -c 256 -P /tmp/memcached.pid
(4)关闭Memcached服务
ps -ef|grep memcached
kill -9 memcached_pid
6、Memcached的连接
(1)通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。
(2)语法:telnet HOST PORT
二、Memcached 存储命令
1、Memcached set 命令
(1)Memcached set 命令:用于将 value(数据值) 存储在指定的 key(键) 中。
(2)如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
(3)set 命令的基本语法格式:
set key flags exptime bytes [noreply]
value
(4)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
(4)输出信息:
- STORED:保存成功后输出。
- ERROR:在保存失败后输出。
2、Memcached add 命令
(1)Memcached add 命令:用于将 value(数据值) 存储在指定的 key(键) 中。
(2)如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持不变,并且获得响应 NOT_STORED。
(3)add 命令的基本语法格式:
add key flags exptime bytes [noreply]
value
(4)参数说明和输出信息同set命令。
3、Memcached replace 命令
(1)Memcached replace 命令:用于替换已存在的 key(键) 的 value(数据值)。
(2)如果 key 不存在,则替换失败,并且获得响应 NOT_STORED。
(3)replace 命令的基本语法格式:
replace key flags exptime bytes [noreply]
value
(4)参数说明和输出信息同set命令。
(5) set 、add 、replace 三个命令的区别
-
add命令:用于向 memcache 服务器添加一个要缓存的数据,如果 key 存在则返回 false。
-
replace命令:用于向 memcache 服务器替换一个指定 key 的缓存内容,如果 key 不存在则返回 false。
-
set 命令:用于设置一个指定 key 的缓存内容,是 add 方法和 replace 方法的集合体。
4、Memcached append 命令
(1)Memcached append 命令:用于向已存在 key(键) 的 value(数据值) 后面追加数据(字符串相加) 。
(2)append 命令的基本语法格式:
append key flags exptime bytes [noreply]
value
(3)参数说明同set命令。
(4)输出信息
- STORED:保存成功后输出。
- NOT_STORED:该键在 Memcached 上不存在。
- CLIENT_ERROR:执行错误。
5、Memcached prepend 命令
(1)Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
(2)prepend 命令的基本语法格式:
prepend key flags exptime bytes [noreply]
value
(3)参数说明同set命令。
(4)输出信息同append命令。
6、Memcached CAS 命令
(1)Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令:用于执行一个"检查并设置"的操作。
-
Memcached CAS命令仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
-
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
-
使用 CAS 命令,需要从 Memcached 服务商通过 gets 命令获取令牌(token)。
(2)CAS 命令的基本语法格式:
cas key flags exptime bytes unique_cas_token [noreply]
value
(3)参数说明:
- unique_cas_token选项:通过 gets 命令获取的一个唯一的64位值。
- 其他参数说明同set命令。
(4)输出信息:
- STORED:保存成功后输出。
- ERROR:保存出错或语法错误。
- EXISTS:在最后一次取值后另外一个用户也在更新该数据。
- NOT_FOUND:Memcached 服务上不存在该键值。
三、Memcached查找命令
1、Memcached get 命令
(1)Memcached get 命令:获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
(2)get 命令的基本语法格式如下:
get key
get key1 key2 key3 #多个 key 使用空格隔开
(3)参数key:键值 key-value 结构中的 key,用于查找缓存值。
2、Memcached gets 命令
(1)Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。
(2)gets 命令的基本语法格式如下:
gets key
gets key1 key2 key3 #多个 key 使用空格隔开
3、Memcached delete 命令
(1)Memcached delete 命令:用于删除已存在的 key(键)。
(2)delete 命令的基本语法格式:delete key [noreply]
(3)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- noreply(可选): 该参数告知服务器不需要返回数据
(4)输出信息说明:
- DELETED:删除成功。
- ERROR:语法错误或删除失败。
- NOT_FOUND:key 不存在。
4、Memcached incr 命令
(1)Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增操作。
-
incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。
-
如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。
(2)incr 命令的基本语法格式:incr key increment_value
(3)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- increment_value: 增加的数值。
(4)输出信息说明:
- NOT_FOUND:key 不存在。
- CLIENT_ERROR:自增值不是对象。
- ERROR其他错误,如语法错误等。
5、Memcached decr 命令
(1)Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自减操作。
-
decr 命令操作的数据必须是十进制的32位无符号整数。
-
如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。
(2)decr 命令的基本语法格式:decr key decrement_value
(3)参数说明:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- decrement_value: 减少的数值。
(4)输出信息说明:
- NOT_FOUND:key 不存在。
- CLIENT_ERROR:自增值不是对象。
- ERROR其他错误,如语法错误等。
四、Memcached 统计命令
1、Memcached stats 命令
(1)Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。
(2)stats 命令的基本语法格式:stats
stats
STAT pid 1162
STAT uptime 5022
STAT time 1415208270
STAT version 1.4.14
STAT libevent 2.0.19-stable
STAT pointer_size 64
STAT rusage_user 0.096006
STAT rusage_system 0.152009
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 6
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 4
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1
STAT incr_misses 2
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 262
STAT bytes_written 313
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 1
STAT evicted_unfetched 0
STAT bytes 142
STAT curr_items 2
STAT total_items 6
STAT evictions 0
STAT reclaimed 1
END
(3)状态项说明:
- pid: memcache服务器进程ID
- uptime:服务器已运行秒数
- time:服务器当前Unix时间戳
- version:memcache版本
- pointer_size:操作系统指针大小
- rusage_user:进程累计用户时间
- rusage_system:进程累计系统时间
- curr_connections:当前连接数量
- total_connections:Memcached运行以来连接总数
- connection_structures:Memcached分配的连接结构数量
- cmd_get:get命令请求次数
- cmd_set:set命令请求次数
- cmd_flush:flush命令请求次数
- get_hits:get命令命中次数
- get_misses:get命令未命中次数
- delete_misses:delete命令未命中次数
- delete_hits:delete命令命中次数
- incr_misses:incr命令未命中次数
- incr_hits:incr命令命中次数
- decr_misses:decr命令未命中次数
- decr_hits:decr命令命中次数
- cas_misses:cas命令未命中次数
- cas_hits:cas命令命中次数
- cas_badval:使用擦拭次数
- auth_cmds:认证命令处理的次数
- auth_errors:认证失败数目
- bytes_read:读取总字节数
- bytes_written:发送总字节数
- limit_maxbytes:分配的内存总大小(字节)
- accepting_conns:服务器是否达到过最大连接(0/1)
- listen_disabled_num:失效的监听数
- threads:当前线程数
- conn_yields:连接操作主动放弃数目
- bytes:当前存储占用的字节数
- curr_items:当前存储的数据总数
- total_items:启动以来存储的数据总数
- evictions:LRU释放的对象数目
- reclaimed:已过期的数据条目来存储新数据的数目
2、Memcached stats items 命令
(1)Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
(2)stats items 命令的基本语法格式:stats items
3、Memcached stats slabs 命令
(1)Memcached stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。
(2)stats slabs 命令的基本语法格式:stats slabs
4、Memcached stats sizes 命令
(1)Memcached stats sizes 命令:用于显示所有item的大小和个数。
(2)该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。
(3)stats sizes 命令的基本语法格式:stats sizes
5、Memcached flush_all 命令
(1)Memcached flush_all 命令:用于清理缓存中的所有 key=>value(键=>值) 对。
(2)Memcached flush_all 命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
(3)flush_all 命令的基本语法格式:flush_all [time] [noreply]
五、Memcached 应用
1、Java 连接 Memcached 服务
使用 Java 程序连接 Memcached,需要在 classpath 中添加 Memcached jar 包。
本站 jar 包下载地址:spymemcached-2.10.3.jar。
以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。
import net.spy.memcached.MemcachedClient;
import java.net.*;
public class MemcachedJava {
public static void main(String[] args) {
try{
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful."); // 本地连接 Memcached 服务
Future fo = mcc.set("mentest", 900, "Free Education"); // 存储数据
System.out.println("set status:" + fo.get()); // 查看存储状态
System.out.println("mentest value in cache - " + mcc.get("mentest"));
fo = mcc.add("mentest", 900, "memcached"); // 添加
System.out.println("add status:" + fo.get()); // 打印状态
fo = mcc.add("codingground", 900, "All Free Compilers"); // 添加新key
System.out.println("add status:" + fo.get()); // 打印状态
System.out.println("codingground value in cache - " + mcc.get("codingground"));
fo = mcc.replace("mentest", 900, "Tutorials' Library"); // 添加新的 key
System.out.println("replace status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("mentest"));
fo = mcc.append("mentest", 900, " for All"); // 对存在的key进行数据添加操作
System.out.println("append status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("codingground"));
fo = mcc.prepend("mentest", 900, "Free "); // 对存在的key进行数据添加操作
System.out.println("prepend status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("codingground"));
CASValue casValue = mcc.gets("mentest"); // 通过 gets 方法获取 CAS token(令牌)
System.out.println("CAS token - " + casValue); // 输出 CAS token(令牌) 值
CASResponse casresp = mcc.cas("mentest", casValue.getCas(), 900, "Tutorials-Library");
System.out.println("CAS Response - " + casresp); // 输出 CAS 响应信息
System.out.println("mentest value in cache - " + mcc.get("mentest"));
fo = mcc.delete("mentest"); // 对存在的key进行数据添加操作
System.out.println("delete status:" + fo.get()); // 打印状态
System.out.println("mentest value in cache - " + mcc.get("codingground"));
System.out.println("value in cache after increment - " + mcc.incr("number", 111));
System.out.println("value in cache after decrement - " + mcc.decr("number", 112));
mcc.shutdown(); // 关闭连接
}catch(Exception ex){
System.out.println( ex.getMessage() );
}
}
}
(1)连接操作:程序中使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。
(2)set 操作:mcc.set("mentest", 900, "Free Education")
(3)add 操作:mcc.add("mentest", 900, "memcached")
(4)replace 操作:mcc.replace("mentest", 900, "Tutorials' Library")
(5)append 操作:append("mentest", 900, " for All")
(6)prepend 操作:mcc.prepend("mentest", 900, "Free ")
(7)CAS 操作:mcc.cas("mentest", casValue.getCas(), 900, "Tutorials-Library")
(8)get 操作:mcc.get("mentest")
(9)gets 操作:mcc.gets("mentest")
(10)delete 操作:mcc.delete("mentest")
(11)Incr/Decr 操作:mcc.incr("number", 111)
、mcc.decr("number", 112)
2、PHP 连接 Memcached 服务
(1)PHP Memcache 扩展安装
-
离线安装
wget http://pecl.php.net/get/memcache-2.2.7.tgz tar -zxvf memcache-2.2.7.tgz cd memcache-2.2.7 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
-
在线安装
yum install -y php-memcached systemctl start httpd //开启apache systemctl start memcached //开启memcached setenforce 0
(2)检查安装结果:/usr/local/php/bin/php -m | grep memcache
(3) Memcache类
- Memcache::add:增加一个条目到缓存服务器
- Memcache::addServer:向连接池中添加一个memcache服务器
- Memcache::close:关闭memcache连接
- Memcache::connect :打开一个memcached服务端连接
- Memcache::decrement :减小元素的值
- Memcache::delete :从服务端删除一个元素
- Memcache::flush :清洗(删除)已经存储的所有的元素
- Memcache::get :从服务端检回一个元素
- Memcache::getExtendedStats :缓存服务器池中所有服务器统计信息
- Memcache::getServerStatus :用于获取一个服务器的在线/离线状态
- Memcache::getStats :获取服务器统计信息
- Memcache::getVersion :返回服务器版本信息
- Memcache::increment:增加一个元素的值
- Memcache::pconnect:打开一个到服务器的持久化连接
- Memcache::replace :替换已经存在的元素的值
- Memcache::set :Store data at the server
- Memcache::setCompressThreshold :开启大值自动压缩
- Memcache::setServerParams :运行时修改服务器参数和状态
(4)Memcache 函数:
- memcache_debug:转换调试输出的开/关