`
wxlgzxx_1988
  • 浏览: 66352 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于memcache接口的统一存储工具类设计

阅读更多

刚开始处理的时候,临时想做一个统一接口的key-value数据的存储方式。然后我模拟memcached接口,写了个简单的k-v数据存储的工具类。
临时想到,暂且记下。

1. 接口类 /**

* 存储工具抽象接口类

*

*/

abstract class StoreTool

{

abstract public function set($key, $val);

abstract public function get($key);

abstract public function replace($key, $val);

abstract public function delete($key);

abstract public function flush();

abstract public function increment($key, $val=1);

abstract public function add($key, $val);

}



复制代码
2. memcached和mysql处理 (mysql用的heap engine) /**

* mysql heap engin 存储工具类

*

*/

class DbStoreTool extends StoreTool

{

static private $_instance;

private $_dbh;

private $_tablename = 'mmouc_memory_kv';



static public function getInstance($config) {

  if (self::$_instance == null) {

   self::$_instance = new self($config);

  }

  return self::$_instance;

}



private function __construct($config) {

  $conn = $config['persistency'] ? mysql_pconnect($config['host'].':'.$config['port'], $config['user'], $config['password'])

     : mysql_connect($config['host'].':'.$config['port'], $config['user'], $config['password']);



  if($conn) {

   if($config['charset']) mysql_query("SET NAMES '" . $config['charset'] . "'", $conn);



   if(!empty($config['database'])) {

    $dbselect = mysql_select_db($config['database'], $conn);

    if(!$dbselect) {

     mysql_close($conn);

     $conn = $dbselect;

    }

   }



   $this->_dbh = $conn;

   $this->_tablename = $config['tablename'];

  }

}



/**

  * Store data at the server

  * stores an item var with key on the memcached server

  *

  * @param unknown_type $key

  * @param unknown_type $val

  * @return unknown

  */

public function set($key, $val) {

  $res = $this->update($key, $val);

  if (0 === $res) {

   return $this->add($key, $val);

  }

  return true;

}



/**

  *  Replace value of the existing item

  *  should be used to replace value of existing item with key.

  *  In case if item with such key doesn't exists, This function returns FALSE

  *

  * @param unknown_type $key

  * @param unknown_type $val

  * @return unknown

  */

public function replace($key, $val) {

  $res = $this->update($key, $val);

  if (0 === $res) {

   return false;

  }

  return true;

}



public function get($key) {

  if (is_array($key)) {

   $in_keys = "'" . implode("','", $key) . "'";

   $sql = "

    SELECT `k`, `v` FROM `" . $this->_tablename . "`

    WHERE `k` IN ({$in_keys})

   ";

   $res = mysql_query($sql, $this->_dbh);



   if (empty($res)) {

    return MMO_STORE_OP_ERROR;

   }



   $_arr_res = array();

   while ($row = mysql_fetch_assoc($res)) {

    $row['v'] = unserialize($row['v']);

    $_arr_res[$row['k']] = $row;    

   }



   $out = array();

   foreach ($key as $_k) {

    $out[] = $_arr_res[$_k]['v'];

   }

   return $out;



  } else if (is_string($key)) {



   $sql = "

    SELECT `v` FROM `" . $this->_tablename . "`

    WHERE `k`='{$key}'

   ";

   $res = mysql_query($sql, $this->_dbh);



   if (empty($res)) {

    return -1;

   }

   $row = mysql_fetch_assoc($res);

   if (empty($row)) {

    return MMO_STORE_ITEM_NOT_EXIST;

   }

   return unserialize($row['v']);

  } else {



   return false;

  }



}



public function delete($key) {

  $sql = "

   DELETE FROM `" . $this->_tablename . "`

   WHERE `k`='$key'   

   ";

  $res = mysql_query($sql, $this->_dbh);

  if (!$res) {

   return MMO_STORE_OP_ERROR;

  }

  return mysql_affected_rows($this->_dbh);

}



public function flush() {

  $sql = " TRUNCATE TABLE `" . $this->_tablename . "` ";

  $res = mysql_query($sql, $this->_dbh);

  return $res ? true : false;

}



/**

  *

  * TODO:

  * 修改这里的并发访问问题

  *

  * @param unknown_type $key

  * @param unknown_type $val

  * @return unknown

  */

public function increment($key, $val=1) {

  $_db_val = $this->get($key);

  if (MMO_STORE_ITEM_NOT_EXIST == $_db_val) {

   //不存在

   return false;  

  }



  $val = intval($_db_val) + intval($val);

  $this->update($key, $val);

  return $val;

}



/**

  * Add an item to the server

  *

  * stores variable var with key only if such key doesn't exist at the server yet

  *

  * @param unknown_type $key

  * @param unknown_type $val

  * @return unknown

  */

public function add($key, $val) {

  if (!$this->_isExist($key)) {

   $val = serialize($val);

   $time = time();

   $sql = "

    INSERT INTO `" . $this->_tablename . "`

    SET `k`='{$key}',

        `v`='{$val}',

        `t`='{$time}'

   ";

   $res = mysql_query($sql, $this->_dbh);

   return $res ? true : MMO_STORE_OP_ERROR;



  } else {

   return false;

  }

}





private function _isExist($key, $val='') {

  $sql = "

   SELECT COUNT(`k`) as 'num'

   FROM `" . $this->_tablename . "`

   WHERE `k`='{$key}'

  ";

  !empty($val) && $sql .= ", `v`='" . serialize($val) . "'";

  $res = mysql_query($sql, $this->_dbh);

  if (empty($res)) {

   return -1;

  }

  $row = mysql_fetch_assoc($res);

  return $row['num'] ? true : false;

}



private function update($key, $val) {

  $val = serialize($val);

  $time = time();

  $sql = "

   UPDATE `" . $this->_tablename . "`

   SET `v`='{$val}',

       `t`='{$time}'

   WHERE `k`='$key'   

   ";

  $res = mysql_query($sql, $this->_dbh);

  if (!$res) {

   return MMO_STORE_OP_ERROR;

  }

  return mysql_affected_rows($this->_dbh);

}

}



class FileStoreTool

{



}



class MemcacheStoreTool extends StoreTool

{

static private $_instance;

private $_memcacheHandler;



static public function getInstance($config) {

  if (self::$_instance == null) {

   self::$_instance = new self($config);

  }

  return self::$_instance;

}



private function __construct($config) {

  $this->_memServers = $config;

  $this->_initMemcacheObj();

}



public function set($key, $val) {

  return $this->_memcacheHandler->set($key, $val);

}

public function get($key) {

  return $this->_memcacheHandler->get($key);

}



public function replace($key, $val) {

  return $this->_memcacheHandler->replace($key, $val);

}



public function delete($key) {

  return $this->_memcacheHandler->delete($key);

}

public function flush() {

  return $this->_memcacheHandler->flush();

}

public function increment($key, $val=1) {

  return $this->_memcacheHandler->increment($key, $val);

}



public function add($key, $val) {

  return $this->_memcacheHandler->add($key, $val);

}



/**

    * 检查保存Session数据的路径是否存在

    *

    * @return bool 成功返回true

    */

   private function _initMemcacheObj(){

       if (!class_exists('Memcache') || !function_exists('memcache_connect')){

           die('Failed: Memcache extension not install, please from http://pecl.php.net download and install');

       }       

       if ($this->_memcacheHandler && is_object($this->_memcacheHandler)){

           return true;

       }

       $this->_memcacheHandler = new Memcache;

       if (!empty($this->_memServers)) {

          foreach ($this->_memServers as $_host => $_port) {

            $this->_memcacheHandler->addServer($_host, $_port);

        }

       }



       return true;

   }

}



复制代码
3. mysql和file相关

mysql 记录方式,对应表 建表语句如下:
CREATE TABLE IF NOT EXISTS `mmouc_memory_kv` (
`k` varchar(40) NOT NULL COMMENT '键名',
`v` varchar(2048) NOT NULL COMMENT '键值的serialize值',
`t` int(10) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`k`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COMMENT='代替memcache数据记录表';
对于file,暂未处理,以后补上。


4. todo:

a. 对于memcached数据的遍历方式策略,需要做一个完备而统一接口的策略算法处理类,可以在多种分级存储模式,和存储策略间任意切换;
b. file存储工具类补上

 

分享到:
评论
1 楼 Tracy-Lcz 2011-07-22  
不错!!!!!!!!!!!

相关推荐

    memcache监控工具

    memcache 监控工具,可以实现实时对内存中的memcache进行监控 获取值等等

    memcache图形管理工具

    memcache图形管理工具

    java遍历Memcache所有key的工具类

    JAVA遍历Memcache缓存中所有的KEY的方法,可以直接引入使用。

    memcache图形监控工具phpmemcache

    memcache图形监控工具phpmemcache,尽是一个PHP文件就可以实现对memcache的监控。 使用方法:本地测试监控机安装Apache或者下载XAMPP(Apache+MySQL+PHP+PERL),安装后把memcachephp.zip中的memcache.php文件放到...

    memcache监视工具

    在windows下通过memcache监视工具可以很方便的监视查看memcache中的数据信息

    memcache分布式缓存操作类

    这是一个php的memcache操作类可以下载看一下

    Memcache工具包、客户端、服务端

    资源包括:C#客户端、Windows服务端、服务端管理工具、memcache测试安装

    Memcache 监控工具 mctop.zip

    Memcache 监控工具 mctop ,mctop 与 top 相似,主要用于监视 Memcache 的流量,包括 key 的调用次数、对象...

    memadmin 安装,memcache监控工具,详细文档

    memadmin 安装,memcache监控工具,详细文档以及所需工具软件

    MemCache开发说明文档

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

    简易 memcache 图形化管理器

    php memcache 图形化管理工具 This source file is subject to version 3.0 of the PHP license, that is bundled with this package in the file LICENSE, and is available through the world-wide-web at the ...

    Memcache 性能监视工具

    Memcache 性能监视工具 PHP脚本 小巧,灵活,方便。

    go语言工具类

    总结的go语言的工具类,包括json,xml,redis,memcache等的用法,配置的解析等

    memcache 客户端监控工具编译版(window版)

    memcache 客户端监控工具编译版(window版),很有用的一个工具,监控key情况助手,好东西一定要分享。

    php封装Memcache队列缓存类.zip

    介绍一个php封装Memcache队列缓存类,memcache客户端连接,队列是否可更新,缓存队列生命周期时间,当客户断开连接,允许继续执行,取消脚本执行延时上限,当取出元素时,改变队列首的数值,当添加元素时,改变队列尾的...

    C# MemCache 监控管理工具

    C# MemCache 监控管理工具 ,具体功能描述请查看http://www.cnblogs.com/xffy1028/archive/2013/02/01/2861706.html

    php数据库缓存Memcache操作类.zip

    整理了一个Memcache数据缓存操作类库文件,希望对各位会有帮助,操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以...

    基于MySql的海量日志分析系统设计

    基于MySql的海量日志分析系统设计 主要内容: 日志分析系统查询需求分析 访问特点分析 基于性能考虑的系统体系架构 基于需求的mysql优化及表设计 基于需求的memcache使用 其他开源工具的使用 总结

    memcache安装包,memcache

    memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问。

    memcache1.2.1 for windows

    windows下memcache安装包 附带php扩展包

Global site tag (gtag.js) - Google Analytics