memcached相关总结

Memcache技术概述

Memcached 是国外社区网站LiveJournal的开发团队开发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。

memcached memory cache = 内存缓存!

就是把数据存储在内存中的管理设备

数据库的数据:把数据库的数据使用PHP处理之后的数据存储进来;

静态化的数据:静态资源都是可以存储到这里的!

memcached与mysql存储的数据区别:

memcached里面的数据,如果没有,就可以到mysql存储的数据里面去查询。

memcached里面的数据,是临时的,可以消失的,也是不重要的。

mysql里面的数据,是非常重要的,不能遗失的!

memcached特性:

memcached的数据是不可持久化,只能保存在内存里面。

持久化:把数据存储到硬盘!

memcached只支持key=>value的数据结构,所以只有字符型。

memcached的key支持250字节;

memcached的value支持1M大小;

memcached的数据不可备份不可主从

我们memcached放弃了一些东西,得到了高速的响应速度。

memcached可以支持的并发数量上万。所有很多时候,memcached都不会成为网站的瓶颈。

在代码里使用它:

//连接memcached
...
$data = $mem -> get('data');
if(empty($data))
{
    //连接MySQL获取新的数据
    ...
    $ret = mysqli_query($db, $sql);
    //处理ret
    ...
    $data  //处理完成之后,得到data数据
    //存储到memcached
    $mem -> set('data', $data);
}

Memcache软件安装(linux下)

1、下载这个软件

http://memcached.org/

2、在linux上面查看

(1)解压

解压软件和依赖软件:

tar -zxf memcached-1.4.34.tar.gztar -zxf libevent-2.0.22-stable.tar.gz

(2)安装依赖包

进入到依赖包的文件夹里,查看帮助信息:./configure --help

确定使用的参数:–prefix:安装的位置

进行源码安装:

./configure --prefix=/usr/local/libevent && make && make install

(3)安装memcached

进入memcached的目录,查看帮助信息:./configure --help

确定使用的参数:

–prefix:安装的位置

–with-libevent:依赖安装的位置

进行源码安装:

./configure --prefix=/working/memcached \ --with-libevent=/usr/local/libevent/

make && make install

(4)查看帮助信息

/working/memcached/bin/memcached -h

需要知道的参数:

-p:默认端口号是11211,可使用-p来修改

-d:守护进程,后台运行

-u:指定运行的用户,是root

-m:管理的内存

-c:同时连接数

3、启动Memcache服务器

/working/memcached/bin/memcached -d -u root

查看是否启动成功,查看进程:

ps aux | grep memcached

PID号,就是主进程(父进程)的进程号。有一些程序直接写在文件里面的。

查看端口号:

netstat -tanp | grep memcached

4、连接Memcache服务器

找到客户端:telnet 192.168.xxx.xx 11211

如果没有连接成功,可能是linux防火墙没有通过11211这个端口

关闭防火墙:

(1)临时关闭:立即生效

service iptables stop

(2)永久关闭:重启之后生效

# chkconfig --list iptables
iptables  0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用
这个数字表示的是开机启动的模式;终端模式是3;图形化是5;
启用:表示使用该模式启动的时候,该程序会被启动。
关闭:表示使用该模式。程序不会随系统启动。

chkconfig --level 2345 iptables off

在关闭防火墙后再使用telnet登录。

5、Memcache命令详解

可以使用终端使用telnet命令,连接上我们的memcached服务器!请注意,我们使用的telnet命令,并不是我们memcached专用的客户端,有可能会出现小问题,这都是正常!

我们在telnet连接的命令窗口操作的命令,是我们窗口操作模式的实现,我们在PHP里面的操作,是完全不一样的。

(1)命令

xshell中使用telnet连接的命令,是为了方便我们检查服务器里面的数据;假如你使用PHP写入数据在memcached服务器里面了,这个时候,你想要检查正确与否,就使用xshell使用telent连接上服务器,进行数据检查!

add :添加数据。只能添加key是不存在的。如果key是存在的就报错

add key 0 0 4

比如:add name 0 0 5 回车后输入:luhao即可保存

key :设置一个下标

0:压缩

0:时间

4:你要设置的值,是4个字节

set:添加数据。如果key是存在的,就直接覆盖。set key 0 0 4

比如:set age 0 0 2 回车后输入:12

get:获得值get key

比如:get age

incr:指定增加多少。incr key 10

比如:incr age 10 //年龄+10

decr:指定减少多少。

decr age 10

decr与incr可以操作的最大范围是2^64无符号:0 – (2^64 – 1)

只能在这个范围里面去设置,过了这个范围,就会报错。

当incr到达最大值的时候,比如set age 0 0 20 -> 18446744073709551610 -> incr age 1

age的值会变成0。所以,使用incr到达最大值的时候,会直接从0开始,继续向前加。

而decr在到达最小值的时候,一直减下去,依然是0。

delete:删除一个key;delete key

比如:delete age

flush_all:清空;flush_all

清空时要注意,不要随便清空数据,因为在数据库里会有别人项目的数据。

stats:查看状态;stats

当我们使用get一次的时候,获取到了数据就是命中;没有获取到数据,就是未命中 。

memcached是缓存设置,是为了解决mysql连接的问题。所以我们缓存的数据,应该保持比较高的命中,这样才能解决mysql连接的问题。

如果命中不高,就证明缓存的数据有问题了。应该重新设置一下缓存数据。让缓存有意义。

(2)PHP中memcached扩展的对象方法对比

如果用PHP操作memcached,必须把PHP变成memcached服务器的客户端,就要安装memcached的扩展。安装好了,就变成客户端了。

安装客户端的时候,你安装的是memcache,查看文档的时候,就找memcache,你安装的是memcached,你看文档的时候,就是memcached。

memcache不支持PHP7;memcached支持PHP7。

public bool Memcached::add(string $key, mixed $value [, int $expiration])

该方法,如果key已经在服务端存在,此操作会失败。其中参数expiration,是到期时间,默认为0,如果该值设置为默认0时,则此元素永不过期(但是它可能由于服务器为了给其它新元素分配空间而被删除)。

public bool Memcached::set(string $key, mixed $value [, int $expiration])

该方法,将value存储在memcached服务器上的key下,如果有expiration参数,则可以控制值的过期时间。值可以是任何有效的非资源型php类型,因为资源类型不能被序列化存储。如果Memcached::OPT_COMPRESSION选项开始,序列化的值会同样被压缩存储。

注意:资源类型的不能被序列化,所以不可以存储到memcached里面。

6、PHP中使用Memcache

(1)在linux中安装扩展memcached.so

到扩展网站,下载对应文件包:

http://pecl.php.net/package-search.php?pkg_name=memcache&bool=AND&submit=Search

上传到linux中,解压后开始操作。

①安装依赖

进入到解压的依赖目录中/libmemcached-1.0.18

./configure --prefix=/usr/local/libmemcached && make && make install

②安装memcached扩展

进入到memcached扩展目录memcached-3.0.4

但是在该目录中没有找到configure文件!

configure这个文件,必须由你为哪一个PHP版本生成扩展,就由这个版本的phpize程序执行完成来生成的。

找到php安装目录开始操作

/working/php7/bin/phpize回车,即可生成memcached的configure文件

回到memcached安装目录,查看帮助信息:./configure --help确定参数。

–prefix :严重警告!!给PHP安装扩展的时候,不要指定安装的位置!!

–with-php-config :这个就是PHP版本里面的php-config的绝对路径。确定你找的这个php-config的绝对路径,是与上面生成configure的phpize程序是同一个版本下面的。

php-config phpize :这2个程序,必须是同一个PHP版本下面的。

–with-libmemcached-dir :安装的依赖路径。

检查环境,生成makefile文件

./configure --with-libmemcached-dir=/usr/local/libmemcached/ --with-php-config=/working/php7/bin/php-config

如果出现报错是缺少一个sasl.h这个依赖,可以选择不安装,这个依赖不是必须存在的。

关闭来操作:

./configure --with-libmemcached-dir=/usr/local/libmemcached/ --with-php-config=/working/php7/bin/php-config --disable-memcached-sasl

安装到系统:make && make insatll

安装完成后可以到目录/working/php7/lib/php/extensions/no-debug-zts-20160303下,可以看到memcached.so,这个就是生成的扩展文件。

注:linux上的php扩展,都是以.so结尾!

打开php.ini,大概在900+行的位置,配置添加:extension=memcached.so

重启Apache!

③检查扩展

方式一:php -m

方式二:用php程序来执行phpinfo.php页面

/working/php7/bin/php /站点目录/phpinfo.php | grep memcached

(2)php连接memcache服务器

//连接memcached
$mem = new memcached();
$mem -> addServer('192.168.xxx.xx', 11211);
$res = $mem -> getStats();
var_dump($res);

7、探究Memcache能存储的数据类型

(1)使用PHP存储标量类型

字符类型:

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$str = 'qwerty';
$mem -> set('str', $str);

执行页面后,进入memcached服务器查看:

get str

布尔类型

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);

$true = true;
$mem -> set('true', $true);
$false = false;
$mem -> set('false', $false);

执行页面后,进入memcached服务器查看:

get true

get false

说明:当我们存储数据的时候,memcached扩展帮助我们实现了隐式转换,然后在存储到memcached服务器。

整型类型

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$int = 123;
mem -> set('int', $int);

执行页面后,进入memcached服务器查看:

get int

浮点类型

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$f = 123.123;
mem -> set('f', $f);

执行页面后,进入memcached服务器查看:

get f

通过这四种类型,都可以正常存储

(2)使用PHP存储复合类型

数组

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$arr = [1, 2, 3, 4];
mem -> set('arr', $arr);

执行页面后,进入memcached服务器查看:

get arr

这个数据,就是memcached扩展帮助我们序列化之后,存储到里面的。获得的时候,memcached扩展也会帮助我们反序列化回来。

对象

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$obj = new A;
$mem -> set('obj', $obj);
$res = $mem -> get('obj');
var_dump($res -> getName());

class A
{
    public $name = 'zhangsan';
    public function getName()
    {
        return $this -> name;
    }
}

执行页面后,由于在代码中有打印代码,所以会在浏览器中显示出“zhangsan”。

进入服务器查看:get obj

服务器存储的数据,就是序列化之后的结果。

(3)使用PHP存储特殊类型

null

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$null = NULL;
$mem -> ('null', $null);
$res = $mem -> get('null');
var_dump($res);

查看服务器:get null

结果:这个也是序列化之后的数据。

资源

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$re = $mem;
$mem -> set('re', $re);

$res = $mem -> get('re');
var_dump($res -> getStats());

访问浏览器时出现报错!

原因:资源类型不能被序列化存储。

    原文作者:宠辱不惊丶岁月静好
    原文地址: https://www.jianshu.com/p/1ddd33c3b9ed
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞