Memcached分布式数据缓存

1. Memcached

​ Memcached 是一个自由开源的,高性能的分布式的对象缓存系统,

​ 是一套分布式的告诉缓存系统,针对 与一些大型的需要频繁访问数据库的网站访问速度提升效果十分显著

​ Memcached 是一种基于内存Key-value存储,用来存储小块的任意数据(字符串、对象),这些数据可以是数据库调用、API 掉用或者是页面渲染的结果。

2. Memcached 特点

  • 协议简单
  • 基于Libevent的事件处理
  • 内置内存存储方式
  • Memcached 不能互相通信的分布式
  • 开源软件、性能好、分布式存储

3. 部署 Memcached

实验环境

Host IP 备注
Memcached 1.1.1.102 LNMP

1) 整理LNMP 环境

  • 将 LNMP 中监听地址改为本地地址

  • Nginx

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

    server {
        listen       80;
        server_name  1.1.1.102;
 location ~ \.php$ {
            root           html;
            fastcgi_pass   1.1.1.102:9000;
            

重启服务
[root@localhost ~]# killall nginx
[root@localhost ~]# nginx
[root@localhost ~]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      117611/nginx: maste 

  • PHP-FPM 程序
[root@localhost ~]# vim /usr/local/php/etc/php-fpm.conf
listen = 1.1.1.102:9000

重启服务
[root@localhost ~]# systemctl restart php-fpm
[root@localhost ~]# netstat -anpt | grep php-fpm
tcp        0      0 1.1.1.102:9000          0.0.0.0:*               LISTEN      117628/php-fpm: mas 
  • 添加测试动态页面程序
[root@localhost ~]# vim /usr/local/nginx/html/index.php
<?php
phpinfo()
?>

2)部署 Memcached 服务端

  • 解决依赖关系
[root@localhost ~]# tar -zxf 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 && make && make install
  • 源码编译安装
[root@localhost ~]# tar -zxf 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/ && make && make install

  • 优化路径
[root@localhost memcached-1.5.9]# ln -s /usr/local/memcached/bin/* /usr/local/bin/

3) 运行Memcached

memcached -d -l 1.1.1.102 -p 11211 -c 10240 -m 512 -P /usr/local/memcached/memcache.pid -u root

参数:

   # -d	后台运行
   # -l	指定本地主机
   # -p	指定监听的端口
   # -c	memcache 最大连接量
   # -m	memcache 的缓存内存大小  单位M
   # -p	指定 pid的路径
   # -u	指定运行用户
[root@localhost ~]# netstat -anpt | grep memcached
    tcp        0      0 1.1.1.102:11211         0.0.0.0:*               LISTEN      11691/memcached     

4) 在LNMP 创建授权用户

  • 在LNMP 中 Mysql 创建授权用户,用于缓存数据库中的内容

  • Memcached 缓存数据内容,是以键值对形式缓存的

  • 手动建立一个数据库,并插入数据

mysql> CREATE DATABASE memcache;
Query OK, 1 row affected (0.01 sec)

# 使用 memcache 数据库
mysql> USE memcache;
Database changed

# 创建 test 表  字段  id name
mysql> CREATE TABLE test(id int,name varchar(10));
Query OK, 0 rows affected (0.12 sec)

# 插入数据
mysql> INSERT INTO test VALUES(1,'one'),(2,'two'),(3,"three"),(4,"four"),(5,"five");
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

#  常见授权用户 root
mysql> GRANT ALL ON memcache.test TO 'root'@'1.1.1.101' IDENTIFIED BY '123.com';
Query OK, 0 rows affected (0.09 sec)

5)部署LNMP 服务器

  • Memcached 服务器与MySQL服务连接是通过PHP进行连接的,所以需要在PHP中安装一个模块(插件)来支持Memcached与MySQL通信
[root@localhost ~]# tar -zxf memcache-2.2.7.tgz -C /usr/src/
[root@localhost ~]# cd /usr/src/memcache-2.2.7/
  • 该源码中 没有包含 configure 程序,没法编译,所以需要借助 phpize程序,, 手动生成一个 ,因此就需要将 php中的程序软连接至 全局中使用
[root@localhost memcache-2.2.7]# ln -s /usr/local/php/sbin/* /usr/local/sbin/
[root@localhost memcache-2.2.7]# ln -s /usr/local/php/bin/* /usr/local/bin/
  • 使用phpize 生成 configure
[root@localhost memcache-2.2.7]# phpize
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config && make && make install

  • 查看安装好的 memcache.so 模块是否已经存在
    • 如果存在,则在 php 配置文件中添加模块路径
[root@localhost memcache-2.2.7]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
[root@localhost no-debug-non-zts-20090626]# ls
memcache.so
  • 添加模块(载入模块)
[root@localhost no-debug-non-zts-20090626]# vim /usr/local/php/php.ini 
# 在文件末尾添加:
    extension =  memcache.so
  • 重新启动PHP服务
[root@localhost no-debug-non-zts-20090626]# systemctl restart php-fpm

6) 在 Index.php 测试页面中查看

  • 查看是否新增了Memcached模块

Memcached分布式数据缓存_第1张图片

  • 如果没有显示模块,则 PHPinfo 测试页面中,找到 php.ini 配置文件的位置,确认是否跟你php.ini文件路径是否一致,确认修改的php.ini与实际运行的php.ini是一个文件

Memcached分布式数据缓存_第2张图片

7) 编辑测试网页

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

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

参数:

<?php
$memcachehost="1.1.1.102";     #指定memcache的节点ip
$memcacheport=11211;        	#指定memcache的端口
$memcache=new Memcache;     	#定义一个memcache的对选哪个
$memcache->connect($memcachehost,$memcacheport) or die ("could not connect");       #连接memcache
$query="select * from abc.test limit 5";      #执行客户端的指定语句
$key=md5($query);     						#对客户端要查找的数据进行hash计算
        if(!$memcache->get($key)){      		#判断  如果客户端的请求未命中
                $name="mysql";      			 #第一行的数据内容
                $conn=mysql_connect("1.1.1.102","root","123.com");    #连接数据库
                $result=mysql_query($query);
                while ($row=mysql_fetch_assoc($result)){   			 #去后端循环抓取
                        $arr[]=$row;
                }
                $memcache->set($ey,serialize($arr),0,10);    			#将值缓存到memcache中
                $data=$arr;   		 #要返回给客户端的数据

        }
        else{             			#如果客户端命中
                $name="memcache";     #输出的第一行内容
                $data_mem=$memcache->get($key);   #通过hash计算的键获取到客户端的请求的值
                $data=unserialize($data_mem);   #要返回给客户端的数据
        }
echo $name;    							#  以下为在客户端浏览器上显示出的页面内容
echo "
"
; foreach($data as $a){ echo "id is $a[id]"; echo "
"
; echo "name is $a[name]"; echo "
"
; } ?>
  • 再次访问Nginx

4. 对Memcached 进行管理

  • 通过Telnet 服务连接至 Memcached 11211端口

  • 安装 Telnet 服务

 yum -y install telnet
  • 连接Memcached
[root@localhost ~]# telnet 1.1.1.102 11211

    set name 3 30 4
    aaaa
    STORED
    get name
    VALUE name 3 4
    aaaa
    END
  • 添加键值对格式
set   键名   键的标签   缓存时间    值的长度(值不能超过长度)值
  • 命令

get 键名 # 查看键值对

set 添加键值对,如果值已经存在,则进行覆盖

add 添加键值对,如果键值对存在,则添加失败

replace 对已经存在的键值对进行替换,如果不存在,则修改失败

append 向已经存在的键值对中的值进行追加

delete 删除指定的键值对

get 查看指定的键值对

quit 退出

flush_all 清空所有

你可能感兴趣的:(Linux)