memcache

  • 2019-09-05
  • 63
  • 0
  • 0

memcache

可以用来缓存数据,并且将数据缓存到内存中,不支持数据的持久化,支持分布式

分布式部署memcache的工作流程

memcache客户端:

API:应用程序接口,可以由多种语言实现,接收客户端请求并响应客户端,接收请求之后需要交给路由算法

路由算法:根据算法匹配客户端请求的数据存放在哪台缓存节点,并将该节点的IP与端口返回给API

一致性哈希算法,虚拟出一个长度为2^32的哈希环,对通过缓存节点的标识(ip,端口)进行哈希计算得到的值映射到哈希环对应的位置,对要缓存的数据也进行哈希计算,得到的值也映射到哈希环对应的位置,按照顺时针的方向将数据缓存到离自己最进的缓存节点上

通讯通道:API通过该通道与指定的缓存节点进行通信,API发送数据请求,缓存节点做出响应

memcache缓存节点:缓存动态数据节点之间互不通信

如果缓存节点都没有客户端所请求的数据,那么该请求会被交给后端数据库,数据库做出响应并且把该数据交给memcache进行缓存,根据路由算法将数据缓存到合适的节点

 

memcache常用指令

set:创建键值对,如果指定的键值对已存在,则会对值进行覆盖

格式:set key flag timeout length

value:值

get:值获取指定键对应的值

格式:get key

delete:删除指定的键值对

格式:delete key

append:对指定的键的内容进行追加

格式:append  key flag  timeout  length  uppend_value

flush_all: 清空所有键值对,危险操作,慎用

quit:退出

实验环境

实验步骤

安装libevent

[root@localhost ~]# tar -zxvf libevent-2.0.22-stable.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/libevent-2.0.22-stable/
[root@localhost libevent-2.0.22-stable]# ./configure --prefix=/usr/local/libevent && make && make install

安装memcached

[root@localhost ~]# tar -zxvf memcached-1.5.9.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/memcached-1.5.9/
[root@localhost memcached-1.5.9]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent && make && make install

路径优化

[root@localhost memcached-1.5.9]# ln -s /usr/local/memcached/bin/* /usr/local/bin/

启动memcached

[root@localhost memcached-1.5.9]# memcached -d -l 192.168.1.11 -p 11211 -P /usr/local/memcached/memcaCHE.pid -m 512M -c 2048 -u root

检查端口是否开启

[root@localhost memcached-1.5.9]# netstat -anpt | grep memcached
tcp 0 0 192.168.1.11:11211 0.0.0.0:* LISTEN 17875/memcached

安装memcache

[root@localhost ~]# tar -zxvf memcache-2.2.7.tgz -C /usr/src/
[root@localhost ~]# cd /usr/src/memcache-2.2.7/
[root@localhost memcache-2.2.7]# yum -y install autoconf
[root@localhost memcache-2.2.7]# phpize 
# 如果提示未找到命令,就对PHP做软链接,然后再执行phpize
[root@localhost memcache-2.2.7]# ln -s /usr/local/php/bin/* /usr/local/bin/
[root@localhost memcache-2.2.7]# phpize 
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
# 执行完phpize后,就会发现memcache目录里面多了configure文件
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config && make && make install

PHP添加扩展

[root@localhost memcache-2.2.7]# vim /usr/local/php/php.ini 
# 在最后一行添加
extension=memcache.so
[root@localhost memcache-2.2.7]# service php-fpm restart

编辑PHP首页文件

[root@localhost memcache-2.2.7]# vim /usr/local/nginx/html/index.php
<?php
    phpinfo();
        $servername="192.168.1.11";
        $username="root";
        $password="123.com";
        $conn=mysqli_connect($servername,$username,$password);
        if(!$conn){
                die("无法连接数据库!");
        }
        echo "192.168.1.11数据库u连接成功!"
?>

访问PHP页面

[root@localhost html]# firefox 192.168.1.11

创建数据库表

[root@localhost ~]# mysql
mysql> create database abc;
Query OK, 1 row affected (0.01 sec)

mysql> use abc
Database changed
mysql> create table test(id int,name char(8));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test values(1,'one'),(2,'two'),(3,'three'),(4,'four'),(5,'five');
Query OK, 5 rows affected (0.07 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> grant all on *.* to 'root'@'192.168.10.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

编辑首页文件

[root@localhost memcache-2.2.7]# cd /usr/local/nginx/html/
[root@localhost html]# mv index.php info.php
[root@localhost html]# vim index.php
<?php
$memcache=new  Memcache;
$memcache->connect("192.168.1.11","11211") or  die ("could not connect  memcache");
$query="select * from abc.test   limit   5;";
$key=md5($query);
if (!$memcache->get($key))  {
        $name="mysql";
        $conn=mysql_connect("192.168.1.11","root","123.com");
        $result=mysql_query($query);
        while  ($row=mysql_fetch_assoc($result))   {
       $arr[]=$row;
       }
       $mem_data=$memcache->set($key,serialize($arr),0,30);
       $data=$arr;

}
else {
       $name="memcache";
       $mem_data=$memcache->get($key);
       $data=unserialize($mem_data);
}
echo $name;
echo "</br>";
foreach ( $data as  $a ) {
       echo  "id  is  $a[id]";
       echo  "</br>";
       echo  "name is  $a[name]";
       echo  "</br>";
}
?>

评论

还没有任何评论,你来说两句吧

发表评论

:zhenbang: :yiwen: :yinyue: :yinxian: :yi: :xxyl: :xinsui: :xiaonian: :weiqu: :tushe: :tu: :taiyang: :taikaixin: :shuijiao: :shenli: :shengqi: :ruo: :qianbi: :qian: :pen: :neng: :mianqiang: :meigui: :lu: :liwu: :kuanghan: :ku: :kaixin: :jinya: :jiku: :huaxin: :huaji: :hu: :heixian: :hehe: :han: :haha: :haha2: :guai: :dangao: :damuzhi: :daku: :chabei: :caihong: :bugaoxing: :bishi: :aixin: :a: :OK: :) :(