文档章节

CentOS下用Memcached缓存MySQL数据

雁南飞丶
 雁南飞丶
发布于 2014/09/07 20:22
字数 850
阅读 65
收藏 1

Memcached是一个分布式的内存对象缓存系统,通常用于动态Web应用以减轻数据库负载。

Memcached是基于一个存储键对的hashmap,当表格满了以后,就使用LRU(最近最小使用)算法机制替换掉。
Memcached使用了libevent来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).
 
下面具体说明在CentOS环境下安装memcached并结合mysql,php来测试Memcache的缓存机制

1、安装memcached
wget http://skadns.googlecode.com/files/libevent-1.4.8-stable.tar.gz
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
 
tar xf libevent-1.4.8-stable.tar.gz
cd libevent-1.4.8-stable
./configure
make && make install
ln -sv /usr/local/lib/libevent* /usr/lib/
 
tar xf  memcached-1.4.15.tar.gz
cd memcached-1.4.15
./configure
make && make install
 
尝试启动memcached,启动方法
[root@ www.linuxidc.com ~]#memcached -d -unobody -m50 -p11211 -P /tmp/memcached.pid
说明:
-d 以独立方式运行
-u 以什么用户启动
-m 占用内存大小(默认是100)
-p 监听端口号
-P 指定pid位置
不报信息就ok,netstat -tnlp查看一下

2、为php安装memcached扩展(我是用的是php5.4.4)
[root@ www.linuxidc.com ~]#wget http://pecl.php.net/get/memcache-2.2.5.tgz
[root@ www.linuxidc.com ~]#tar zxvf memcache-2.2.5.tgz
[root@ www.linuxidc.com ~]#cd memcache-2.2.5/
[root@ www.linuxidc.com ~]#/usr/local/php/bin/phpize
[root@ www.linuxidc.com ~]#./configure --with-php-config=/usr/local/php/bin/php-config
[root@ www.linuxidc.com ~]#make
[root@ www.linuxidc.com ~]#make install
在配置文件中添加memcache扩展,命令如下
sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20100525/"\nextension = "memcache.so"#' /usr/local/php/etc/php.ini

3、确定已经安装好了mysql数据库,如果没有的话,直接使用yum install mysql-server。
 
准备测试表

mysql>CREATE DATABASE 'lee';
mysql>CREATE TABLE `lee1` (
  `id` int(7) NOT NULL AUTO_INCREMENT,
  `name` char(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

插入数据,格式如下:
mysql>INSERT INTO `lee1` VALUES (1,'tom'),(2,'jim'),(3,'abc'),(4,'cde'),(5,'fgh'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');

查看是否有数据

4、测试
ok下面就是测试的工作了,这里有个php脚本,用于测试memcache是否缓存数据成功
需要为这个脚本添加一个只读的数据库用户,命令格式
mysql>grant select on lee.* to memcache@"%" identified by "12345";
mysql>flush privileges;
mysql>\q
 
测试脚本内容如下:

<?php
$memcachehost = '192.168.0.128';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from lee1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
                $conn=mysql_connect("192.168.0.128","memcache","12345");
                mysql_select_db(lee);
                $result=mysql_query($query);
                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;
echo "<br>";
echo "$key";
echo "<br>";
//print_r($data);
foreach($data as $a)
{
                echo "number is <b><font color=#FF0000>$a[id]</font></b>";
                echo "<br>";
                echo "name is <b><font color=#FF0000>$a[name]</font></b>";
                echo "<br>";
 
}
?>
 
访问页面测试

如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得

再刷新页面

如果有memcached标志表示这次的数据是从memcached中取得的
 
也可以通过 telnet 192.168.0.128 11211 使用memcached命令来分析是否有内容
memcached有个缓存时间默认是1分钟,过了一分钟后,memcached需要重新从数据库中取得数据
我们也可以手动删除,这时手动刷新网页,数据是会再次被缓存的

本文转载自:http://www.linuxidc.com/Linux/2012-11/73515p3.htm

雁南飞丶
粉丝 37
博文 187
码字总数 248167
作品 0
西安
运维
私信 提问
加载中

评论(2)

雁南飞丶
雁南飞丶 博主

引用来自“Feng_Yu”的评论

29我们用的是redis
那个更好?
Feng_Yu
Feng_Yu
29我们用的是redis
请教:memcached如何清理缓存?

环境为linux(centos),mysql中删除了数据,但是查询的时候还是可以查询到,所以想请教一下如何让memcached中的缓存数据失效?在linux下的命令是什么?

2018是狗年
2011/08/25
9.4K
7
memcached的简单配置

memcached: 数据结构模型: 比如在myslq中存一个数据,检索起来非常麻烦,先要查索引,有可能还有进行多表查询,基于多表查询要做多次IO才能把数据加载到内存中,在内存中还要进行排序,排序...

网费
2016/05/25
0
0
memcached 原理及详细配置

memcached: 数据结构模型: 比如在myslq中存一个数据,检索起来非常麻烦,先要查索引,有可能还有进行多表查询,基于多表查询要做多次IO才能把数据加载到内存中,在内存中还要进行排序,排序...

网费
2016/07/05
0
0
【目录】 Linux技术玩家 持续更新

[编辑器相关] Windows下用notepad++ 打造Linux 代码编辑环境 送给不使用vim的Linux Guy http://990487026.blog.51cto.com/10133282/1844735 ubuntu 源码编译安装最新的vim 8.0 http://990487...

990487026
2016/09/01
0
0
缓存系统memcache的安装,配置和使用

软件介绍 [我的Linux,让Linux更易用]memcached是一套分布式的快取或缓存系统,当初是Danga Interactive为了LiveJournal所发展的,但目前被许多软件(如MediaWiki)所使用。这是一套开放源代码...

wdlinuxcn
2010/10/15
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
51分钟前
4
0
JS--function

一、声明提前(hoist) 在js程序开始执行前,引擎会查找所有var声明的变量和function声明的函数,集中到当前作用域顶部集中创建,赋值留在原地 二、三种创建函数的方式 1、声明方式创建函数-...

wytao1995
今天
5
0
微服务之间调用控制器注解类型的差异

今天在一个业务服务通过Feign调用文件服务上传文件时遇到了几个问题: 1. 提示http请求头过大的问题; 此时需要修改bootstrap.yml,加入 server: max-http-header-size: 10000000 用以放大...

不再熬夜
今天
7
0
用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
今天
6
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部