一、memcache的介绍
1、memcached基本概念
(1)Memcached是danga的一个项目,最早是LiveJournal服务的,最初为了加速LiveJournal访问速度而开发的,后来被很多大型的网站采用。
官方网站: www.danga.com 和 http://memcached.org
(2)Memcached是一个高性能的分布式的内存对象缓存系统,
用于构建大负载的网站,来分担数据库的压力,
简单的说就是将频繁访问的数据存储到内存中,然后从内存中读取,从而大大提高读取速度。
学习资源:http://www.runoob.com/memcach...
2、基本原理
当前客户端首次访问热点新闻时,从数据库里面取出,并把该热点信息数据给给缓存到服务器的内存里面,后续用户访问时,直接从内存里面获取数据,返回即可。
3、与mysql比较
(1)与mysql一样,是一个c(client)/s(server)架构的软件。(2)mysql里面的数据,是存储到硬盘里面的,memcache里面的数据是存储到内存里面的,
服务器一旦断电后重启,则存储到内存里面的数据就丢失。
(3)数据存储到mysql里面,则需要先建立数据库,建立表,设计字段。在memcache里面数据的存储形式是key,value方式,(键值对方式),可以理解成两列的表。
name 小刚
age 12
email [email protected]
二、安装
先下载软件,拷贝到一个具体位置,一般是和环境软件在一块。
- 以管理员的方式,进入cmd,并进入到memcached软件所在的目录
通过memcached -h 查看安装成服务的一些指令
- 执行memcached –d install进行安装
- 安装完成后,进入启动
windows下dos命令窗口输入netstat -ano即可查看端口使用情况,
如果要查看指定端口是否被占用可以使用命令
netstat -ano|findstr 端口号
注意:也可以无需安装,直接启动memcache软件
三、操作memcache软件
1、使用客户端连接memcache
语法:
telnet ip地址 端口号
按回车出现如下界面链接成功,
若提示“telnet不是内部或外部指令”
解决:安装本电脑的telnet客户端服务即可。
控制面板--->程序和功能--->打开或关闭windows服务--->Telnet客户端
使用其它工具通过telnet协议连接memcache
2、设置数据
1、添加数据
语法:
add key 0|1 失效时间 数据长度
key :键的名称
0|1:是否压缩,0表示不压缩,1表示要压缩,
失效时间:缓存周期,单位是秒
数据长度:单位是字节,
注意:使用add指令,添加数据时,如果键已经存在,则添加失败
2、修改数据
语法:
replace key 0|1 失效时间 数据长度
注意:在修改时,如果键不存在,则修改失败。
3、设置数据
语法:
set key 0|1 失效时间 数据长度
使用set 操作,如果键已经存在,则是修改,如果键没有存在,则是添加。
3、获取数据
语法:
get 键名
4、删除数据
删除单个数据
delete key
删除所有数据,(在实际工作中,要慎用)
flush_all
5、其它指令
incr :加法操作,相加指定的值,返回相加后的结果,
语法:incr key value
decr :减法操作,减去指定的值,返回相减后的结果,
语法:decr key value
可以使用该指令来模拟抢购,比如有1000件商品,在60秒完成抢购,
set number 0 60 4
1000
用户抢购一次,数值减一,当减到0时,抢购结束。
decr number 1
6、状态指令
语法命令:stats
主要通过该命令来计算memcache的效率(命中率)
命中率计算:get_hist/cmd_get
如果命中率非常低,则说明memcache低效。需要调整缓存的数据。
7、失效时间
失效时间,有两种设置方式:
(1)时间间隔(秒数)。 时间间隔 最大不能超过2592000秒(30天)。(2)失效的时间戳。 大于当前时间戳才有效。
案例1:比如我们要设置一个缓存项,想要缓存20天,应该如何设置
第一种方式,使用时间间隔 20*24*3600
第二种方式:使用时间戳 time()+20*24*3600
案例2:比如我们要设置一个缓存项,想要缓存40天,应该如何设置
此时就只有一种方式,使用到期的时间戳。time()+40*24*3600
注意:时间间隔与时间戳都是整数,如何来区别呢?
如果整数小于2592000,则是时间间隔
如果要使用时间戳,则必须大于当前的时间戳。
8、key与value的限制
设置key的长度不要超过250个字节。value的大小不要超过1MB的数据。
四、使用php来操作memcache
1、安装memcache扩展
memcached这个扩展是memcache扩展的升级版。
windows环境下memcached没有dll扩展,那你想在windows下跟memcache这个产品通信怎么办?
那就只能装memcached扩展的前身,memcache.dll。
实际项目中会在php代码层面判断运行环境拥有哪个拓展就调用哪个
开发环境大多是WIN,就用memcache
生成环境大多Linux,就用memcached
if (extension_loaded('memcached')) {
$this->cache = new \Memcached;
}else if(extension_loaded ('memcache'))
$this->cache = new \Memcache;
else{
$this->active = false;
Log::error('Cache not support!');
return false;
}
- 准备扩展文件
通过phpinfo()函数查看php的版本。
注意: 扩展文件要和php的版本相对应。
- 把对应的扩展文件,拷贝到php的安装目录的ext目录里面。
- 打开php.ini配置文件,进行配置加载memcache的扩展。
- 重启apache,通过phpinfo 函数进行测试,如果出现如下提示,则证明已经安装成功。
2、入门测试
在php的手册里面,给我们提供了一个memcache的类,使用该类的一些方法完成操作。
获取数据
注意点:
在使用memache类操作时,里面的方法有些是和命令是不一样的。比如
$res = $mem->getStats();
$res = $mem->increment();
3、php数据类型探讨存入memcache
php数据类型有标量和非标量
标量:整型 小数型 字符串 布尔非标量:数组 资源 对象 null
- 标量数据,存储到memcache里面
说明:如果是标量数据存储到memcache里面,则取出数据时,保持原样类型。
- 非标量数据,存储到memcache里面
非标量数据:序列化后再存入到memcached服务器中,得到时反序列化工作。
序列化与反序列化过程,是由memcache的扩展完成的,无需我们自己干预。
什么是序列化:
就是在保存数据时,不但保存数据本身,还保存数据类型。a.利于在网络间进行数据传输
b.便于重新读取并恢复数据
Memcached本身没有数据类型之分(内部都是以字符串的形式处理的)
但是,php是存在数据类型。
总结:除了资源类型之外,其他的类型我们都可以存储,当然一般是存储字符串和数组。
4、案例1:缓存sql语句的执行结果
5、案例2:缓存新闻详情内容
新闻列表页
新闻详情页
6、memcache在tp5框架中使用
ThinkPHP采用think\Cache
类(实际使用think\facade\Cache
类即可)提供缓存功能支持。
内置支持的缓存类型包括file、memcache、wincache、sqlite、redis和xcache。
在配置目录下面的cache.php
文件中,进行如下配置:
public function del()
{
$res = Cache::rm('age');
dump($res);
}
五、memcache分布式配置
1、简介说明
Memcached是一个高性能的分布式的内存对象缓存系统
每台服务器写、读操作都有
把对memcache的许多操作平均地给各个分支服务器完成
memcache可使用的内存空间是多个服务器空间的“算术和”
php无需关心具体操作是那个memcache服务器,在memcache内部有具体算法,帮助php实现具体分发(操作的memcache)
2、具体搭建步骤使用
分布式的多个memcache服务搭建:
① 在一台服务器里边开启多个memcache服务② 给多台服务器分别安装memcache服务
环境搭建:至少需要两台memcache服务器,
第一台:localhost 11211端口的第二台:localhost 8888
设置数据代码:
$mem = new Memcache();
//连接三台memcache服务器
$mem->addServer('192.168.1.100',11211);
$mem->addServer('192.168.1.200',11211);
$mem->addServer('192.168.1.210',11211);
//设置缓存数据
$mem->set('name','xiaogang',0,3600);
$mem->set('age', 12, 0, 3600);
$mem->set('email', '[email protected]', 0, 3600);
$mem->set('height',189,0,3600);
获取数据
$mem = new Memcache();
//连接三台memcache服务器
$mem->addServer('192.168.1.100',11211);
$mem->addServer('192.168.1.200',11211);
$mem->addServer('192.168.1.210',11211);
//取数据
$name = $mem->get('name');
$age = $mem->get('age');
$email = $mem->get('email');
$height = $mem->get('height');
需要注意:
存储和获取数据时,根据一个算法,来计算存储到哪台服务器,或从哪台服务器取出数据。默认使用取模算法,在存储数据时,根据数据的键,转换成数字和memcache服务器的个数取模,取模的结果,就决定向哪台服务器存储。
在取出数据时,也是根据键,转换成数字,和memcache服务器的个数取模,取模的结果,就决定向哪台服务器获取数据。
六、session数据存入memcache
需要在php.ini文件里面进行配置,session数据入memcache.
(1)session.save_handler 配置session的存储方式。(2)session.save_path 指定session的存储位置
我们可以使用一个函数ini_set(),完成php.ini里面的一些配置,该配置只能在当前页面有效。
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://localhost:11210');
存储数据的代码:
注意:把session数据存储到memcache里面,是以session_id为键的。
获取数据的代码:
七、其他问题
1、memcache适合存储哪些数据
(1)访问比较频繁的数据,安全性差的数据,丢失无所谓的数据。(2)数据更新,比较频繁的数据,比如用户的在线状态。
(3)数据的单个键值不能太大,不要超过1Mb数据。
2、惰性删除
Lazy Expiration
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。
这种技术被称为lazy(惰性)expiration。
因此,memcached不会在过期监视上耗费CPU时间
3、最近最少使用原则
LRU,least Recently Used,最近最少使用原则。memcache在插入新数据时,如果空间不足时,采用删除旧缓存项策略,删除最不活跃的缓存项。
4、安全性的问题
在memcache里面,没有设置安全认证机制,因为memache就是专做缓存使用,主要突出缓存优势。
一般情况下,memcache服务器是在内网中的,不会暴露在公网中,因此一些恶意用户就无法操作memcache服务器。
-l 连接的IP地址, 默认是本机
5、缓存雪崩问题
如果在设置缓存周期时,设置的缓存周期都一样,当正好赶上高并发时,如果缓存都同时失效,则会把请求涌向mysql服务器,mysql服务器有可能会出现宕机现象
解决方案:设置不同的缓存周期。
八、Linux环境下安装
Linux系统安装memcached,首先要先安装libevent库。
yum install libevent libevent-devel
注:因为memcached依赖于libevent库,因此,需要先编译libevent
编译Memcached时,要指定Libevent
1、安装libevent软件
(1)下载libevent软件,上传到linux服务器,解压
tar -zxvf libevent-2.0.21-stable.tar.gz
(2)进入解压目录
cd libevent-2.0.21-stable
(3)进行配置
./configure --prefix=/usr/local/libevent
4)编译安装
make && make install
2、安装memcache
(1)解压
tar -zxvf memcached-1.4.24.tar.gz
(2)进入解压的目录
cd memcached-1.4.24
(3)配置
./configure --prefix=/usr/local/memcache --with-libevent=/usr/local/libevent
(4)编译安装
make && make install
注意,linux下面memcache的安装位置,启动时,使用bin目录下面的memcached启动;
启动:
-d选项是启动一个守护进程,-m是分配给Memcache使用的内存数量,单位是MB,默认是64MB
-u是运行Memcache的用户,
-l是监听的服务器IP地址,
-p是设置Memcache监听的端口,默认是11211,最好是1024以上的端口
-c选项是最大运行的并发连接数,默认是1024,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid
-M关闭最近最少使用原则,当空间不足时,就返回一个错误;