当前位置:首页 > 原创作品 > emlog使用memcache缓存替代文件缓存

emlog使用memcache缓存替代文件缓存

作者:星之宇 ┊ 时间:2014-5-25 8:31 ┊ 分类: 原创作品 ┊ 阅读:8289 ┊ 评论:15

这次只是简单的HACK emlog cache程序,使用memcache缓存来替代文件缓存,毕竟memcache缓存在内存, 文件缓存在硬盘(要看I/O的性能),一般来说内存的性能大于硬盘,所以一般来说memcache缓存优于文件缓存。

memcache相对于文件缓存的优点:

1、读写性能优异,特别是高并发时和文件缓存比有明显优势。

2、memcached组建支持集群,并且是自动管理负载均衡


注意:memcache的原理是内存分块,单个item大于1M的数据存memcache和读取速度可能有点慢。

具体的情况这边我这里就不测试了,大家可以帮忙测试看看。


[2014-05-25]memcache 1.0beta

1、替换文件缓存为memcache缓存

2、去除文件缓存写入和读取


注意:虽然不涉及数据库操作,但是还是请在修改前备份数据

1、首先添加memcache类文件Mcache.php,放在include/lib文件夹下,服务器地址和端口地址在该文件中,请你自己配置

<?php
/**  
 * 此类为单例模式,取得实例方法: $cache = MCache::getInstance();
 * @author Star.Yu <vip@myxzy.com> 
 * @date 2014.5.25
 *
 */
class MCache{
 private static $_instance;
 private static $_connect_type = '';
 private $_memcache;
 
 /**
  * 私有化构造函数,禁止使用关键字new来实例Mcache类
  */
 private function __construct() {
  if (!class_exists('Memcache')) {
   throw new Exception('Class Memcache not exists');
  } 
  $conn = self::$_connect_type;
  $this->_memcache = new Memcache();
  $this->_memcache->$conn('localhost', '11211');
 }
 
 /**
  * 克隆私有化,禁止克隆实例
  */
 private function __clone() {}
 
 /**
  * 类入口,通过此静态方法对类进行实例化
  */
 public static function getInstance($type = 'connect'){
  self::$_connect_type = ($type == 'connect') ? $type : 'pconnect';
  if (!self::$_instance instanceof self) {
   self::$_instance = new self();
  }
  return self::$_instance;
 }
 
 /**
  * 把数据添加到缓存
  * @param string $key 缓存的key
  * @param string|array|int... $value 缓存的数据
  * @param int $flag  使用zlib MEMCACHE_COMPRESSED
  * @param int $expire_time  缓存时间
  */
 public function set($key, $value,$flag = 0 ,$expire_time = 0){
   $this->_memcache->set($key, $value, $flag, $expire_time);   
 }

 /**
  * 替换缓存数据
  * @param string $key 缓存的key
  * @param string|array|int... $value 缓存的数据
  * @param int $flag  使用zlib MEMCACHE_COMPRESSED
  * @param int $expire_time  缓存时间
  */
 public function replace($key, $value,$flag = 0 , $expire_time = 0){
   $this->_memcache->replace($key, $value, $flag, $expire_time);   
 }
 
 /**
  * 从缓存读取数据
  * @param string|array|int... $key
  */
 public function get($key){
  return $this->_memcache->get($key); 
 }
 
 /**
  * 从缓存删除数据
  * @param string|array|int... $key
  */
 public function del($key,$expire_time = 0){
  $this->_memcache->delete($key, $expire_time);  
 }

 public function close(){
	return $this->_memcache->close(); 
 }
}

2、修改include/lib/cache.php,添加实例,第28行修改为

	private function __construct() {
		$this->db = Database::getInstance();
		$this->memcache = MCache::getInstance();
	}
3、修改include/lib/cache.php的读写memcache缓存,大概507行下面的cacheWrite和readCache函数修改为
	/**
	 * 写入缓存
	 */
	function cacheWrite ($cacheData, $cacheName) {
		$this->memcache->set($cacheName,$cacheData);
	}

	/**
	 * 读取缓存文件
	 */
	function readCache($cacheName) {
		if($this->memcache->get($cacheName)===false){call_user_func(array($this, 'mc_' . $cacheName));}
		$data = $this->memcache->get($cacheName);
		$this->{$cacheName.'_cache'} = unserialize($data);
		return $this->{$cacheName.'_cache'};
	}

到此修改已经完毕,已经缓存了文件缓存到memcache缓存中了,如有什么问题可以留言评论。

卸载方法:如果不想用memcache缓存了,就用原版的cache.php替换掉修改的cache.php,然后删除Mcache.php即可

目前有 15 条评论
avatar
颜兮 2017-02-13 23:10回复6楼
服务器需要安装什么来运行它吗?
你说的服务器和端口地址在哪里修改能说一下吗?
avatar
星之宇 2017-02-14 18:19回复
@颜兮:这个百度下memcache。
$this->_memcache->$conn('localhost', '11211');
avatar
hackhp 2015-10-28 14:27回复5楼
如果同一个服务器,多个emlog都用memcache缓存,会不会有冲突?或者其他问题呢?
avatar
星之宇 2015-10-28 14:29回复
@hackhp:是有冲突的,一般可以加前缀解决。
avatar
xu 2016-06-06 12:46回复
@星之宇:博主,你好!我不懂代码,加前缀要在哪个文件里加,有没有这方面的补充文章。我刚刚在主域名 用了cache.php和Mcache.php,没出现错误提示,应该是成功了。如果在二级域名的站点(单独安装了EMLOG)也这么操作,估计会冲突,不知道怎么设置了。盼指点,多谢!
avatar
星之宇 2016-06-06 12:58回复
@xu:写入缓存和读取缓存的时候加个前缀用于区别,测试下
    /**
     * 写入缓存
     */
    function cacheWrite ($cacheData, $cacheName) {
        $this->memcache->set('em2_'.$cacheName,$cacheData);
    }

    /**
     * 读取缓存文件
     */
    function readCache($cacheName) {
        if($this->memcache->get('em2_'.$cacheName)===false){call_user_func(array($this, 'mc_' . $cacheName));}
        $data = $this->memcache->get('em2_'.$cacheName);
        $this->{$cacheName.'_cache'} = unserialize($data);
        return $this->{$cacheName.'_cache'};
    }
avatar
xu 2016-06-07 12:12回复
@星之宇:博主你真好!多谢帮忙
avatar
hackhp 2015-10-28 14:12回复4楼
原来Mcache.php要小写,不看评论还不知道,难怪一直提示我mcache加载失败。
avatar
急求 2015-02-21 19:11回复3楼
return $this->{$cacheName.'_cache'};
怎么会有大括号?
avatar
星之宇 2015-02-21 20:30回复
@急求:括起来的要当成变量处理
avatar
emCupid 2014-08-10 11:17回复2楼
试了一下嘿嘿Mcache.php在linux下要小写~
avatar
星之宇 2014-08-10 11:20回复
@emCupid:Linux区分大小写的,windows测试过,效果没体现。
avatar
emCupid 2014-08-10 11:27回复
@星之宇:用的SSD盘,数据又少,好像效果并不是那么明显???
avatar
星之宇 2014-08-10 11:34回复
@emCupid:这个主要是并发的,博客的并发一般都不高,效果提升不大,然后IDC和本地毕竟是有区别的。这个应该算是一个折腾吧。
avatar
胶水 2014-07-29 10:38回复1楼
好东西,就要慢慢学习