memcache数据缓存

数据缓存:

随着Internet技术的不断发展,影响网络速度的瓶颈主要集中在访问距离和服务器承载负荷能力方面。
扩展服务器或者镜像服务器作为基本解决方案在运营维护方面花费的代价较高,
而Cache缓存技术作为一种补充方案,以其简单的设计、高效的存储性能得到了越来越广泛的应用。

memcache是比较流行的cache解决方案,是高效、快速的分布式内存对象缓存系统,主要用 于加速 WEB 动态应用程序 

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

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

为什么会有Memcache和memcached两种名称? 
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名

memcached是运行在缓存服务器上的服务端程序名。

memcache是 memcache server的client端,有各种语言的版本,如:java、php等

可以把memcache server看成是DB服务器,

memcache不是必须和apache安装在同一台服务器,和apache安装在一起可以使资源充分使用,apache占用CPU多,内存相对较少,而 memcache占用CPU低,内存多。

Memcache的安装分为两大块: 

memcache服务器端安装 

memcache客户端安装 

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

所谓客户端的安装就是指为php添加扩展,如PHP_memcache.dll,apache启动 后使用服务器端的Memcache 提供的函数。

在windows下安装memcache:
  
  客户端memcache.dll支持php5.2,放到php的ext目录下,php.ini中加一句extension=php_memcache.dll就可以了。

  其中服务端解压后有个memcached.exe。
在DOS下,切换到目录:
memcached.exe -d install 安装成windows的系统服务。
之后就可以在服务中启动和关闭memcached了,
也可以在DOS下用memcached.exe -d start来开启。
默认端口号是:11211。

memcache 的标志是驴:

到百度 谷歌 搜索到 你当前memcache版本的相对于的 php_memecache.dll
下载后 拷贝到 ext/

找到  extension  在它的后面增加
extension=php_memcache.dll
; 一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表, 

; 它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。 

; 是否在遇到错误时透明地向其他服务器进行故障转移。 
memcache.allow_failover = On

; 接受和发送数据时最多尝试多少个服务器,只在打开memcache.allow_failover时有效。 
memcache.max_failover_attempts = 20 
; 数据将按照此值设定的块大小进行转移。此值越小所需的额外网络传输越多。 
; 如果发现无法解释的速度降低,可以尝试将此值增加到32768。 
memcache.chunk_size = 8192 
; 连接到memcached服务器时使用的默认TCP端口。 
memcache.default_port = 11211 

让php支持memcache

重启apache

打开 phpinfo();

如果出现
memcache
memcache support enabled 
Active persistent connections  0  
Version  2.2.4-dev  
Revision  $Revision: 1.99 $  

Directive Local Value Master Value 
memcache.allow_failover 1 1 
memcache.chunk_size 8192 8192 
memcache.default_port 11211 11211 
memcache.hash_function crc32 crc32 
memcache.hash_strategy standard standard 
memcache.max_failover_attempts 20 20 




表示memcache安装成功!






 memcached




 memcache的默认端口 11211
 mysql 数据库默认端口 3306
 apache的默认端口 80


 $memcacheOBj->connect("memcache服务器名称",端口);


 长连接 pconnect("memcache服务器名称",端口);


添删改查


  add(key,value,bool,time);  如果已经存在key,返回false, 如果成功返回true
  set(key,value,bool,time);   
参数解释:
   key: 键 用来定位一个数据
   value: 值 需要保存的数据内容
  bool: 是否压缩: 通常使用false
  time:当前存储数据的过期时间,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效


 get(key); 返回 该key 的value  , key的数据类型可以是数组 字母




替换
replace(key,value,bool,time);替换已经存在key 的值


删除
delete(key,time); //参数解释: time 表示在多长的时间后删除 如果是0 表示马上删除




//清除所有数据
$mem->flush(); 表示清空缓存


//关闭连接 
$mem->close(); 


实例:


链接
<?php


/**
 * @author phpadmin
 * @copyright 2012
 */
$memcacheOBj=new Memcache();
$conn=$memcacheOBj->connect('localhost',11211) or die('memcahce 服务器连接失败');
if($conn){
    echo 'memcahce 服务器连接成功'; 
}
?>


多台服务器服务器连接




添加
<?php


/**
 * @author phpadmin
 * @copyright 2012
 */
$mem=new Memcache();
 $conn=$mem->connect('127.0.0.1',11211) or die('memcache 连接失败');
if($conn){
    $result=$mem->set('test','华育国际lmap25班'); 
    if($result){
          $value=$mem->get('test');
          echo $value;
    }
}
?>


修改
<?php


/**
 * @author phpadmin
 * @copyright 2012
 */
$mem=new Memcache();
 $conn=$mem->connect('127.0.0.1',11211) or die('memcache 连接失败');
if($conn){
      $tmp=$mem->replace('test','我要更改了,你读取出来看看');
      if($tmp){
         echo  $mem->get('test');
      }
}
?>
数据缓存与mysql的应用
<?php


/**
 * @author phpadmin
 * @copyright 2012
 */
$conn=mysql_connect('localhost','root','');
mysql_select_db('memcache');
mysql_set_charset('utf8');
/**
 * 在项目中实际的应用
 *  在查询数据库之前 先查询是否有缓存 如果没有再 查询数据库
-*/
$mem=new Memcache();
$tmp=$mem->connect('127.0.0.1',11211) or die('memcache 连接失败');
$query='select * from mytest order by id desc';
if($tmp){
     $value=$mem->get('$query');
     if($value){
            echo '<pre>';
              print_r($value);
           echo '</pre>';
            echo 'memcache';
     }else{
            $result=mysql_query($query);
             while($rows=mysql_fetch_assoc($result)){
                  $values[]=$rows;
             }
               $return=$mem->set('$query',$values);
               if($return){
                   echo '<pre>';
                     print_r($values);
                   echo '</pre>';
                    echo 'sql';
               }
 


     }
}
?>


 封装数据库查询函数+memcahce---


  实现该函数过程:
         函数名: query()
         参数:  sql dblink  memcache  isflush
         实现的过程:
             1. 是否需要更新
             2. 是--->查询数据库--->写入memcache--返回数据
             3. 否---->是否存在该缓存--->是----->查询memcahe--返回数据
                                         否----->查询数据库-->写入memcache-->返回数据






应用场景:
   论坛---->在发表话题---2000/s 并发


-----实现数据缓存的架构;
   实现应用的基本逻辑:
           按照时间高底峰器来交替进行缓存和数据的操作
        1. 当前用户的所有写入或者读取都按照组、话题、时间端将数据写入多个memcahe 服务器中
         2. 将memcache 的数据导入到数据库中




-----购物车的实现-----  
     用户添加购物车--->写入缓存--->下单--->将下单的内容进行数据库操作---->写入用户的购物清单(修改库存商品)
  -------------->在服务器不忙的时候,将memcache 里面的数据写入数据库
    --->购物车---->将memcache 和 数据库里面的出来        
     
下单的人很多,数据库出现瓶颈了。




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




分布式应用 
Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。 


上面只是一个简单的举例。在实际的工作中根据自己的实际业务来进行考虑,或者去想更合适的方法。 




减少数据库压力 

这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。 






一台服务器的内存很小  那10 100台服务器就大了
所以可以链接很多台服务器,然后平均分配数据(像发扑克牌一样)
初始化一个Memcache的对象: 
$mem = new Memcache; 
$mem->connect("192.168.0.200", 11211); 
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2', 11211);  在保证memcache都打开的时候
往里面add数据 然后分别到同的服务器里面查看memcache里面分别存放了什么数据






Memcache 命中率
缓存命中率 = get_hits/cmd_get * 100% (总命中次数/总请求次数)
要提高memcached的命中率,预估我们的value大小并且适当的调整内存页大小和增长因子是必须的。
命中率的提升可以通过多种方案实现.
其一,提高服务获取的内存总量
其二,提高空间利用率,这实际上也是另一种方式的增加内存总量
其三,应用一级别上再来一次LRU
其四,对于整体命中率,可以采取有效的冗余策略,减少分布式服务时某个server发生服务抖动的情况


一些注意
1. memcache已经分配的内存不会再主动清理。
2. memcache分配给某个slab的内存页不能再分配给其他slab。
3. flush_all不能重置memcache分配内存页的格局,只是给所有的item置为过期。
4. memcache最大存储的item(key+value)大小限制为1M,这由page大小1M限制
5.由于memcache的分布式是客户端程序通过hash算法得到的key取模来实现,不同的语言可能会采用不同的hash算法,同样的客户端程序也有可能使用相异的方法,因此在多语言、多模块共用同一组memcached服务时,一定要注意在客户端选择相同的hash算法
6.启动memcached时可以通过-M参数禁止LRU替换,在内存用尽时add和set会返回失败
7.memcached启动时指定的是数据存储量,没有包括本身占用的内存、以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意。
8.memcache存储的时候对key的长度有限制,PHP和C的最大长度都是250








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值