Memcache是什么

Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的。眼下全世界不少人使用这个缓存项目来构建自己大负载的站点,来分担数据库的压力。

它能够应对随意多个连接。使用非堵塞的网络IO。

因为它的工作机制是在内存中开辟一块空间。然后建立一个HashTable,Memcached自管理这些HashTable。

Memcache官方站点:http://www.danga.com/memcached,很多其它具体的信息能够来这里了解 :)

为什么会有Memcache和memcached两种名称?

事实上Memcache是这个项目的名称,而memcached是它server端的主程序文件名称。知道我的意思了把~~~~。

一个是项目名称,一个是主程序文件名称,在网上看到了非常多人不明确。于是混用了。

Memcache的安装

分为两个过程:memcacheserver端的安装和memcachedclient的安装。

所谓server端的安装就是在server(一般都是linux系统)上安装Memcache实现数据的存储

所谓client的安装就是指php(或者其它程序,Memcache还有其它不错的api接口提供)去使用server端的Memcache提供的函数,须要php加入扩展。

详细的配置大家能够參考:

Linux下的Memcache安装:http://www.ccvita.com/257.html

Windows下的Memcache安装:http://www.ccvita.com/258.html

Memcache基础教程:http://www.ccvita.com/259.html

Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html

Memcache协议中文版:http://www.ccvita.com/306.html

Memcache分布式部署方案:http://www.ccvita.com/395.html

PHP的Memcache

<
?php
//连接
$mem
= new Memcache;
$mem->connect("192.168.0.200",
12000);
//保存数据
$mem->set('key1',
'This is first value', 0, 60);
$val
= $mem->get('key1');
echo
"Get key1 value: " . $val ."<br />";
//替换数据
$mem->replace('key1',
'This is replace value', 0, 60);
$val
= $mem->get('key1');
echo
"Get key1 value: " . $val . "<br />";
//保存数组
$arr
= array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2',
$arr, 0, 60);
$val2
= $mem->get('key2');
echo
"Get key2 value: ";
print_r($val2);
echo
"<br />";
//删除数据
$mem->delete('key1');
$val
= $mem->get('key1');
echo
"Get key1 value: " . $val . "<br />";
//清除全部数据
$mem->flush();
$val2
= $mem->get('key2');
echo
"Get key2 value: ";
print_r($val2);
echo
"<br />";
//关闭连接
$mem->close();
?>

假设正常的话,浏览器将输出:

Get key1 value: This is first value

Get key1 value: This is replace value

Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )

Get key1 value:

Get key2 value:

程序代码分析

初始化一个Memcache的对象:

$mem =
new Memcache;

连接到我们的Memcacheserver端。第一个參数是server的IP地址,也能够是主机名,第二个參数是Memcache的开放的port:

$mem->connect("192.168.0.200", 12000);

保存一个数据到Memcacheserver上,第一个參数是数据的key。用来定位一个数据,第二个參数是须要保存的数据内容,这里是一个字符串,第三个參数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED即可了,第四个參数是数据的有效期。就是说数据在这个时间内是有效的,假设过去这个时间,那么会被Memcacheserver端清除掉这个数据,单位是秒,假设设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:

$mem->set('key1', 'This
is first value', 0, 60);

从Memcacheserver端获取一条数据,它仅仅有一个參数,就是须要获取数据的key,我们这里是上一步设置的key1,如今获取这个数据后输出输出:

$val = $mem->get('key1');

echo "Get key1 value: " . $val;

如今是使用replace方法来替换掉上面key1的值,replace方法的參数跟set是一样的。只是第一个參数key1是必须是要替换数据内容的key。最后输出了:

$mem->replace('key1', 'This
is replace value', 0, 60);

$val = $mem->get('key1');

echo "Get key1 value: " . $val;

相同的,Memcache也是能够保存数组的,以下是在Memcache上面保存了一个数组,然后获取回来并输出

$arr =
array('aaa', 'bbb', 'ccc', 'ddd');

$mem->set('key2', $arr, 0, 60);

$val2 = $mem->get('key2');

print_r($val2);

如今删除一个数据,使用delte接口,參数就是一个key。然后就行把Memcacheserver这个key的数据删除,最后输出的时候没有结果

$mem->delete('key1');

$val = $mem->get('key1');

echo "Get key1 value: " . $val . "<br>";

最后我们把全部的保存在Memcacheserver上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接

$mem->flush();

$val2 = $mem->get('key2');

echo "Get key2 value: ";

print_r($val2);

echo "<br>";

Memcache的使用

使用Memcache的站点一般流量都是比較大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端可以迅速的进行存取。那么一般的焦点就是集中在怎样分担数据库压力和进行分布式。毕竟单台Memcache的内存容量的有限的。

我这里简单提出我的个人看法,未经实践。权当參考。

分布式应用

Memcache本来支持分布式。我们client稍加改造,更好的支持。

我们的key能够适当进行有规律的封装。比方以user为主的站点来说,每一个用户都有User ID,那么能够依照固定的ID来进行提取和存取,比方1开头的用户保存在第一台Memcacheserver上,以2开头的用户的数据保存在第二胎Mecacheserver上,存取数据都先依照User
ID来进行对应的转换和存取。

可是这个有缺点。就是须要对User ID进行推断,假设业务不一致,或者其它类型的应用,可能不是那么合适,那么能够依据自己的实际业务来进行考虑。或者去想更合适的方法。

降低数据库压力

这个算是比較重要的,全部的数据基本上都是保存在数据库其中的,每次频繁的存取数据库。导致数据库性能极具下降,无法同一时候服务很多其它的用户。比方MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。

我们须要一种修改比較小,而且可以不会大规模改变前端的方式来进行改变眼下的架构。

我考虑的一种简单方法:

后端的数据库操作模块,把全部的Select操作提取出来(update/delete/insert无论),然后把对应的SQL进行对应的hash算法计算得出一个hash数据key(比方MD5或者SHA)。然后把这个key去Memcache中查找数据,假设这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后对应的设置一个失效时间,比方一个小时,那么一个小时中的数据都是从缓存中提取的,有效降低数据库的压力。缺点是数据不实时。当数据做了改动以后,无法实时到前端显示,而且还有可能对内存占用比較大。毕竟每次select出来的数据数量可能比較巨大,这个是须要考虑的因素。

Memcache的安全

我们上面的Memcacheserver端都是直接通过client连接后直接操作。没有不论什么的验证过程,这样假设server是直接暴露在互联网上的话是比較危急,轻则数据泄露被其它无关人员查看。重则server被入侵,由于Mecache是以root权限执行的。况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况。这些都是我们未知的,所以危急性是可以预见的。为了安全起见。我做两点建议。可以略微的防止黑客的入侵或者数据的泄露。

内网訪问

最好把两台server之间的訪问是内网形态的,通常是Webserver跟Memcacheserver之间。

普遍的server都是有两块网卡,一块指向互联网,一块指向内网,那么就让Webserver通过内网的网卡来訪问Memcacheserver,我们Memcache的server上启动的时候就监听内网的IP地址和port。内网间的訪问可以有效阻止其它非法的訪问。

# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid

Memcacheserver端设置监听通过内网的192.168.0.200的ip的11211port,占用1024MB内存,而且同意最大1024个并发连接

设置防火墙

防火墙是简单有效的方式,假设却是两台server都是挂在网的,而且须要通过外网IP来訪问Memcache的话。那么能够考虑使用防火墙或者代理程序来过滤非法訪问。

一般我们在Linux下能够使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的訪问,比方我们能够设置仅仅同意我们的Webserver来訪问我们Memcacheserver。同一时候阻止其它的訪问。

# iptables -F

# iptables -P INPUT DROP

# iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT

# iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT

上面的iptables规则就是仅仅同意192.168.0.2这台Webserver对Memcacheserver的訪问,能够有效的阻止一些非法訪问,对应的也能够添加一些其它的规则来加强安全性,这个能够依据自己的须要来做。

memcache原理和实际应用的更多相关文章

  1. memcache原理、简单使用、分布式实现方案

    原理:http://www.cnblogs.com/chy2055/p/5127499.html 使用教程:http://www.travisup.com/post/index/21 memcache ...

  2. 深入理解Memcache原理 [转]

    1.为什么要使用memcache 由于网站的高并发读写需求,传统的关系型数据库开始出现瓶颈,例如: 1)对数据库的高并发读写: 关系型数据库本身就是个庞然大物,处理过程非常耗时(如解析SQL语句,事务 ...

  3. memcache原理及环境搭建、测试

    一.原理       Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单 ...

  4. memcache 原理 & 监测 & 查看状态 & stats & 结构

    Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk) 先放一张从网上找到的memcache内存结构图,觉得非常的赞:

  5. Java开发中的Memcache原理及实现

    Memcached 客户端程序 Memcached的java客户端已经存在三种了: ?  官方提供的基于传统阻塞io由Greg Whalin维护的客户端 ?  Dustin Sallings实现的基于 ...

  6. 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

    转载自脚本之家 http://www.jb51.net/article/51831.htm  作者:忙碌的松鼠 对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层, ...

  7. PHP + Memcache 实现多服务器session共享

    很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了.这时我们可以考虑使用memcache 来接 ...

  8. JAVA MemCache 史无前例的详细讲解【转】

    非原创转自:http://nhy520.iteye.com/blog/1775893 这篇文章是我看到的介绍的比较详细的,入门级别算是足足够了 Memcach什么是Memcache Memcache集 ...

  9. 基于Memcache的分布式缓存系统详解

    文章不是简单的的Ctrl C与V,而是一个字一个标点符号慢慢写出来的.我认为这才是是对读者的负责,本教程由技术爱好者成笑笑(博客:http://www.chengxiaoxiao.com/)写作完成. ...

随机推荐

  1. Codeforces Round #447 (Div. 2) A. QAQ【三重暴力枚举】

    A. QAQ time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  2. hdu 1512 Monkey King 左偏树

    题目链接:HDU - 1512 Once in a forest, there lived N aggressive monkeys. At the beginning, they each does ...

  3. UVA 103 Stacking Boxes n维最长上升子序列

    题目链接:UVA - 103 题意:现有k个箱子,每个箱子可以用n维向量表示.如果一个箱子的n维向量均比另一个箱子的n维向量大,那么它们可以套接在一起,每个箱子的n维向量可以互相交换值,如箱子(2,6 ...

  4. 如何命令行编译Java工程

    在src下的包含Main的包下打开命令行,javac -classpath “路径到src,不到包下”  Main.java

  5. MongoDB 聚合Group(一)

    原文:http://blog.csdn.net/congcong68/article/details/45012717 一.简介 db.collection.group()使用JavaScript,它 ...

  6. What is the purpose of mock objects?

    Since you say you are new to unit testing and asked for mock objects in "layman's terms", ...

  7. 发掘StateListAnimator的全部潜能

    原文地址:https://blog.stylingandroid.com/statelistanimator/ 原文作者:Leave a reply 译文出自:安卓巴士 译者: MrlLee 校对者: ...

  8. JAVA常见算法题(一)

    package com.xiaowu.demo; // 有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第四个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * ...

  9. 去掉wget烦人的 “eta(英国中部时间)” 提示

    gentoo 里的 wget ,从1.12版本开始,就一直有个不影响功能的小毛病:由于中文翻译的失误,进度提示的时候,会被拉成很多行.原因就是原来英文的ETA这3个字母,被翻译成了 “eta(英国中部 ...

  10. vue axios跨域请求,apache服务器设置

    问题所在axios请求会发送两次请求 也就是说,它会先使用options去测试,你这个接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始正常请求. 思路: 跨域--> ...