Memcache

  Memcache的作用网上资料都讲的很好,说简单点就是减轻读取数据库的压力,原理也很简单:

  被请求的数据会先到memcache里去取,如果没有就去数据库里取,顺便给memcache带一份。

  每次更新数据也先更新memcache里的数据,如果没有则更新数据库,同时更新memcache。

  因此需要注意的是这个数据是易失去性存储的。

模式和端口

  Memcache是一个基于C/S的结构:

服务端:使用Memcached软件

  客户端:使用Memcache插件 (这个插件是结合后端语言比如php python java)

  服务端口:11211(可改)

软件清单:

  libevent依赖库      http://libevent.org/

  memcache插件       http://pecl.php.net/package/memcache/

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}

  memcached服务                 http://www.memcached.org/

  lamp环境           yum -y install httpd php php-mysql mysql-server

操作系统                          CentOS-6.5(x86_64)

1.将上传相关软件包,安装lamp环境

      yum -y install httpd php php-mysql mysql-server

      /etc/init.d/httpd start

      echo "<?php phpinfo()?>" > /var/www/html/index.php

然后用浏览器访问查看php信息,在信息里面是找不到memcache的

2.安装libevent插件

  tar xf libevent-2.0.-stable.tar.gz

  cd libevent-2.0.-stable

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

3.安装memcached服务端

  tar xf memcached-1.4..tar.gz

  cd memcached-1.4.

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

  make && make install

  安装好后会在/usr/local/memcached/bin/目录下生成memcached

4.配置环境变量

  cd  /etc/profile.d/ 

  vim mem.sh

  export PATH="/usr/local/memcached/bin:$PATH"  #写入profile文件开机自动导入

  memcached -m  -p  -d -c  -u root   #m分出内存大小 p 端口 d 混合模式 c 最大连接数

  netstat -anptu | grep memcached        #查看是否启动,运行多实例更改端口即可

  free -m                      #可以看到内存越来越少,因为被分配出去了

  ps -aux | grep memcached            #查看进程pid是多少

  kill -                    #关闭memcached服务

   pkill memcached                  #同上

5.memcached使用

  yum -y install nc telnet

1)使用nc命令连接memcache

   printf "set first 0 30 5\r\nmmmmm\r\n" | nc 127.0.0.1    #存数据 (字段分别为 key,标志,效期,长度,值 )

  printf "get first\r\n" | nc 127.0.0.1             #取数据 

  2)使用telnet命令连接memcache

  telnet 127.0.0.1     #然后就可以使用相关的memcached命令了

6.下面是关于memcached相关的操作命令

  

add key1 0 30 3    #添加数据30为效期(如果写0表示永不过期) 3为大小

  set key1 0 30 3    #更新数据,不存在会自动创建

  replace key1 0 30 3  #更新数据,不存在会报错

  delete key1      #删除数据

  get key1       #获取数据

  gets key 1       #获取更多信息

  stats setting    #查看配置信息

  stats slabs     #查看slab

  stats items     #查看item

  stats size      #查看大小

7.安装memcache客户端php插件

  安装phpize命令可以为php添加新模块

  如果不知道是什么包可以使用 yum provides */phpize

  yum -y install php-devel

  tar xf memcache-2.2..tgz

  cd memcache-2.2.

  phpize          #打模块,生成configure等文件

  which php-config      #查看php-config路径位置

  ./configure --enable-memcache --with-php-config=/usr/bin/php-config

  make && make install

  安装号后模块会被安装置/usr/lib64/php/modules/memcache.so

  cd /etc/php.d/

  cp mysql.ini memcache.ini  #vim进行编辑将extension的值设置成memcache.so

  重启服务后可以看到php已经支持了memcache模块了

  

8.后面可以结合php网站测试数据库相关

  tar xf memcache_page.tar.gz -C /var/www/html/

  cd !$

  

  测试页面有 mysql_connect.php 编辑一下

  因此需要先把mysql的用户设置一下

  /etc/init.d/mysqld  start

  mysql_secure_installation 

  或者自己在数据库里

  grant all on *.* to 'root'@'127.0.0.1' identified by ''

  flush privileges

  然后浏览器访问mysql_connect.php

  

  对接成功

  这里可以阅读read.php和write.php了解memcache的读写原理

read.php

<?php
$memcachehost = '192.168.1.113';
$memcacheport = 11211;
$memcachelife = 60;          #memcache默认有效期
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");  #连接memcache服务器
$num=$_POST["num"];
$db=db1;
$tb=T1;
$query="select * from $tb where ID=$num";  #mysql查询语句
#$key=md5($query);
$key=md5($num);                  #对参数进行加密,可以看出memcache存储的值是进过加密的
if(!$memcache->get($key))            #尝试先从memcache取值,如果没有去数据库取,顺便给memcache来一份
{
$conn=mysql_connect("127.0.0.1","root","123456");
mysql_select_db($db);
$result=mysql_query($query);
# echo "mysql $num";
while ($row=mysql_fetch_assoc($result))
{
$arr[]=$row;
}
$f = 'mysql';
$memcache->add($key,serialize($arr),0,30);
$data = $arr ;
}
else{
$f = 'memcache';
$data_mem=$memcache->get($key);
$data = unserialize($data_mem);
}
echo "$f $num";
echo "key is $key";
echo "<br>";
?>

write.php

<?php
$memcachehost = '192.168.1.113';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$num=$_POST["num"];
$db=db1;
$tb=T1;
$query="insert into $tb values($num)";
#$key=md5($query);
$key=md5($num);
if(!$memcache->get($key))            //先尝试更新memcache,如果不存在,则再去更新数据库,同时更新存储到memcachce
{
$conn=mysql_connect("127.0.0.1","root","123456");
mysql_select_db($db);
$result=mysql_query($query); while ($row=mysql_fetch_assoc($result))
{
$arr[]=$row;
}
$f = 'mysql';
$memcache->add($key,serialize($arr),0,30); //mysql 插入成功后,插入 memcached
$data = $arr ;
#}
#else{
$f1 = 'memcache';
$data_mem=$memcache->get($key);
$data = unserialize($data_mem);
}
echo "$f $f1 $num";
echo "<br>";
?>

关于php memcache简单用法参见http://www.cnblogs.com/demonxian3/p/6868361.html

上面两个php里可以看到调用了数据库的db1 和 表T1因此需要创建一下

  seq   > /tmp/sum  #创建1-999的测试数据

连接数据库导入数据

  create database db1; create T1(id int)engine=innodb;

  load data infile '/tmp/sum' into table T1;  #导入测试数据

  科普一下:使用history查看历史命令,输入!+数字可以执行编号的那条命令

  !

  用浏览器来访问那个测试页面

  

  测试读取数据,从数据库里查询出id为5的值

  后退再去取一次

  测试写入数据

  最后给大家推荐一款很好用的memcache管理工具:memadmin    php写的

搭建memcache过程可能会出现的问题:

执行 memcached 启动命令时,报错,提示:error while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No such file or directory

  • 查看 memcached 命令缺失什么库
ldd /usr/local/memcached/bin/memcached

结果: libevent-2.1.so.6 模块找不到

  • 查看 libevent-2.1.so.6 是否存在
locate libevent-2.1.so.

结果: 系统已经安装了该模块,在路径 /usr/local/lib/

  • 查看 memcached 查找依赖库的路径
LD_DEBUG=libs /usr/local/memcached/bin/memcached -v

结果: 在 /lib64/ 目录中查找,所以找不到已经安装好的

  • 映射 libevent-2.1.so.6 到 /lib64 路径中
ln -s /usr/local/lib/libevent-2.1.so. /usr/lib64/libevent-2.1.so.

结果:这样处理后,memcached就可以搜索到该文件了

  • 启动memcached服务
/etc/init.d/memcached restart
 

Memcache服务搭建的更多相关文章

  1. linux上部署rmi+memcache服务

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50020437 最近在学习linux上搭建Rmi+Memca ...

  2. ServiceStack.Hello——跨平台.net REST api服务搭建

    ServiceStack.Hello--跨平台.net REST api服务搭建 自己创建: https://github.com/ServiceStack/ServiceStack/wiki/Cre ...

  3. WCFRESTFul服务搭建及实现增删改查

    WCFRESTFul服务搭建及实现增删改查 RESTful Wcf是一种基于Http协议的服务架构风格,  RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力 ...

  4. 微信小程序语音识别服务搭建全过程解析(项目开源在github)

    silk v3录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) ## 重要的写在前面 重要事项一: 目前本文中提到的API已支持微信小程序录音文件格式:silk v ...

  5. 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)

    silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...

  6. Git服务搭建及github使用教程

    .pos { position: fixed; top: 35%; left: 90% } .pos a { border: 2px solid white; background: #99CCFF; ...

  7. eureka服务搭建

    Server端 引入eureka server的maven依赖 引入依赖时无需给定eureka的版本号,maven会根据当前使用的SpringCloud版本来判断应该引入哪个版本的euraka ser ...

  8. NodeJs之服务搭建与数据库连接

    NodeJs之服务搭建与数据库连接 一,介绍与需求分析 1.1,介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻 ...

  9. JumpServer1.0 服务搭建

    JumpServer1.0 服务搭建 系统环境配置 setenforce 0 systemctl stop iptables.service systemctl stop firewalld.serv ...

随机推荐

  1. Zkui安装

    是一个允许在zookeeper上进行增删查改操作的图形管理工具,与zkdash类似. 1.拉取代码 #git clone https://github.com/DeemOpen/zkui.git 2. ...

  2. Activiti的全局事件机制及其监听处理

    概述 Activiti在5.15以后的版本后,增加了统一的事件入口,不需要再像以前那样,监听流程的事件时,在流程定义的BPMN文件中为每个节点及流程增加以下的配置,以实现监听事件的做法,这种做法导致我 ...

  3. 老李分享:Android -自动化埋点 2

    除了上述的事件,Android提供了一个OnTouchListener的监听器,当事件传递到控件的时候,如果控件注册了这个监听器,则会执行监听器中的onTouch方法.同时,如果它返回true,则事件 ...

  4. Java并发编程:JDK中的阻塞队列

    上次我们讲了一些常用的4个阻塞队列,但是在JDK中还提供了其他的一些阻塞队列.这篇文章将全面介绍一下JDK中的所有阻塞队列,并比较他们的区别. JDK7提供了7个阻塞队列.分别是 ArrayBlock ...

  5. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  6. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集

             本文主要描述 MySQL Group Replication的简易原理.搭建过程以及故障维护管理内容.由于是新技术,未在生产环境使用过,本文均是虚拟机测试,可能存在考虑不周跟思路有误 ...

  7. 【Java进阶】——初识数据库连接池

    [简介] 数据库连接池:程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的链接进行申请,使用,释放. 相比之前的程序连接,减少了数据库的打开关闭次数,从而减少了程序响应的 ...

  8. 读书笔记 effective c++ Item 46 如果想进行类型转换,在模板内部定义非成员函数

    1. 问题的引入——将operator*模板化 Item 24中解释了为什么对于所有参数的隐式类型转换,只有非成员函数是合格的,并且使用了一个为Rational 类创建的operator*函数作为实例 ...

  9. WebGL 高级技术

    1.如何实现雾化 实现雾化的方式由多种,这里使用最简单的一种:线性雾化(linear fog).在线性雾化中,某一点的雾化程度取决于它与视点之间的距离,距离越远雾化程度越高.线性雾化有起点和终点,起点 ...

  10. C#各个版本中的新增特性详解

    序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...