Memcached技术笔记

Memcache技术笔记

一、基本概念

1. 缘起: 

在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是Web中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。此时Memcached或许是你想要的。

2. Memcached是什么?

Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

3. Memcached能缓存什么?

通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

4. Memcached快么?

非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态),使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1)。
Danga Interactive为提升Danga Interactive的速度研发了Memcached。

5. Memcached的特点

Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问,因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

缓存数据:

1.在内存中缓存数据

2.数据形态以key->value结构

3.安全度非常差的

软件:

1.memcache模块
让php支持memcache的函数,可以去连接memcache服务,进行增、删、改、查
2.memcached 提供memcache服务,11211

学习memcache:
1.memcache服务器操作
2.用php去操作memcache

一.环境介绍

1)CentOS 7

1
2
[root@XiaoFeng html]# cat /etc/centos-release
CentOS Linux release 7.1.1503 (Core)

2) memcached-1.4.25

二.部署安装

计划具体部署步骤:
步骤1:安装
步骤2:配置
步骤3:运行
步骤4:检查
现在开始:
1)安装

1
2
3
4
5
6
7
8
9
10
11
12
[root@XiaoFeng ]yum install -y wget gcc
[root@XiaoFeng lnmp]#wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
[root@XiaoFeng lnmp]# tar zxvf libevent-2.0.21-stable.tar.gz
[root@XiaoFeng lnmp]# cd libevent-2.0.21-stable
[root@XiaoFeng libevent-2.0.21-stable]#./configure --prefix=/usr/local/libevent
[root@XiaoFeng libevent-2.0.21-stable]# make && make install
[root@XiaoFeng lnmp]#wget http://www.memcached.org/files/memcached-1.4.25.tar.gz
[root@XiaoFeng lnmp]#tar xf memcached-1.4.25.tar.gz
[root@XiaoFeng lnmp]#memcached-1.4.25
[root@XiaoFeng memcached-1.4.25]#./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@XiaoFeng memcached-1.4.25]# make && make install
[root@XiaoFeng memcached-1.4.25]#ln -s /usr/local/memcached/bin/memcached /usr/local/bin/

2)配置开机启动

1
2
3
[root@XiaoFeng memcached-1.4.25]# touch /etc/init.d/memcached
[root@XiaoFeng memcached-1.4.25]# chmod 755 /etc/init.d/memcached
[root@XiaoFeng memcached-1.4.25]# vi /etc/init.d/memcached

复制下面的内容到memcached文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/sh
#
# memcached: MemCached Daemon
#
# chkconfig: - 90 25
# description: MemCached Daemon
#
# Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
start()
{
echo -n $"Starting memcached: "
daemon /usr/local/bin/memcached -u daemon -d -m 2048 -l 0.0.0.0 -c 4096 -p 11211
echo
}
stop()
{
echo -n $"Shutting down memcached: "
killproc memcached
echo
}
[ -f /usr/local/bin/memcached ] || exit 0
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
condrestart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|condrestart}"
exit 1
esac
exit 0

3)运行
[root@XiaoFeng memcached-1.4.25]# /etc/init.d/memcached start
[root@XiaoFeng memcached-1.4.25]# chkconfig memcached on
4)检查
主要是检查进程以及端口

[root@XiaoFeng memcached-1.4.25]# ps aux|grep memcached
[root@XiaoFeng memcached-1.4.25]# netstat -ntlp|grep memcached
[root@XiaoFeng memcached-1.4.25]# echo "stats settings" | nc 127.0.0.1 11211

5)连接测试

C:\Users\枫叶>telnet 192.168.1.125 11211

stats memcache命令:查看当前状态

参考:
Stats这里显示了很多状态信息,下边详细解释每个状态项:
STAT pid 1552 服务进程的进程ID
STAT uptime 3792 服务从启动到当前所经过的时间,单位是秒。
STAT time 1262517674 服务器所在主机当前系统的时间,单位是秒。
STAT version 1.2.6 组件的版本。这里是我当前使用的1.2.6。
STAT pointer_size 32 服务器所在主机操作系统的指针大小,一般为32或64.
STAT curr_items 1 表示存放当前的所有缓存对象的数量。不包括已经从缓存中删除的对象。
STAT total_items 2 表示从启动到当前,系统存储过的所有对象数量,包括已经删除的对象。
STAT bytes 593 表示系统存储缓存对象所使用的存储空间,单位为字节。
STAT curr_connections 2 表示当前系统打开的连接数。
STAT total_connections 28 表示从memcached服务启动到当前时间,系统打开过的连接的总数。
STAT connection_structures 9表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量,这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
STAT cmd_get 3 累积获取数据的数量,这里是3,因为我测试过3次,第一次因为没有序列化对象,所以获取数据失败,是null,后边有2次是我用不同对象测试了2次。
STAT cmd_set 2 累积保存数据的树立数量,这里是2.虽然我存储了3次,但是第一次因为没有序列化,所以没有保存到缓存,也就没有记录。
STAT get_hits 2 表示获取数据成功的次数。
STAT get_misses 1 表示获取数据失败的次数。
STAT evictions 0 为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。比如超过缓存大小时根据LRU算法移除的对象,以及过期的对象。
STAT bytes_read 1284 memcached服务器从网络读取的总的字节数。
STAT bytes_written 5362 memcached服务器发送到网络的总的字节数。
STAT limit_maxbytes 67108864 memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M.与我们启动memcached服务设置的大小一致。
STAT threads 1 被请求的工作线程的总数量。
END

PHP安装对Memcached的支持

php有两个版本的memcached客户端这里介绍memcached这个是新版的客户端基于libmemcached,所以必须要安装libmemcached

1
2
3
4
5
6
[root@XiaoFeng lnmp]#
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
[root@XiaoFeng lnmp]# tar -zxf libmemcached-1.0.18.tar.gz
[root@XiaoFeng lnmp]# cd libmemcached-1.0.18
[root@XiaoFeng libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached
[root@XiaoFeng libmemcached-1.0.18]# make && make install

安装Memcached的PHP扩展

[root@XiaoFeng lnmp]#wget https://pecl.php.net/get/memcached-2.2.0.tgz
[root@XiaoFeng lnmp]# tar -xzf memcached-2.2.0.tgz

解压后的源码没有配置文件需要先生成配置文件phpize

1
2
3
[root@XiaoFeng memcached-2.2.0]# /usr/local/php/bin/phpize
[root@XiaoFeng memcached-2.2.0]# ./configure --enable-memcached --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
[root@XiaoFeng memcached-2.2.0]# make && make install

修改php.ini添加extension = “memcached.so”就可以
[root@XiaoFeng memcached-2.2.0]#cd /usr/local/php/etc
[root@XiaoFeng etc]# vim php.ini
写个php文件测试,输出hello world!就说明ok啦!

1
2
3
4
5
6
7
<?php
$mem = new Memcached;
$mem->addServer('127.0.0.1',11211);
$mem->set('test',"hello world!");
$val = $mem->get('test');
echo $val;
?>

PHP缓存

PHP缓存
PHP缓存
PHP基于文件的缓存,在PHP文件中最后加上下方代码,就可以生成html文件,web主机可以设置为index.html为优先

1
2
3
<?php
file_put_contents('./index.html', ob_get_contents());
?>

连接多个Memcached服务器实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php 
//实例化Memcached
$mem = new Memcached();

//连接memcached服务
//$mem->connect('127.0.0.1', 11211);
//$mem->connect('192.168.25.6', 11211);

//连接多个服务器
$mem->addServer('192.168.25.6', 11211);
$mem->addServer('192.168.25.3', 11211);
$mem->addServer('192.168.25.44', 11211);
$mem->addServer('192.168.25.55', 11211);
$mem->addServer('192.168.25.68', 11211);
$mem->addServer('192.168.25.253', 11211);


//添加数据
$mem->set('data1', 'hello,jiabrother1',3600);
$mem->set('data2', 'hello,jiabrother2',3600);
$mem->set('data3', 'hello,jiabrother3',3600);
$mem->set('data4', 'hello,jiabrother4',3600);
$mem->set('data5', 'hello,jiabrother5',3600);
$mem->set('data6', 'hello,jiabrother6',3600);


echo $mem->get('data1');


//关闭连接
$mem->close();
?>

本文出自 “小风博客” BY:小风 如果你喜欢,转载请务必保留此出处^_^
小风博客  http://www.xfphp.cn  小风网络 http://www.hotxf.com