刚开始处理的时候,临时想做一个统一接口的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存储工具类补上
分享到:
相关推荐
**Memcache监控工具详解** Memcache是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高应用程序性能。然而,为了确保Memcache系统的稳定性和高效运行,实时监控其运行状态至关...
"memadmin"是一款专为Memcached设计的图形化管理工具,它允许用户通过友好的界面进行添加、删除、查看和更新缓存项,以及监控Memcached服务器的性能指标。该工具通常包含以下核心功能: - 实时监控:显示Memcached...
JAVA遍历Memcache缓存中所有的KEY的方法,可以直接引入使用。
Memcache是一种广泛应用于Web开发中的分布式内存缓存系统,它能有效地缓解数据库的负载,提高网站性能。...为了充分利用这类工具,建议定期检查和分析监控数据,根据实际情况做出相应的调整和优化。
本文将深入探讨基于C#编写的MemCache监控管理工具,帮助读者理解和应用这一工具。 首先,我们需要了解C# MemCache监控管理工具的基本概念。这款工具主要针对使用MemCache作为缓存服务的C#应用程序,提供了一套直观...
总的来说,基于MemCache的分布式扩展算法是应对大数据量、高并发场景的有效工具,它简化了数据库升级和迁移的复杂性,提高了网站的响应速度和用户体验。随着技术的发展,MemCache和其他NoSQL数据库将继续在分布式...
mctop是一款基于Ruby开发的命令行工具,它模仿了经典的Linux系统监控工具`top`,专为监控Memcache服务器设计。通过mctop,你可以获得关于Memcache服务器性能的实时、详细信息,以便于优化和调试。 1. **主要功能:*...
在基于Windows的环境中,由于其主要设计为Linux环境下的服务,因此在Windows上使用通常需要借助第三方客户端工具进行管理和监控。这个压缩包提供的是一个专为Windows编译的MemCache客户端监控工具,这对于Windows...
memcache图形监控工具phpmemcache,尽是一个PHP文件就可以实现对memcache的监控。 使用方法:本地测试监控机安装Apache或者下载XAMPP(Apache+MySQL+PHP+PERL),安装后把memcachephp.zip中的memcache.php文件放到...
1. **Key-Value存储**:Memcache基于键值对的存储方式,每个缓存项都有一个唯一的键,对应一个值,值可以是任意类型的数据。 2. **内存管理**:Memcache将所有数据存储在内存中,不涉及磁盘操作,因此读写速度极快...
标题"memcache1.2.1 for windows"指的是Memcache的1.2.1版本,这是专为Windows操作系统设计的一个内存缓存系统。Memcache是一个广泛使用的开源高性能分布式内存对象缓存系统,它能够通过在内存中存储数据来减少对...
本文将深入探讨一个基于PHP编写的Memcache性能监视工具,以及它如何帮助我们理解和优化Memcache的性能。 Memcache性能监视工具通常包含一系列功能,如查看缓存命中率、统计存储的键值对数量、监控内存使用情况等。...
该项目为Java平台量身打造的缓存工具类库,集成了memcache、redis和ehcache三种缓存技术,提供高效的数据存储解决方案。源码包含33个文件,包括24个Java源文件、3个POM依赖配置文件、2个属性文件、1个Git忽略文件、1...
- 客户端库:对于Java开发,常用的客户端库是memcached client for java(也称为spymemcached),它提供方便的API接口,便于Java应用程序与Memcache服务器进行通信。 - 其他依赖:在Windows环境下,可以下载预编译...
这是一个php的memcache操作类可以下载看一下
在Windows环境下安装Memcache是一个相对较为特殊的操作,因为Memcache主要设计用于Unix/Linux系统,但通过一些工具和步骤,我们也可以在Windows上实现这一过程。本文将详细介绍在Windows上安装Memcache的步骤,并...
这个扩展提供了丰富的函数接口,如`memcache_connect()`用于连接到Memcached服务器,`memcache_get()`和`memcache_set()`用于获取和设置缓存数据,以及`memcache_delete()`用于删除缓存项等。 描述中的“放到相应...
4. **连接测试**:通过telnet工具连接到本地Memcache服务,端口号为11211: ```bash telnet 127.0.0.1 11211 ``` 若在安装过程中出现缺少文件的情况,可按照以下步骤操作: - **下载扩展**:下载`memcache.dll`...
标题中的“自己写的一个php memcache操作类”指的是一个自定义的PHP类,用于与Memcached缓存系统进行交互。Memcached是一种广泛使用的分布式内存对象缓存系统,它能够提高Web应用的性能,通过存储数据在内存中,避免...
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 ...