教你如何使用Memcached


MemcachedMemcachedMemcached Memcached 原理和使用详解原理和使用详解原理和使用详解 原理和使用详解 作者:heiyeluren(黑夜路人) 2009-01 博客:http://blog.csdn.net/heiyeshuwu 2  MemcachedMemcached介绍介绍  MemcachedMemcached安装安装和使用和使用  一些技巧一些技巧  Q&AQ&A Tech Talk Tech Talk Tech Talk Tech Talk Tech Talk Tech Talk Tech Talk Tech Talk 目录索引目录索引 3 MemcachedMemcached介绍介绍:: 什么是什么是MemcachedMemcached?? MemcachedMemcached是国外是国外社区社区网站网站 LiveJournal LiveJournal 的开发团队开发的的开发团队开发的高性能的分布式内高性能的分布式内 存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访 问次数,以提高动态问次数,以提高动态WebWeb应用的速度、提高可扩展性。应用的速度、提高可扩展性。 LiveJournal LiveJournal LiveJournal LiveJournal LiveJournal LiveJournal LiveJournal LiveJournal 团队开发了包括团队开发了包括 Memcached Memcached Memcached Memcached Memcached Memcached Memcached Memcached 、、MogileFSMogileFSMogileFS MogileFS MogileFSMogileFSMogileFS MogileFS 、、Perlbal Perlbal Perlbal Perlbal Perlbal Perlbal Perlbal Perlbal 等不错的开等不错的开 源项目。源项目。 官方网站:官方网站:http://www.danga.com/memcached/http://www.danga.com/memcached/http://www.danga.com/memcached/ http://www.danga.com/memcached/ http://www.danga.com/memcached/http://www.danga.com/memcached/http://www.danga.com/memcached/ http://www.danga.com/memcached/ 4 MemcachedMemcached介绍介绍 MemcachedMemcached运行图运行图 5 MemcachedMemcached介绍介绍 谁在用谁在用MemcachedMemcached?? 国外国外 国内国内 6 MemcachedMemcached介绍介绍 与与MemcachedMemcached类似的还有什么类似的还有什么?? 国外国外 Tokyo CabinetTokyo Cabinet::http://tokyocabinet.sourceforge.net/index.html (http://tokyocabinet.sourceforge.net/index.html (日本日本 mixi.jpmixi.jp公司公司开发开发)) 国内国内 MemcacheDBMemcacheDB::http://memcachedb.org (http://memcachedb.org (新浪开源新浪开源TeamTeam开发开发)) tmcache: tmcache: http://heiyeluren.googlecode.com (http://heiyeluren.googlecode.com (偶开发的偶开发的 ^_^) ^_^) 7 MemcachedMemcached介绍介绍 MemcachedMemcached的主要特点的主要特点 ••基于基于C/SC/S架构,架构,协议简单协议简单 ••基于基于libeventlibevent的事件处理的事件处理 ••自主内存存储处理自主内存存储处理 ••基于客户端的基于客户端的MemcachedMemcached分布式分布式 8 MemcachedMemcached介绍介绍 基于基于C/SC/S架构,协议简单架构,协议简单 9 MemcachedMemcached介绍介绍 基于基于libeventlibevent的事件处理的事件处理 libeventlibevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统: Windows/Linux/BSD/Solaris Windows/Linux/BSD/Solaris 等操作系统的的事件处理。等操作系统的的事件处理。 包装的接口包括:包装的接口包括: pollpoll、、select(Windows)select(Windows)、、epoll(Linux)epoll(Linux)、、kqueue(BSD)kqueue(BSD)、、/dev/pool(Solaris)/dev/pool(Solaris) Memcached Memcached 使用使用libeventlibevent来进行网络并发连接的处理,能够保持在很大并发情来进行网络并发连接的处理,能够保持在很大并发情 况下,仍旧能够保持快速的响应能力。况下,仍旧能够保持快速的响应能力。 libevent: libevent: http://www.monkey.org/~provos/libevent/http://www.monkey.org/~provos/libevent/ 10 MemcachedMemcached介绍介绍 自主的内存存储处理自主的内存存储处理 •• 数据数据存储方式:存储方式:Slab AllocationSlab Allocation •• 数据数据过期过期方式:方式:Lazy Expiration + LRULazy Expiration + LRU 11 MemcachedMemcached介绍介绍 数据存储方式:数据存储方式:Slab AllocationSlab Allocation Slab Alloction Slab Alloction 构造图构造图 Slab AllocatorSlab Allocator的基本原理是按照预先的基本原理是按照预先 规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定 长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。 Slab AllocationSlab Allocation的原理相当简单。的原理相当简单。 将将 分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块 ((chunkchunk),并把尺寸相同的块分成组),并把尺寸相同的块分成组 ((chunkchunk的集合)的集合) 12 MemcachedMemcached介绍介绍 数据存储方式:数据存储方式:Slab AllocationSlab Allocation Slab Slab Classes Classes 分配图分配图 PagePage::分配给分配给SlabSlab的内存空间,默认是的内存空间,默认是 1MB1MB。分配给。分配给SlabSlab之后根据之后根据slabslab的大小的大小 切分成切分成chunkchunk。。 ChunkChunk::用于缓存记录的内存空间。用于缓存记录的内存空间。 Slab ClassSlab Class::特定大小的特定大小的chunkchunk的组。的组。 memcachedmemcached根据收到的数据的大小,选根据收到的数据的大小,选 择最适合数据大小的择最适合数据大小的slabslab。。 memcachedmemcached中保存着中保存着slabslab内空闲内空闲chunkchunk的的 列表,根据该列表选择列表,根据该列表选择chunkchunk,然后将,然后将 数据缓存于其中。数据缓存于其中。 13 MemcachedMemcached介绍介绍:: 数据存储方式:数据存储方式:Slab AllocationSlab Allocation Slab Alloction Slab Alloction 缺点缺点 这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分 配的内存。例如,将配的内存。例如,将100100字节的数据缓存到字节的数据缓存到128128字节的字节的chunkchunk中,剩余中,剩余 的的2828字节就浪费了。字节就浪费了。 14 MemcachedMemcached介绍介绍:: 数据过期方式数据过期方式 •• Lazy ExpirationLazy Expiration memcachedmemcached内部不会监视记录是否过期,而是在内部不会监视记录是否过期,而是在getget时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过 期。这种技术被称为期。这种技术被称为lazylazy(惰性)(惰性)expirationexpiration。因此,。因此,memcachedmemcached不会在过期监视上耗费不会在过期监视上耗费 CPUCPU时间。时间。 •• LRULRU memcachedmemcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不 足的情况,此时就要使用名为足的情况,此时就要使用名为 Least Recently Used Least Recently Used((LRULRU)机制来分配空间。顾名思)机制来分配空间。顾名思 义,这是删除义,这是删除““最近最少使用最近最少使用””的记录的机制。因此,当的记录的机制。因此,当memcachedmemcached的内存空间不足时的内存空间不足时 (无法从(无法从slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空获取到新的空间时),就从最近未被使用的记录中搜索,并将其空 间分配给新的记录。从缓存的实用角度来看,该模型十分理想。间分配给新的记录。从缓存的实用角度来看,该模型十分理想。 15 MemcachedMemcached介绍介绍:: 基于客户端的基于客户端的MemcachedMemcached分布式分布式 16 MemcachedMemcached介绍介绍:: 基于客户端的基于客户端的MemcachedMemcached分布式分布式 ////按照按照KeyKey值,获取一个服务器值,获取一个服务器IDID int int getServergetServerIdId(char (char **key, int serverTotal) {key, int serverTotal) { int c, int c, hash = 0;hash = 0; while (c = while (c = **key++) {key++) { hash += c;hash += c; }} return hash % serverTotal;return hash % serverTotal; }} ////服务器列表服务器列表 node[0] => 192.168.0.1:11211node[0] => 192.168.0.1:11211 node[1] => 192.168.0.2:11211node[1] => 192.168.0.2:11211 node[2] => 192.168.0.3:11211node[2] => 192.168.0.3:11211 ////获取获取keykey是是tokyotokyo的节点的节点ID(ID(服务器服务器ID)ID) int id = int id = getServerId("getServerId("testtest", ", 33);); ////得出的结果是得出的结果是11,那么对应的机器就是,那么对应的机器就是 node[id] == node[id] == node[node[11]] 17 MemcachedMemcached介绍介绍:: 基于客户端的基于客户端的MemcachedMemcached分布式分布式 写入操作写入操作 读取操作读取操作 18 MemcachedMemcached安装和使用安装和使用:: •• Memcached Memcached 安装安装 •• Memcached Memcached 与与 PHP PHP 结合使用结合使用 •• Memcached Memcached 与与 C/C++ C/C++ 结合使用结合使用 19 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 安装安装 安装步骤:安装步骤: •• 先安装先安装 libevent libevent libevent libevent libevent libevent libevent libevent •• 再安装再安装 Memcached Memcached Memcached Memcached Memcached Memcached Memcached Memcached 主程序主程序 源码下载:源码下载:((( ( ((( ( 最新版最新版))) ) ))) ) libeventlibeventlibevent libevent libeventlibeventlibevent libevent 官网:官网:http://monkey.org/~provos/libevent/http://monkey.org/~provos/libevent/http://monkey.org/~provos/libevent/ http://monkey.org/~provos/libevent/ http://monkey.org/~provos/libevent/http://monkey.org/~provos/libevent/http://monkey.org/~provos/libevent/ http://monkey.org/~provos/libevent/ libeventlibeventlibevent libevent libeventlibeventlibevent libevent 下载:下载:http://monkey.org/~provos/libevent-1.4.9-stable.tar.gzhttp://monkey.org/~provos/libevent-1.4.9-stable.tar.gzhttp://monkey.org/~provos/libevent-1.4.9-stable.tar.gz http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz http://monkey.org/~provos/libevent-1.4.9-stable.tar.gzhttp://monkey.org/~provos/libevent-1.4.9-stable.tar.gzhttp://monkey.org/~provos/libevent-1.4.9-stable.tar.gz http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 官网:官网:http://www.danga.com/memcachedhttp://www.danga.com/memcachedhttp://www.danga.com/memcached http://www.danga.com/memcached http://www.danga.com/memcachedhttp://www.danga.com/memcachedhttp://www.danga.com/memcached http://www.danga.com/memcached MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 下载:下载:http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gzhttp://www.danga.com/memcached/dist/memcached-1.2.6.tar.gzhttp://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gzhttp://www.danga.com/memcached/dist/memcached-1.2.6.tar.gzhttp://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz 20 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 安装安装 •• 安装安装 libevent libevent libevent libevent libevent libevent libevent libevent # # tar zxvf libevent-1.4.9-stable.tar.gztar zxvf libevent-1.4.9-stable.tar.gz # # cd libevent-1.4.9-stablecd libevent-1.4.9-stable # ./configure --prefix=/usr# ./configure --prefix=/usr # # makemake # # make installmake install •• 安装安装 Memcached Memcached Memcached Memcached Memcached Memcached Memcached Memcached # # tar zxvf memcached-1.2.6.tar.gztar zxvf memcached-1.2.6.tar.gz # # cd memcached-1.2.6cd memcached-1.2.6 # # ./configure --prefix=/usr/local./configure --prefix=/usr/local # make# make # make install# make install 21 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 运行运行 •• 试试运行运行 Memcached Memcached Memcached Memcached Memcached Memcached Memcached Memcached # /usr/local/bin/memcached -u hualiangxie# /usr/local/bin/memcached -u hualiangxie 22 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 运行运行 查看查看Memcached Memcached Memcached Memcached Memcached Memcached Memcached Memcached 帮助信息帮助信息 # /usr/local/bin/memcached# /usr/local/bin/memcached -h -h 23 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 运行运行 关注基本选项关注基本选项 -p -p 监听的监听的TCPTCP端口端口 ( (缺省缺省: 11211): 11211) -d -d 以守护进程方式运行以守护进程方式运行MemcachedMemcached -u -u 运行运行MemcachedMemcached的账户,非的账户,非rootroot用户用户 -m -m 最大的内存使用最大的内存使用, , 单位是单位是MBMB,,缺省是缺省是 64 MB 64 MB -c -c 软连接数量软连接数量, , 缺省是缺省是 1024 1024 -v -v 输出警告和错误信息输出警告和错误信息 -vv -vv 打印客户端的请求和返回信息打印客户端的请求和返回信息 -h -h 打印帮助信息打印帮助信息 -i -i 打印打印memcachedmemcached和和libeventlibevent的版权信息的版权信息 运行运行 Memcached Memcached Memcached Memcached Memcached Memcached Memcached Memcached 目标:使用目标:使用1121111211端口、端口、hualiangxiehualiangxie用户、最大占用用户、最大占用512M512M内存、内存、10241024个软连接,输出个软连接,输出 客户端请求,以守护进程方式运行客户端请求,以守护进程方式运行 # /usr/local/bin/memcached -p 11211 -d -u hualiangxie -m 512 -c 1024 -vvv# /usr/local/bin/memcached -p 11211 -d -u hualiangxie -m 512 -c 1024 -vvv 24 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 运行运行 检查是否正常启动检查是否正常启动 # # pa auxxww | grep memcachedpa auxxww | grep memcachedpa auxxww | grep memcached pa auxxww | grep memcached pa auxxww | grep memcachedpa auxxww | grep memcachedpa auxxww | grep memcached pa auxxww | grep memcached 1001 4402 0.0 0.0 2296 900 pts/0 S+ 19:24 0:00 /usr/local/bin/memcached -u hualiangxie1001 4402 0.0 0.0 2296 900 pts/0 S+ 19:24 0:00 /usr/local/bin/memcached -u hualiangxie root 4547 0.0 0.0 1892 668 pts/3 S+ 19:42 0:00 grep memcachedroot 4547 0.0 0.0 1892 668 pts/3 S+ 19:42 0:00 grep memcached # # telnet localhost 11211telnet localhost 11211telnet localhost 11211 telnet localhost 11211 telnet localhost 11211telnet localhost 11211telnet localhost 11211 telnet localhost 11211 Trying 127.0.0.1...Trying 127.0.0.1... Connected to localhost.Connected to localhost. Escape character is '^]'.Escape character is '^]'. statsstatsstats stats statsstatsstats stats STAT pid 4402STAT pid 4402 STAT uptime 1032STAT uptime 1032 STAT time 1231155683STAT time 1231155683 STAT version 1.2.6STAT version 1.2.6 STAT pointer_size 32STAT pointer_size 32 ...... ENDEND 25 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 基本协议基本协议 数据数据存取存取 set key1 0 180 3set key1 0 180 3set key1 0 180 3 set key1 0 180 3 set key1 0 180 3set key1 0 180 3set key1 0 180 3 set key1 0 180 3 abcabc STOREDSTORED add key1 0 180 3add key1 0 180 3add key1 0 180 3 add key1 0 180 3 add key1 0 180 3add key1 0 180 3add key1 0 180 3 add key1 0 180 3 xyzxyz NOT_STOREDNOT_STORED get key1get key1get key1 get key1 get key1get key1get key1 get key1 VALUE key1 0 3VALUE key1 0 3 abcabc ENDEND replace key1 0 180 3replace key1 0 180 3replace key1 0 180 3 replace key1 0 180 3 replace key1 0 180 3replace key1 0 180 3replace key1 0 180 3 replace key1 0 180 3 xyzxyz STOREDSTORED get key1get key1get key1 get key1 get key1get key1get key1 get key1 VALUE key1 0 3VALUE key1 0 3 xyzxyz ENDEND delete key1delete key1delete key1 delete key1 delete key1delete key1delete key1 delete key1 DELETEDDELETED 数字加减数字加减 set key2 0 180 4set key2 0 180 4set key2 0 180 4 set key2 0 180 4 set key2 0 180 4set key2 0 180 4set key2 0 180 4 set key2 0 180 4 12341234 STOREDSTORED incr key2 3incr key2 3incr key2 3 incr key2 3 incr key2 3incr key2 3incr key2 3 incr key2 3 12371237 get key2get key2get key2 get key2 get key2get key2get key2 get key2 VALUE key2 0 4VALUE key2 0 4 12371237 ENDEND decr key2 1decr key2 1decr key2 1 decr key2 1 decr key2 1decr key2 1decr key2 1 decr key2 1 12361236 get key2get key2get key2 get key2 get key2get key2get key2 get key2 VALUE key2 0 4VALUE key2 0 4 12361236 ENDEND 26 MemcachedMemcached安装和使用安装和使用:: MemcachedMemcached 和和 PHP PHP 结合使用结合使用 安装安装 PHP Memcache PHP Memcache PHP Memcache PHP Memcache PHP Memcache PHP Memcache PHP Memcache PHP Memcache 扩展扩展 扩展扩展官网:官网:http://pecl.php.net/package/memcachehttp://pecl.php.net/package/memcache 扩展扩展下载:下载:http://pecl.php.net/get/memcache-2.2.4.tgzhttp://pecl.php.net/get/memcache-2.2.4.tgz MemcacheMemcache扩展安装:扩展安装: # # tar zxvf memcache-2.2.4.tgztar zxvf memcache-2.2.4.tgz # # cd memcache-2.2.4cd memcache-2.2.4 # # /usr/local/php/bin/phpize/usr/local/php/bin/phpize # # ./configure --with-php-config=/usr/local/php/bin/php-config./configure --with-php-config=/usr/local/php/bin/php-config # # makemake # # make installmake install 配置配置 # # ls -l /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.sols -l /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.so # # vim /usr/local/php/lib/php.ini vim /usr/local/php/lib/php.ini 新增配置内容:新增配置内容: extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/" extension = memcache.soextension = memcache.so 检查安装结果检查安装结果 # # /usr/local/php/bin/php -m/usr/local/php/bin/php -m # # /usr/local/apache2/bin/apachectl restart/usr/local/apache2/bin/apachectl restart 27 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 PHP PHP 结合使用结合使用 PHPPHPPHP PHP PHPPHPPHP PHP 与与MemcacheMemcacheMemcache Memcache MemcacheMemcacheMemcache Memcache 结合测试代码结合测试代码 connect("localhost", 11211);$mem->connect("localhost", 11211); ////保存数据保存数据 $mem->set('key1', 'This is first value', 0, 60);$mem->set('key1', 'This is first value', 0, 60); $val = $mem->get('key1');$val = $mem->get('key1'); echo "Get key1 value: " . $val ."
";echo "Get key1 value: " . $val ."
"; ////替换数据替换数据 $mem->replace('key1', 'This is replace value', 0, 60);$mem->replace('key1', 'This is replace value', 0, 60); $val = $mem->get('key1');$val = $mem->get('key1'); echo "Get key1 value: " . $val . "
";echo "Get key1 value: " . $val . "
"; ////保存数组数据保存数组数据 $arr = array('aaa', 'bbb', 'ccc', 'ddd');$arr = array('aaa', 'bbb', 'ccc', 'ddd'); $mem->set('key2', $arr, 0, 60);$mem->set('key2', $arr, 0, 60); $val2 = $mem->get('key2');$val2 = $mem->get('key2'); echo "Get key2 value: ";echo "Get key2 value: "; print_r($val2);print_r($val2); echo "
";echo "
"; ////删除数据删除数据 $mem->delete('key1');$mem->delete('key1'); $val = $mem->get('key1');$val = $mem->get('key1'); echo "Get key1 value: " . $val . "
";echo "Get key1 value: " . $val . "
"; ////清除所有数据清除所有数据 $mem->flush();$mem->flush(); $val2 = $mem->get('key2');$val2 = $mem->get('key2'); echo "Get key2 value: ";echo "Get key2 value: "; print_r($val2);print_r($val2); echo "
";echo "
"; ////关闭连接关闭连接 $mem->close();$mem->close(); ?>?> 28 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 PHP PHP 结合使用结合使用 PHPPHPPHP PHP PHPPHPPHP PHP 与与MemcacheMemcacheMemcache Memcache MemcacheMemcacheMemcache Memcache 分布式分布式 在一台或者多台机器启用一个或者多个进程,这里是在一台机器启在一台或者多台机器启用一个或者多个进程,这里是在一台机器启 用两个进程,使用两个端口:用两个进程,使用两个端口: # # /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie /usr/local/bin/memcached -p 11211 -d -u hualiangxie # # /usr/local/bin/memcached -p 1121/usr/local/bin/memcached -p 1121/usr/local/bin/memcached -p 1121 /usr/local/bin/memcached -p 1121 /usr/local/bin/memcached -p 1121/usr/local/bin/memcached -p 1121/usr/local/bin/memcached -p 1121 /usr/local/bin/memcached -p 1121 222 2 222 2 -d -u hualiangxie -d -u hualiangxie -d -u hualiangxie -d -u hualiangxie -d -u hualiangxie -d -u hualiangxie -d -u hualiangxie -d -u hualiangxie PHP PHP PHP PHP PHP PHP PHP PHP 测试代码测试代码 addServer("localhost", 11211);$mem->addServer("localhost", 11211); $mem->addServer("localhost", 11212);$mem->addServer("localhost", 11212); ////保存数据保存数据 $mem->set('key1', 'This is first value', 0, 60);$mem->set('key1', 'This is first value', 0, 60); $val = $mem->get('key1');$val = $mem->get('key1'); echo "Get key1 value: " . $val ."
";echo "Get key1 value: " . $val ."
"; ////保存数组数据保存数组数据 $arr = array('aaa', 'bbb', 'ccc', 'ddd');$arr = array('aaa', 'bbb', 'ccc', 'ddd'); $mem->set('key2', $arr, 0, 60);$mem->set('key2', $arr, 0, 60); $val2 = $mem->get('key2');$val2 = $mem->get('key2'); echo "Get key2 value: ";echo "Get key2 value: "; print_r($val2);print_r($val2); echo "
";echo "
"; ////删除数据删除数据 $mem->delete('key1');$mem->delete('key1'); $val = $mem->get('key1');$val = $mem->get('key1'); echo "Get key1 value: " . $val . "
";echo "Get key1 value: " . $val . "
"; ////关闭连接关闭连接 $mem->close();$mem->close(); ?>?> 注意:注意:实际上实际上Key1Key1保存在保存在1121111211端口机器,端口机器, Key2Key2保存在保存在1121211212端口机器上端口机器上 29 MemcachedMemcached安装和使用安装和使用:: MemcachedMemcached 和和 C/ C/C++C++ 结合使用结合使用 安装安装 C/ C/ C/ C/ C/ C/ C/ C/ C++ Memcached C++ Memcached C++ Memcached C++ Memcached C++ Memcached C++ Memcached C++ Memcached C++ Memcached 客户端库:客户端库:libmemcachedlibmemcachedlibmemcached libmemcached libmemcachedlibmemcachedlibmemcached libmemcached 开发库开发库官网:官网:http://tangent.org/552/libmemcached.htmlhttp://tangent.org/552/libmemcached.html 开发库开发库下载:下载:http://download.tangent.org/libmemcached-0.25.tar.gzhttp://download.tangent.org/libmemcached-0.25.tar.gz liblibmmemcachedemcached库库安装:安装: # # tar zxvf libmemcached-0.25.tar.gztar zxvf libmemcached-0.25.tar.gz # # cd libmemcached-0.25cd libmemcached-0.25 # # ./configure --prefix=/usr./configure --prefix=/usr # # makemake # # make installmake install 检查安装结果检查安装结果 ## ls /usr/lib/libmemcachels /usr/lib/libmemcache** // //库文件库文件 ## ls /usr/include/libmemcached/ls /usr/include/libmemcached/** // //头文件头文件 # # ls /usr/bin/memls /usr/bin/mem** // //命令行工具命令行工具 参考参考 libmenmcached libmenmcached libmenmcached libmenmcached libmenmcached libmenmcached libmenmcached libmenmcached 开发示例代码开发示例代码 # man # man libmemcached_exampleslibmemcached_examples 30 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 C/C++C/C++ 结合使用结合使用 C/C++C/C++C/C++ C/C++ C/C++C/C++C/C++ C/C++ 与与MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 结合测试代码结合测试代码 #include #include #include #include #include #include #include #include int main(int argc, char int main(int argc, char **argv[]) {argv[]) { memcached_st memcached_st **memc;memc; memcached_return rc; memcached_return rc; memcached_server_st memcached_server_st **servers;servers; char value[8191]; char value[8191]; //connect server //connect server memc = memcached_create(NULL); memc = memcached_create(NULL); servers = memcached_server_list_append(NULL, "localhost", servers = memcached_server_list_append(NULL, "localhost", 11211, &rc);11211, &rc); rc = memcached_server_push(memc, servers); rc = memcached_server_push(memc, servers); memcached_server_free(servers); memcached_server_free(servers); //Save data //Save data strcpy(value, "This is c first value"); strcpy(value, "This is c first value"); rc = memcached_set(memc, "key1", 4, value, strlen(value), rc = memcached_set(memc, "key1", 4, value, strlen(value), (time_t)180, (uint32_t)0);(time_t)180, (uint32_t)0); if (rc == MEMCACHED_SUCCESS) { if (rc == MEMCACHED_SUCCESS) { printf("Save key:key1 data:\"%s\" success.\n", value); printf("Save key:key1 data:\"%s\" success.\n", value); } } //Fetch data //Fetch data char return_key[MEMCACHED_MAX_KEY]; char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; size_t return_key_length; char char **return_value;return_value; size_t return_value_length; size_t return_value_length; char char **keys[]= {"key1"};keys[]= {"key1"}; size_t key_length[]= {4}; size_t key_length[]= {4}; uint32_t flags; uint32_t flags; rc = memcached_mget(memc, keys, key_length, 1); rc = memcached_mget(memc, keys, key_length, 1); return_value = memcached_fetch(memc, return_key, return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc);&return_key_length, &return_value_length, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { if (rc == MEMCACHED_SUCCESS) { printf("Fetch key:%s data:%s\n", return_key, return_value); printf("Fetch key:%s data:%s\n", return_key, return_value); } } //Delete data //Delete data rc = memcached_delete(memc, "key1", 4, (time_t)0); rc = memcached_delete(memc, "key1", 4, (time_t)0); if (rc == MEMCACHED_SUCCESS) { if (rc == MEMCACHED_SUCCESS) { printf("Delete Key key1 success.\n"); printf("Delete Key key1 success.\n"); } } //free //free memcached_free(memc); memcached_free(memc); return 0; return 0; }} 31 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 C/C++C/C++ 结合使用结合使用 C/C++C/C++C/C++ C/C++ C/C++C/C++C/C++ C/C++ 与与MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 结合测试结合测试结果结果 编译执行以上代码:编译执行以上代码: # # gcc -o c_test1 c_test1.c -lmemcachedgcc -o c_test1 c_test1.c -lmemcached ## ./c_test1 ./c_test1 输出结果:输出结果: Save key:key1 data:"This is c first value" success.Save key:key1 data:"This is c first value" success. Fetch key:key1 data:This is c first valueFetch key:key1 data:This is c first value Delete Key key1 success.Delete Key key1 success. 32 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 C/C++C/C++ 结合使用结合使用 C/C++C/C++C/C++ C/C++ C/C++C/C++C/C++ C/C++ 与与MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 分布式结合测试代码分布式结合测试代码111 1 111 1 #include #include #include #include #include #include #include #include int main(int argc, char int main(int argc, char **argv[]) {argv[]) { memcached_st memcached_st **memc;memc; memcached_return rc; memcached_return rc; memcached_server_st memcached_server_st **servers;servers; char value[8191]; char value[8191]; //connect multi server //connect multi server memc = memcached_create(NULL); memc = memcached_create(NULL); servers = memcached_server_list_append(NULL, "localhost", 11211, &rc); servers = memcached_server_list_append(NULL, "localhost", 11211, &rc); servers = memcached_server_list_append(servers, "localhost", 11212, &rc); servers = memcached_server_list_append(servers, "localhost", 11212, &rc); rc = memcached_server_push(memc, servers); rc = memcached_server_push(memc, servers); memcached_server_free(servers); memcached_server_free(servers); //Save multi data//Save multi data size_t i; size_t i; char char **keys[]= {"key1", "key2", "key3"};keys[]= {"key1", "key2", "key3"}; size_t key_length[]= {4, 4, 4}; size_t key_length[]= {4, 4, 4}; char char **values[] = {"This is c first value", "This is c values[] = {"This is c first value", "This is c second value", "This is c third value"};second value", "This is c third value"}; size_t val_length[]= {21, 22, 21}; size_t val_length[]= {21, 22, 21}; for (i=0; i <3; i++) { for (i=0; i <3; i++) { rc = memcached_set(memc, keys[i], rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0);(uint32_t)0); if (rc == MEMCACHED_SUCCESS) { if (rc == MEMCACHED_SUCCESS) { printf("Save key:%s data:\"%s\" success.\n", printf("Save key:%s data:\"%s\" success.\n", keys[i], values[i]);keys[i], values[i]); } } } } 33 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 C/C++C/C++ 结合使用结合使用 C/C++C/C++C/C++ C/C++ C/C++C/C++C/C++ C/C++ 与与MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 分布式结合测试代码分布式结合测试代码222 2 222 2 //Fetch multi data //Fetch multi data char return_key[MEMCACHED_MAX_KEY]; char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; size_t return_key_length; char char **return_value;return_value; size_t return_value_length; size_t return_value_length; uint32_t flags; uint32_t flags; rc = memcached_mget(memc, keys, key_length, 3); rc = memcached_mget(memc, keys, key_length, 3); while ((return_value = memcached_fetch(memc, return_key, while ((return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc))) {&return_key_length, &return_value_length, &flags, &rc))) { if (rc == MEMCACHED_SUCCESS) { if (rc == MEMCACHED_SUCCESS) { printf("Fetch key:%s data:%s\n", return_key, return_value); printf("Fetch key:%s data:%s\n", return_key, return_value); } } } } //Delete multi data //Delete multi data for (i=0; i <3; i++) { for (i=0; i <3; i++) { rc = memcached_set(memc, keys[i], key_length[i], rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0);values[i], val_length[i], (time_t)180, (uint32_t)0); rc = memcached_delete(memc, keys[i], rc = memcached_delete(memc, keys[i], key_length[i], (time_t)0);key_length[i], (time_t)0); if (rc == MEMCACHED_SUCCESS) { if (rc == MEMCACHED_SUCCESS) { printf("Delete %s success\n", keys[i], values[i]); printf("Delete %s success\n", keys[i], values[i]); } } } } //free //free memcached_free(memc); memcached_free(memc); return 0; return 0; }} 34 MemcachedMemcached安装和使用安装和使用:: Memcached Memcached 与与 C/C++C/C++ 结合使用结合使用 C/C++C/C++C/C++ C/C++ C/C++C/C++C/C++ C/C++ 与与MemcachedMemcachedMemcached Memcached MemcachedMemcachedMemcached Memcached 分布式结合测试分布式结合测试结果结果 编译执行以上代码:编译执行以上代码: # # gcc -o c_testgcc -o c_test22 c_test c_test22.c -lmemcached.c -lmemcached ## ./c_test ./c_test22 输出结果:输出结果: Save key:key1 data:"This is c first value" success.Save key:key1 data:"This is c first value" success. Save key:key2 data:"This is c second value" success.Save key:key2 data:"This is c second value" success. Save key:key3 data:"This is c third value" success.Save key:key3 data:"This is c third value" success. Fetch key:key1 data:This is c first valueFetch key:key1 data:This is c first value Fetch key:key2 data:This is c second valueFetch key:key2 data:This is c second value Fetch key:key3 data:This is c third valueFetch key:key3 data:This is c third value Delete key1 successDelete key1 success Delete key2 successDelete key2 success Delete key3 successDelete key3 success 35 一些经验和技巧一些经验和技巧:: MemcachedMemcached一些特性和限制一些特性和限制 •• 在在 Memcached Memcached 中可以保存的中可以保存的itemitem数据量是没有限制的,只有内存足够数据量是没有限制的,只有内存足够 •• Memcached Memcached单进程最大使用内存为单进程最大使用内存为2G2G,要使用更多内存,可以分多个端口开启多个,要使用更多内存,可以分多个端口开启多个MemcachedMemcached进程进程 •• 最大最大3030天的数据过期时间天的数据过期时间, , 设置为永久的也会在这个时间过期,常量设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA REALTIME_MAXDELTA 60 60**6060**2424**30 30 控制控制 •• 最大键长为最大键长为250250字节,大于该长度无法存储,常量字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250 KEY_MAX_LENGTH 250 控制控制 •• 单个单个itemitem最大数据是最大数据是1MB1MB,超过,超过1MB1MB数据不予存储,常量数据不予存储,常量POWER_BLOCK 1048576 POWER_BLOCK 1048576 进行控制,进行控制, 它是默认的它是默认的slabslab大小大小 •• 最大同时连接数是最大同时连接数是200200,通过,通过 conn_init() conn_init()中的中的freetotal freetotal 进行控制,最大软连接数是进行控制,最大软连接数是10241024,通过,通过 settings.maxconns=1024 settings.maxconns=1024 进行控制进行控制 •• 跟空间占用相关的参数:跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, settings.factor=1.25, settings.chunk_size=48, 影响影响slabslab的数据占用和步进方式的数据占用和步进方式 36 一些经验和技巧一些经验和技巧:: 查看查看MemcachedMemcached内部工作状态内部工作状态 访问访问MemcachedMemcached::telnet telnet 主机名主机名 端口号端口号 查看总状态:查看总状态:statsstats 查看某项状态:查看某项状态:stats curr_connectionsstats curr_connections 禁止禁止LRULRU 有些情况下有些情况下LRULRU机制反倒会造成麻烦。机制反倒会造成麻烦。memcachedmemcached启动时通过启动时通过““-M-M””参数可以禁止参数可以禁止LRULRU,, 如下所示:如下所示: $ memcached -M -m 1024$ memcached -M -m 1024 启动时必须注意的是,小写的启动时必须注意的是,小写的““-m-m””选项是用来指定最大内存大小的。不指定具体数值则选项是用来指定最大内存大小的。不指定具体数值则 使用默认值使用默认值64MB64MB。。 指定指定““-M-M””参数启动后,内存用尽时参数启动后,内存用尽时memcachedmemcached会返回错误。话说回来,会返回错误。话说回来,memcachedmemcached毕毕 竟不是存储器,而是缓存,所以推荐使用竟不是存储器,而是缓存,所以推荐使用LRULRU。。 37 一些经验和技巧一些经验和技巧:: MemcachedMemcached使用线程模式工作使用线程模式工作 在安装的时候必须打开:在安装的时候必须打开:./configure --enable-threads./configure --enable-threads 安装完之后,启动的时候看看帮助信息有没有这条:安装完之后,启动的时候看看帮助信息有没有这条: -t number of threads to use, default 4-t number of threads to use, default 4 如果存在该选项,说明已经支持了线程,就可以在启动的时候使用如果存在该选项,说明已经支持了线程,就可以在启动的时候使用 -t -t 选项来启动多线程选项来启动多线程 然后启动的时候必须加上你需要支持的线程数量:然后启动的时候必须加上你需要支持的线程数量: /usr/local/memcache/bin/memcached -t 1024/usr/local/memcache/bin/memcached -t 1024 38 一些经验和技巧一些经验和技巧:: 调优调优SlabSlab和内存分配和内存分配11 memcachedmemcached在启动时指定在启动时指定 Growth Factor Growth Factor因子(通过因子(通过-f-f选项),就可以在某种程度上控制选项),就可以在某种程度上控制slabslab之间的差异。之间的差异。 默认值为默认值为1.251.25。但是,在该选项出现之前,这个因子曾经固定为。但是,在该选项出现之前,这个因子曾经固定为22,称为,称为““powers of 2powers of 2””策略。策略。 让我们用以前的设置,以让我们用以前的设置,以verboseverbose模式启动模式启动memcachedmemcached试试看:试试看: $ memcached -f 2 -vv$ memcached -f 2 -vv slab class 1: chunk size 128 perslab 8192slab class 1: chunk size 128 perslab 8192 slab class 2: chunk size 256 perslab 4096slab class 2: chunk size 256 perslab 4096 slab class 3: chunk size 512 perslab 2048slab class 3: chunk size 512 perslab 2048 slab class 4: chunk size 1024 perslab 1024slab class 4: chunk size 1024 perslab 1024 slab class 5: chunk size 2048 perslab 512slab class 5: chunk size 2048 perslab 512 slab class 6: chunk size 4096 perslab 256slab class 6: chunk size 4096 perslab 256 slab class 7: chunk size 8192 perslab 128slab class 7: chunk size 8192 perslab 128 slab class 8: chunk size 16384 perslab 64slab class 8: chunk size 16384 perslab 64 slab class 9: chunk size 32768 perslab 32slab class 9: chunk size 32768 perslab 32 slab class 10: chunk size 65536 perslab 16slab class 10: chunk size 65536 perslab 16 slab class 11: chunk size 131072 perslab 8slab class 11: chunk size 131072 perslab 8 slab class 12: chunk size 262144 perslab 4slab class 12: chunk size 262144 perslab 4 slab class 13: chunk size 524288 perslab 2slab class 13: chunk size 524288 perslab 2 39 一些经验和技巧一些经验和技巧:: 调优调优SlabSlab和内存分配和内存分配22 可见,从可见,从128128字节的组开始,组的大小依次增大为原来的字节的组开始,组的大小依次增大为原来的22倍。这样设置的问题是,倍。这样设置的问题是,slabslab之间的差别比较之间的差别比较 大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了growth factorgrowth factor这个选项。这个选项。 来看看现在的默认设置(来看看现在的默认设置(f=1.25f=1.25)时的输出(篇幅所限,这里只写到第)时的输出(篇幅所限,这里只写到第1010组):组): slab class 1: chunk size 88 perslab 11915slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281slab class 3: chunk size 144 perslab 7281 slab class 4: chunk size 184 perslab 5698slab class 4: chunk size 184 perslab 5698 slab class 5: chunk size 232 perslab 4519slab class 5: chunk size 232 perslab 4519 slab class 6: chunk size 296 perslab 3542slab class 6: chunk size 296 perslab 3542 slab class 7: chunk size 376 perslab 2788slab class 7: chunk size 376 perslab 2788 slab class 8: chunk size 472 perslab 2221slab class 8: chunk size 472 perslab 2221 slab class 9: chunk size 592 perslab 1771slab class 9: chunk size 592 perslab 1771 slab class 10: chunk size 744 perslab 1409slab class 10: chunk size 744 perslab 1409 可见,组间差距比因子为可见,组间差距比因子为22时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得 有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。 将将memcachedmemcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度, 调整调整growth factorgrowth factor,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。 40 一些经验和技巧一些经验和技巧:: 参考文档和延伸阅读参考文档和延伸阅读 以下为本以下为本PPTPPT参考文档,特别是参考了参考文档,特别是参考了mixi.jp mixi.jp 公司编写的《公司编写的《MemcachedMemcached全面全面剖析》剖析》 MemcachedMemcached全面剖析:全面剖析:http://tech.idv2.com/2008/08/17/memcached-pdf/http://tech.idv2.com/2008/08/17/memcached-pdf/ Memcached 1.2 Memcached 1.2 内存模型分析:内存模型分析:http://phpcup.cn/viewthread.php?tid=45http://phpcup.cn/viewthread.php?tid=45 MemcachedMemcached深度分析:深度分析:http://funjackyone.javaeye.com/blog/128384http://funjackyone.javaeye.com/blog/128384 memcached server LRU memcached server LRU 深入分析:深入分析:http://www.javaeye.com/topic/225692http://www.javaeye.com/topic/225692 MemcacheMemcache使用详解使用详解: http://blog.csdn.net/heiyeshuwu/archive/2006/11/13/1380838.aspx: http://blog.csdn.net/heiyeshuwu/archive/2006/11/13/1380838.aspx
还剩39页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

lopyuer

贡献于2015-11-13

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf