您的位置:首页 > 数据库 > Memcache

memcache

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

memcache 是一个 C/S 结构server 端:memcachedclient 端:memcache 运行模式: C/S端口号:11211
[root@silence80 ~]# vim /etc/services


作用:memcached 可以缓存 mysql 的查询结果,优化 mysql I/O。
运行机制: 普通情况:user ->web->mysql


使用 memcache 情况:user->web ->memcache->mysql

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

安装服务器端:memcached
[root@silence80 ~]# tar zxvf memcached-1.4.22.tar.gz
[root@silence80 ~]# cd memcached-1.4.22
[root@silence80 memcached-1.4.22]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
[root@silence80 memcached-1.4.22]# make -j 4
[root@silence80 memcached-1.4.22]# make install
[root@silence80 memcached-1.4.22]# echo $?
0
启动 memcached
[root@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
[root@silence80 memcached-1.4.22]# echo $?
0
参数:
-u user
-p port
-l listen

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

查看端口:
[root@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
[root@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 存储数据
[root@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 中自带这个命令文件:

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

生成 memcache 客户端模块
[root@silence80 ~]# tar -zxvf memcache-2.2.7.tgz
[root@silence80 ~]# cd /root/memcache-2.2.7
[root@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

[root@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
[root@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
[root@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'.

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


[root@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
[root@silence80 ~]# ls
/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/
memcache.so
#能看到 memcache.so

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



2) memcache 和 memcached 的连接写一个 php 页面[root@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! 说明成功

实战 3:开始缓存 mysql 数据

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

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

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

[root@silence80 ~]# mysql -uroot -p123456 -e "create database db1"
[root@silence80 ~]# mysql -uroot -p123456 -e "use db1;create table T1(ID
int)ENGINE=innodb"
[root@silence80 ~]# 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/
如果显示不正常,调一下编码


读测试





写测试




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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: