1、张振华张振华.Jack.JackQQ:494460705QQ:494460705Mail:Mail:20152015年年7 7月月1010年年JavaJava开发,开发,3 3年年AppApp开发开发1自我介绍自我介绍Memcached入门到精通I.I.MemcachedMemcached介绍、应用场景、运行机制介绍、应用场景、运行机制II.II.MemcachedMemcached安装安装III.III.MemcachedMemcached启动,参数启动,参数IV.IV.MemcachedMemcached连接、监控连接、监控V.V.MemcachedMemcached客户端命令客户端命令V
2、I.VI.MemcachedMemcached的的JavaJava客户端实例客户端实例VII.VII.MemcachedMemcached的客户端分布式原理的客户端分布式原理VIII.VIII.MemcachedMemcached的服务器端运行原理的服务器端运行原理IX.IX.MemcachedMemcached的过期机制的过期机制X.X.MemcachedMemcached同比同比XI.XI.QAQA2目录目录张振华.Jack介绍介绍MemcachedMemcached是国外社区网站是国外社区网站 LiveJournalLiveJournal 的开发团队开的开发团队开发的高性能的分布式内存缓
3、存服务器。一般的使用目的是发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提,通过缓存数据库查询结果,减少数据库访问次数,以提高动态高动态WebWeb应用的速度、提高可扩展性。应用的速度、提高可扩展性。memcachememcache是一个自由和开放源代码、高性能、分布式的是一个自由和开放源代码、高性能、分布式的内存对象缓存系统。用于加速动态内存对象缓存系统。用于加速动态webweb应用程序,减轻数应用程序,减轻数据库负载。据库负载。MemcachedMemcached运行图运行图MemcachedMemcached运行图运行图Meacache
4、dMeacached特征特征I.I.MemcachedMemcached特征特征1.1.基于基于C/SC/S架构,协议简单架构,协议简单;2.2.基于基于libeventlibevent的事件处理的事件处理;3.3.内置内存存储方式内置内存存储方式;4.4.基于客户端的基于客户端的memcachedmemcached分布式。分布式。II.II.适用场景适用场景1.1.需要分布式部署的;需要分布式部署的;2.2.需要频繁访问相同数据的;需要频繁访问相同数据的;3.3.需要数据共享的。需要数据共享的。介绍介绍C/SC/S架构架构I.I.基于基于C/SC/S架构,协议简单架构,协议简单1.1.服务端
5、启动服务端启动memcachedmemcached进程;进程;2.2.客户端可以通过客户端可以通过telnettelnet操作,也可以通过各种编程语言实现的客户端程序存取数据操作,也可以通过各种编程语言实现的客户端程序存取数据及查询状态;及查询状态;3.3.memcachedmemcached的服务器与客户端通信并不使用复杂的的服务器与客户端通信并不使用复杂的XMLXML等格式,而使用简单的等格式,而使用简单的基于文本行的协议基于文本行的协议II.II.基于基于libeventlibevent的事件处理的事件处理1.1.libeventlibevent是一套跨平台的事件处理接口的封装,能够兼容
6、包括这些操作系统:是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris Windows/Linux/BSD/Solaris 等操作系统的的事件处理;等操作系统的的事件处理;2.2.包装的接口包括:包装的接口包括:pollpoll、select(Windows)select(Windows)、epollepoll(Linux)(Linux)、kqueuekqueue(BSD)(BSD)、/dev/pool(Solaris)/dev/pool(Solaris);3.3.MemcachedMemcached 使用使用libeventlibev
7、ent来进行网络并发连接的处理,能够保持在很大并发情来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。况下,仍旧能够保持快速的响应能力。张振华.Jack7安装安装张振华.Jack8安装安装到http:/www.monkey.org/provos/libevent/下载一个最新版的libevent即可,解压,安装即可。张振华.Jack9MEMCACHEDMEMCACHED启动启动这算启动成功张振华.Jack10MEMCACHEDMEMCACHED启动成功启动成功张振华.Jack11MEMCACHEDMEMCACHED启动启动启动方式:启动方式:-d d 以守护程序(
8、以守护程序(daemondaemon)方式运行)方式运行-u root u root 指定用户,如果当前为指定用户,如果当前为 root root,需要使用此参数指定用户,需要使用此参数指定用户-P/P/tmptmp/a.pida.pid保存保存PIDPID到指定文件到指定文件内存设置:内存设置:-m 1024 m 1024 数据内存数量,不包含数据内存数量,不包含memcachedmemcached本身占用,单位为本身占用,单位为 MBMB-M M 内存不够时禁止内存不够时禁止LRULRU,报错,报错-n 48n 48初始初始chunk=key+suffix+value+32chunk=ke
9、y+suffix+value+32结构体,默认结构体,默认4848字节字节-f 1.25 f 1.25 增长因子,默认增长因子,默认1.251.25-L L启用大内存页,可以降低内存浪费,改进性能启用大内存页,可以降低内存浪费,改进性能连接设置:连接设置:-l 127.0.0.1 l 127.0.0.1 监听的监听的 IP IP 地址,本机可以不设置此参数地址,本机可以不设置此参数-p 11211 p 11211 TCPTCP端口,默认为端口,默认为1121111211,可以不设置,可以不设置-U 11211U 11211UDPUDP端口,默认为端口,默认为1121111211,0 0为关闭为
10、关闭并发设置:并发设置:-c 1024c 1024最大并发连接数,默认最大并发连接数,默认10241024,最好是,最好是200200-t 4t 4线程数,默认线程数,默认4 4。由于。由于memcachedmemcached采用采用NIONIO,所以更多线程没有太多作用,所以更多线程没有太多作用-R 20R 20每个每个eventevent连接最大并发数,默认连接最大并发数,默认2020-CC禁用禁用CASCAS命令(可以禁止版本计数,减少开销)命令(可以禁止版本计数,减少开销)张振华.Jack12客户端连接客户端连接张振华.Jack13客户端常用的命令客户端常用的命令张振华.Jack14客
11、户端常用的命令客户端常用的命令张振华.Jack15客户端常用的命令客户端常用的命令张振华.Jack16客户端常用的命令客户端常用的命令memcachedmemcached调试调试-v v+输出输出error/warningerror/warning-vvvv+输出命令输出命令/响应响应-vvvvvv+输出内部状态输出内部状态10_10_82_80#memcached-d-u root-m 1024-p 11210-vvv10_10_82_80#memcached-d-u root-m 1024-p 11211 vvvslab class 1:chunk size 96 perslab 1092
12、2slab class 2:chunk size 120 perslab8738.slab class 42:chunk size 1048576 perslab136 server listening(auto-negotiate)37 send buffer was 126976,now 26843545637 server listening(udp)37 server listening(udp)37 server listening(udp)37 server listening(udp)38 new auto-negotiating client connection38:Clie
13、nt using the ascii protocol38 stats38 END38 quit38 connection closed.telnet localhost 11210/11211statsget abcquitmemcachedmemcached命令列表命令列表 存储命令存储命令set/add/replace/append/prepend/casset/add/replace/append/prepend/cas 读取命令读取命令getget=bget?=bget?/gets/gets 删除命令删除命令deletedelete 计数命令计数命令incr/decrincr/dec
14、r 统计命令统计命令stats/settings/items/sizes/slabsstats/settings/items/sizes/slabs 工具工具memcachedmemcached-tooltool存储命令存储命令commandset无论如何都进行存储add只有数据不存在时进行添加repalce只有数据存在时进行替换append往后追加:append datablock?prepend往前追加:prepend datablock cas按版本号更改key字符串,250个字符,不包含空格和控制字符flags客户端用来标识数据格式的数值,如json,xml,压缩等exptime存活时
15、间s,0为永远,30天为unixtimebytesbyte字节数,不包含rn,根据长度截取存/取的字符串,可以是0,即存空串datablock文本行,以rn结尾,当然可以包含r或nstatusSTORED/NOT_STORED/EXISTS/NOT_FOUNDERROR/CLIENT_ERROR/SERVER_ERROR服务端会关闭连接以修复格式:rnrnrn存储命令存储命令set/add/replaceset/add/replaceset liu 32 0 4javaSTORED/正确get liuVALUE abc 32 4javaENDset liu 32 0 4cplusCLIENT_
16、ERROR bad data chunkERROR/长度错误set liu 32 0 4javaSTOREDadd liu 32 0 5cplusNOT_STORED/已存在不能addget liuVALUE abc 32 4javaENDadd song 32 0 5cplusSTORED/不存在可以addset liu 32 0 4javaSTOREDreplace liu 32 0 5cplusSTORED/已存在可以replaceget liuVALUE cplus 32 5liuENDreplace yang 32 0 5cplusNOT_STORED/不存在不能replacedatablock长度必须正确add只能添加不存在的keyreplace只能替换已有的key读取命令读取命令get/getsget/getsget liu song yangVALUE liu 32 4javaVALUE song 32 5cplusEND/查询多个键值gets liuVALUE liu 32 4 12javaEND/取得版本号replace liu 32 0 4javaSTORED/增