设为首页 收藏本站
查看: 1447|回复: 0

[经验分享] memcache

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-10 08:53:02 | 显示全部楼层 |阅读模式
Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

memcache 是一个 C/S 结构server 端:memcachedclient 端:memcache



运行模式: C/S

端口号:11211
[iyunv@silence80 ~]# vim /etc/services
wKiom1XHYszg0-dmAAEx-WEKNEA216.jpg

作用:

memcached 可以缓存 mysql 的查询结果,优化 mysql  I/O。

运行机制: 普通情况:

user ->web->mysql
wKiom1XHY4rBFYJDAAFR7OITVNI125.jpg

使用 memcache 情况:

user->web  ->memcache->mysql

wKiom1XHY57D9gDiAAFYfpmC1bc468.jpg
1) memcache 的优先级大于 mysql,查找数据流程:
web 向数据库取数据的时候        优先去找 memcache

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

2) 数据放到 memcache 会优化 mysql  I/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.gz  memcached-1.4.22.tar.gz
安装 libevent
[iyunv@silence80 ~]# tar zxvf libevent-2.0.22-stable.tar.gz
[iyunv@silence80 ~]# cd libevent-2.0.22-stable
[iyunv@silence80 libevent-2.0.22-stable]# ./configure   --prefix=/usr/local/libevent   #检查 系统编译环境
[iyunv@silence80 libevent-2.0.22-stable]# make   -j   4        # 将源码编译成二进制,   -j   4 使用
4 个进程同时编译
[iyunv@silence80 libevent-2.0.22-stable]# make install   #安装 查看安装后的文件:
[iyunv@silence80 libevent-2.0.22-stable]# ls /usr/local/libevent/
bin   include   lib


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


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


查看端口:
[iyunv@silence80 ~]# 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
[iyunv@silence80 ~]# 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...        ########################################### [100%]
1:telnet        ########################################### [100%]


实例:使用 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 存储数据
[iyunv@silence80 ~]# 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 中自带这个命令文件:


查看:
[iyunv@silence80 memcache-2.2.7]#ls   /server/php-5.4-nginx/bin/phpize


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


[iyunv@silence80 memcache-2.2.7]# /server/php-5.4-nginx/bin/phpize
Configuring for:
PHP Api Version:        20100412
Zend Module Api No:        20100525
Zend Extension Api No:        220100525
[iyunv@silence80 memcache-2.2.7]# 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.c  README configure          memcache.dsp                 run-tests.php
注:发现多了很多文件
编译安装:
# ./configure --enable-memcache --with-php-config=/server/php-5.4-nginx/bin/php-config
[iyunv@silence80 memcache-2.2.7]# 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'.


[iyunv@silence80 memcache-2.2.7]# make install
Installing shared extensions:
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/
查看编译出来的模块:
[iyunv@silence80 memcache-2.2.7]# 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()凼数来查看
[iyunv@silence80 memcache-2.2.7]# cat /server/nginx-1.2.8/html/a.php
<?php
phpinfo();
?>
查看 memcache 相关内容,注:没有添加时,是看不到的
wKioL1XHaAXTuRxPAAKrjyA47Xg725.jpg
[iyunv@silence80 ~]# 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
[iyunv@silence80 ~]# ls
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/
memcache.so
#能看到 memcache.so


重新启动 php-fpm
[iyunv@silence80 ~]# /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 相关内容,注:没有添加时,是看不到的

wKioL1XHaKLxN2JJAAH5uJTjlfI436.jpg

2) memcache 和 memcached 的连接写一个 php 页面

[iyunv@silence80~]# 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!  说明成功

wKiom1XHZzTwEzUxAAEHJHCwDy4770.jpg
实战 3:开始缓存 mysql 数据


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


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


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


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

上传脚本到/var/www/html下
wKiom1XHaDayrESKAAF3De7aQsc760.jpg

访问测试页面:

http://192.168.1.63/memcached_page/
如果显示不正常,调一下编码
wKioL1XHaqmBNm2yAAGM1nyRjBQ671.jpg
读测试
wKiom1XHaVrRTkK9AAGjUYCN4ps802.jpg
wKioL1XHa-mw45foAAH1lSkN7zM791.jpg
写测试

wKioL1XHbCui9bs0AAKH6ty8dzM406.jpg

写完之后到读测试那边去查询
wKiom1XHanGAgJdZAAH0QmBq3mw254.jpg


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-96745-1-1.html 上篇帖子: linux下安装php扩展memcache 下篇帖子: memcache安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表