最近对Memcache的一些学习

  首先,Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度,再特别强调下:Memcache 是一个用来存储常用信息的缓存,有了它,您便无需从缓慢的资源,比如磁盘或数据库,加载并处理信息了。
Memcache的配置:
安装,配置Memcache,中间磕磕碰碰还是有遇到一些小问题的。
、下载一个稳定版本的Memcache,点我下载.找个最新版本的pecl压缩包,并放到某个盘下,并通过cmd控制台启动,必须要管理员身份,不然报错(我开始就报错过 - -),安装命令:c:/Memcache.exe –d install
然后再打:c:/Memcache.exe –d start,启动服务
、第二步,根据自身PHP版本,寻找对应的php_Memcache.dll并下载(重要,开始随便下了个,就无法使用Memcache,各种报错),我的PHP是5..4版本(http://huangqiqing123.iteye.com/blog/1682857),并放到PHP中的ext并在php.info配置文件下加一句话:extension=php_memcache.dll
、最后可以测试使用Memcache了,重启apache,打印phpinfo()信息,搜索Memcache,是否存在,再创建一个php文件:<?php $mem = new memcache; //实例化     $mem->connect(‘192.168.0.124’,11211) or die (“链接失败”);   //192.168.0.124(服务器地址,本地可用localhost)11211(端口号)
echo $mem->getVersion();                                //获得版本信息,使用echo输出?>
我的打印结果是:1.2. 
Memcache简单示例:
Hello World
$mems = new memcache;
$mems->connect('localhost',11211) or die ("链接失败");
$mems->set(‘test’,’Hello World!’);
Echo $mems->get(‘name’);
实际应用:先创建一个MyMemcache.php,代码如下:
class MyMemcache extends memcache{
function __construct(){
memcache::addServer('localhost',11211)or die ("链接失败");}}
$mems = new MyMemcache();
再在需要的时候包含进来,例如:在memcache_set页面中:
require_once 'memcache.php';
$mems->set('name','mywang');
echo $mems->get('name');
在memcache_get页面中:
require_once 'memcache.php';
if($mems->get('name')){
echo $mems->get('name');
}else{
//select name from db
//echo $name;
//$mems->set('name','xxx');
}
Memcache常用方法介绍:
       PHP Memcache的API地址,点我点我
常用方法:
Memcache::add 向一个新的key下面增加一个元素
Memcache::addServer — 向服务器池中增加一个服务器
Memcache::delete — 删除一个元素
Memcache::fetch — 抓取下一个结果
Memcache::get — 检索一个元素
Memcache::replace — 替换已存在key下的元素
Memcache::set — 存储一个元素
Memcache::flush — 作废缓存中的所有元素
Memcache::getResultMessage — 返回最后一次操作的结果描述消息
Memcache::getResultCode — 返回最后一次操作的结果代码
Memcache::getDelayedByKey — 从指定的服务器上请求多个元素 示例推荐代码
理论分析推荐(重要)
Memcache的使用:
一般而言,这些步骤是:
执行一个或多个查询来从数据库加载信息
格式化适合于显示(或进一步处理)的信息
使用或显示格式化了的数据 在使用 Memcache 时,为配合这个缓存,可对应用程序的逻辑进行稍许修改:
尽量从缓存加载信息
如果存在,使用信息的被缓存版本
如果它不存在:
执行一个或多个查询来从数据库加载信息
格式化适合于显示或进一步处理的信息
将信息存储到缓存内
使用格式化了的数据 减少了从数据库获取信息的次数,从而提高了web网页的响应速度
Memcache与Memcached的区别:
1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的。与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些。
2.Memcache是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口。
3.memcached还有个非常称赞的地方,就是flag不是在操作的时候设置了,而是有了一个统一的setOption()。Memcached实现了更多的memcached协议。
4.memcached支持Binary Protocol,而memcache不支持。这意味着memcached会有更高的性能。不过memcached目前还不支持长连接。
Memcache弹性和可用性:
有关 Memcache 最常见的一个问题是:“若缓存不可用了,会发生什么情况呢?”正如之前章节中明示的,缓存内的信息不应该成为信息的的惟一资源。必须要能够从其他位置加载存储在缓存内的数据。
虽然,无法从缓存访问信息将会减缓应用程序的性能,但它不应该阻止应用程序的运转。可能会发生这样几个场景:
如果 Memcache 服务宕掉,应用程序应该回退到从原始数据源加载信息并对信息进行显示所需的格式化。此应用程序还应继续尝试在 Memcache 内加载和存储信息。
一旦 Memcache 服务器恢复可用,应用程序就应该自动尝试存储数据。没有必要强制重载已缓存了的数据,可以使用标准的访问来用信息加载和填充缓存。最终,缓存将会被最常用的数据重新填充。
再次重申,Memcache 是信息的缓存但并非惟一的数据源。Memcache 服务器不可用不应该是应用程序的终结,虽然这意味着在 Memcache 服务器恢复正常之前性能会有所降低。实际上,Memcache 服务器相对简单,并且虽然不是绝对无故障的,但它的简单性的结果就是它很少会出错。
Memcache的局限性:
1、memcached 不是一个数据库,也就意味这Memcache不能永久地保存数据,只能存在于页面的整个生命周期中
2、memcached 并不安全。为了确保最佳性能,memcached 并未提供任何形式的安全性,没有身份验证,也没有加密。
3、虽然可以使用 memcached 存储加载自数据库的数据行,但这实际上是查询缓存,并且大多数数据库都提供各自的查询缓存的机制。其他的对象,比如文件系统的图像或文件的情况与此相同。很多应用程序和 web 服务器针对此类工作已经有了一些很好的解决方案。
哪些数据该用Memcache缓存,哪些不应该:

1、如果Value特别大,不太适合。在默认编译下Memcache只支持1M的Value,其实从实践的角度来说也不建议把非常大的数据保存在Memcache中,因为有序列化反序列化的过程,别小看它消耗的CPU

2、 如果不允许过期,不太适合。 Memcache在默认情况下最大30天过期,而且在内存达到使用限制后它也会回收最少使用的数据。如果我们要把它当作static变量的话就要考虑到这个问题,必须有重新初始化数据的过程。

3、Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。

4、memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等等,而且生产环境中就这么跑过,只不过让大数据量使用缓冲的话,有点太浪费了,同样数量的内存存不了几条数据,所以会明显的降低命中率。

5、Memcached的由于是静态数据,需要每隔一定时间进行清空并从数据库提取数据,而刷新的时间可以根据不同的数据需求而定。

6、那么Memcache主要用在哪些功能上呢?

其实我觉得平时能想到在内存中做缓存的地方我们都可以考虑下是不是可以去适用分布式缓存,但是主要的用途还是用来在前端或中部挡一下读的需求来释放Web服务器App服务器以及DB的压力。

  

  

上一篇:BaseAdapter自定义适配器——思路详解


下一篇:ioctrl 获取本机IP及MAC地址