lfjgh 发表于 2015-8-10 08:53:02

memcache

MemcachedMemcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcache 是一个 C/S 结构server 端:memcachedclient 端:memcache

运行模式: C/S端口号:11211
# vim /etc/services
作用:memcached 可以缓存 mysql 的查询结果,优化 mysqlI/O。

运行机制: 普通情况:user ->web->mysql
使用 memcache 情况:user->web->memcache->mysql1) memcache 的优先级大于 mysql,查找数据流程:
web 向数据库取数据的时候        优先去找 memcache

如果找到y        拿数据       
如果没找到N        web 去找 mysql       
                  Y        去写入 memcache 一份        web 继续处理请求

2) 数据放到 memcache 会优化 mysqlI/O,因为内存比硬盘快
memcached 缓存数据的方式: 1、 将数据全部缓存在内存,2、缓存到硬盘中。[如果要缓存的 数据量不是非常大不建义]
注:        缓存断电后 所有缓存数据全部丢失

3)memcached 存储缓存数据的方式:
将 mysql 的查询结果以 key = value 的形式写入内存
每条数据都有自己的有效期, 在有效期内我们称之为热点数据        过期数据叨脏数据


4) memcache 内存缓存大小
32bit 操作系统        2G
64bit 操作系统        没限制


5) 数据缓存周期
数据缓存周期, 可以自定义 , 即使调设为永丽不过期的数据, 默认也会在 30 天后过期


一、安装 lamp 源码编译 LNMP 环境
略过

二、安装 memcached
上传软件包: libevent-2.0.22-stable.tar.gzmemcached-1.4.22.tar.gz
安装 libevent
# tar zxvf libevent-2.0.22-stable.tar.gz
# cd libevent-2.0.22-stable
# ./configure   --prefix=/usr/local/libevent   #检查 系统编译环境
# make   -j   4        # 将源码编译成二进制,   -j   4 使用
4 个进程同时编译
# make install   #安装 查看安装后的文件:
# ls /usr/local/libevent/
bin   include   lib


安装服务器端:memcached
# tar zxvf memcached-1.4.22.tar.gz
# cd memcached-1.4.22
# ./configure   --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
# make -j 4
# make install
# echo $?
0
启动 memcached
# /usr/local/memcached/bin/memcached -u root -p
11211 -l 192.168.1.63 -P /var/run/memcached.pid -m 128m -c 2048 -d
# echo $?
0
参数:
-uuser
-p port
-l listen


-P pid
-m 内存缓存大小
-c 最大并发
-d作为守护进程在后台运行


查看端口:
# netstat -antup | grep 11211
tcp        0        0 192.168.1.63:11211        0.0.0.0:*        LISTEN
9801/memcached
udp        0        0 192.168.1.63:11211        0.0.0.0:*
9801/memcached



测试,连接 memecached 读写数据


#使用 telnet 连接 memcache,进行测试
诧法:telnet IP 11211
# rpm -ivh /mnt/Packages/telnet-0.17-47.el6.x86_64.rpm
warning: /mnt/Packages/telnet-0.17-47.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...        ###########################################
1:telnet        ###########################################


实例:使用 telnet 连接 memcache,进行测试
telnet 写入 memcache 命令栺式
<command name> <key> <flags> <exptime> <bytes>回车换行 <data block>回车换行 参数详解:
1.<command name> 可以是”set”
set:<key>不存在时添加,<key>存在时覆盖。
2.<key> 保存数据的 key
3.<flags> 是一个 16 位的无符号的整数(以十进制的方式表示)。 该标志将和需要存储的数据一起存储,并在客户端 get 数据时返回。 客户可以将此标志用做特殊用途,此标志对服务器来说是透明的。
4.<exptime> 过期的时间。
0 表示存储的数据永进不过时。
非 0(unix 时间),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
5.<bytes> 需要存储的字节数(不包含最后的”\r\n(回车换行)”),当用户希望存储空数据时,可以为 0
6.最后客户端需要加上”\r\n”作为”命令头”的结束标志。
7.<data block>\r\n 紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”\r\n”作为此次通讯的结 束。


当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:
1.STORED\r\n:表示存储成功

2.NOT_STORED\r\n: 表示存储失败,但是该失败不是由于错诨。


实例:使用 memcache 存储数据
# telnet 192.168.1.63 11211
Trying 192.168.1.63... Connected to 192.168.1.63. Escape character is '^]'.
set name 4 300 7
jacker
STORED
get name
VALUE name 4 7 silence
END
quit
Connection closed by foreign host.
参数说明:
set name 4 300 7
#往 memcached 缓存中存储一个键值,标志 4 ,缓存时间 300 秒,字符串长度是 6 个字节
silence   #输入内容
STORED   # 该标志代表是存入成功
get name        #get 命令读取缓存数据 VALUE name 4 6
silence
END        该标志代表结束
quit   #退出



#思考 memcache 的 -m 设置内存缓存大小为多少合适?
如果本服务器只运行 memcache, -m        应为物理内存的 80%-70%        根据数据量来设定


三、安装客户端 memcache,即生成 memcache 模块
phpize 概述:
phpize 是用来扩展 php 扩展模块的,通过 phpize 可以建立 php 的扩展模块 默认情况,源码编译的 php 中自带这个命令文件:


查看:
#ls   /server/php-5.4-nginx/bin/phpize


生成 memcache 客户端模块
# tar -zxvf memcache-2.2.7.tgz
# cd /root/memcache-2.2.7
# ls
config9.m4                memcache.c        memcache_queue.h config.m4       memcache_consistent_hash.cmemcache_session.c
config.w32           memcache.dsp       memcache_standard_hash.c CREDITS        memcache.php        php_memcache.h
example.php   memcache_queue.c        README


# /server/php-5.4-nginx/bin/phpize
Configuring for:
PHP Api Version:        20100412
Zend Module Api No:        20100525
Zend Extension Api No:        220100525
# ls
acinclude.m4          configure.in        memcache.php aclocal.m4       config.w32       memcache_queue.c autom4te.cache   CREDITS                memcache_queue.h build        example.php       memcache_session.c
config9.m4       install-sh        memcache_standard_hash.c config.guess        ltmain.sh       missing
config.h.in        Makefile.global        mkinstalldirs config.m4          memcache.c                php_memcache.h config.sub       memcache_consistent_hash.cREADME configure          memcache.dsp               run-tests.php
注:发现多了很多文件
编译安装:
# ./configure --enable-memcache --with-php-config=/server/php-5.4-nginx/bin/php-config
# make -j 4
See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------


Build complete.
Don't forget to run 'make test'.


# make install
Installing shared extensions:
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/
查看编译出来的模块:
# ll
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/memcache.so
-rwxr-xr-x 1 root root 259104 May 26 08:33
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/memcache.so


查看 php.ini 配置文件位置:
访问:http://192.168.1.63/a.php        #通过调用 phpinfo()凼数来查看
# cat /server/nginx-1.2.8/html/a.php
<?php
phpinfo();
?>
查看 memcache 相关内容,注:没有添加时,是看不到的
# vim /server/php-5.4-nginx/php.ini
在:
728 ; extension_dir = "./"   #在 php.ini 中;表示注释 追加:
extension_dir = "/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/"
extension=memcache.so
# ls
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/
memcache.so
#能看到 memcache.so


重新启动 php-fpm
# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm   done



测试
1) 查看 phpinfo.php是否有 memcache 选项
访问:http://192.168.1.63/a.php        ,查看 memcache 相关内容,注:没有添加时,是看不到的

2) memcache 和 memcached 的连接写一个 php 页面# vim /server/nginx-1.2.8/html/mem.php#写入以下内容
<?php

$memcache = memcache_connect('192.168.1.63', 11211);

$memcache->set( 'test' , 'hello world!' , 0 , 12 );$val =   $memcache->get( 'test' );
echo $val;
?>

注:0 表示 memcache 缓存过期时间,12 表示 test 可以存储字节数

访问:http://192.168.1.63/mem.php ,可以看到 hello world!说明成功实战 3:开始缓存 mysql 数据


# /etc/init.d/mysqld5.5 restart
Shutting down MySQL..                [   OK   ]
Starting MySQL....        [   OK   ]


产生测试数据:
seq 命令: 用于产生从某个数到另外一个数之间的所有整数
# seq 1 99999 > /tmp/big
# tail   /tmp/big
99990
99991
99992
99993
99994
99995
99996
99997
99998
99999


将生成的数据导入到 msyql 数据库:


# mysql -uroot -p123456   -e "create database db1"
#        mysql        -uroot        -p123456        -e        "use        db1;create        table        T1(ID
int)ENGINE=innodb"
# mysql -uroot -p123456 -e "use db1;load data infile '/tmp/big' into table T1"
注:LOAD DATA INFILE 诧句以很高的速度从一个文本文件中读取行到一个表中,因此文件中行的内容 要和表的列相符。相关文件名必须是一个文字字符串。

上传脚本到/var/www/html下访问测试页面:http://192.168.1.63/memcached_page/
如果显示不正常,调一下编码
读测试

写测试


写完之后到读测试那边去查询
页: [1]
查看完整版本: memcache