`
jaketseng
  • 浏览: 40603 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

PHP支持组操作的Memcache类(域操作)

 
阅读更多
Memcache是PHP开发中较常用到的缓存方法,在高并发的系统中是必不可少的组成部分。
在实际开发中,Memcache存在一个比较不尽人意的问题,就是Memcache不能支持对key进行的组操作。

组操作,也可以称为域操作,比如说某个文章系统,在前台部分使用Memcache缓存了列表页数据、文章详细页数据,两种数据的量都比较多。那么,当后台发布了一篇文章的时候,列表页就应该需要更新到最新的列表——可能涉及到许多个列表页。当然,对文章详细页来说,它是不需要更新的。

好的,这个时候我们就需要删除原有缓存,让程序可以自动更新列表页数据。但是使用Memcache的flush函数有个问题,就是它会清空全部的数据,包括列表页和文章页的数据,在大并发的条件下,全部缓存删除后重建缓存的时候,将会有非常高的负载产生。

另外,还会有情况就是有些你不愿意删除的缓存变量,也会丢失了,比如说程序的配置,数据库为了提速而存到缓存的表结构等。

所以我们需要一个支持组操作的缓存机制,我们就可以把列表页设置成一个组,文章页数据是另外一个组,程序配置又是另外一个组等等。当需要重建列表页的时候,只需要删除列表页这个组里面全部的数据,而不会影响到别的组的数据。

测试了几种方案,还是以下的方案最为理想和高速,我们先看代码,再说原理:

<?php 
class MyCache 
{ 
    private $mmc = null; 
    private $group = null; 
    private $version = 1; 
    function __construct($group){ 
        if(!class_exists('mmcache')){ 
            $this->mmc = false; 
            return; 
        } 
        $this->mmc = new memcache(); 
        $this->mmc->addServer('192.168.1.5', 11211); 
        $this->mmc->addServer('192.168.1.6', 11211); 
        $this->group = $group; 
        $this->version = $this->mmc->get('version_'.$group); 
    } 
    function set($key, $var, $expire=3600){ 
        if(!$this->mmc)return; 
        return $this->mmc->set($this->group.'_'.$this->version.'_'.$key, $var, $expire); 
    } 
    function get($key){ 
        if(!$this->mmc)return; 
        return $this->mmc->get($this->group.'_'.$this->version.'_'.$key); 
    } 
    function incr($key, $value=1){ 
        if(!$this->mmc)return; 
        return $this->mmc->increment($this->group.'_'.$this->version.'_'.$key, $value); 
    } 
    function decr($key, $value=1){ 
        if(!$this->mmc)return; 
        return $this->mmc->decrement($this->group.'_'.$this->version.'_'.$key, $value); 
    } 
    function delete($key){ 
        if(!$this->mmc)return; 
        return $this->mmc->delete($this->group.'_'.$this->version.'_'.$key); 
    } 
    function flush(){ 
        if(!$this->mmc)return; 
        ++$this->version; 
        $this->mmc->set('version_'.$this->group, $this->version); 
    } 
} 
?> 


上面的类比较完整,包括链接Memcache服务,设置和获取值,增减值,还有删除key和全删除(flush)。这里包括了常规的Memcache操作功能,和对全删除(flush)操作的扩展。

从代码可以看到,支持组的flush功能的实现,是通过version这个key来实现的,也就是每次存该组的变量的时候,变量的key都会加入version值,version值是一个数字(从1开始),当存和取key的时候,version值都会被使用到。

当开发者要flush当前组的数据的时候,flush操作只是简单地改变一些version的值(加一),那么,下次存取key的时候,将获取不到原来的值——因为version改变了,也就是取的key名称已经改变了。这样原有的值会被Memcache自动回收,不会出现任何的效率开销。而且程序上只是增加一个version的存和取,数据量极小,对系统效率基本没有任何影响。

通过以上的类,可以针对Memcache缓存进行组的操作,而这个PHP类,还可以继续扩展,如加入socket直接访问memcache的接口功能,这样PHP环境中就不需要安装memcache扩展类了,这样更有效避免flush的误操作了,而且在加入apc等缓存机制后,socket访问memcache接口也不会比扩展慢多少。

另外,MyCache类还有个附加的功能:当memcache服务失效的时候,MyCache类只是简单返回空值,而不会直接出错。

以下附带MyCache类的使用方法:

// 引入定义 
include('MyCache.php');  
  
// 实例化 
$mc = new MyCache('abc'); // 要有域  
  
// 设置值 
$mc->set('word', 'hello world', 900);  
  
// 取得值 
echo $mc->get('word');  
  
// 删除值 
$mc->delete('word'); 
echo $mc->get('word');  
  
$mc->set('counter', 1, 290000); 
echo $mc->get('counter');  
  
// 增加值 
$mc->incr('counter'); 
$mc->incr('counter'); 
echo $mc->get('counter');  
  
// 减少值 
$mc->decr('counter'); 
echo $mc->get('counter');  
  
// 按组删 
$mc->flush(); 



分享到:
评论

相关推荐

    php支持组操作的Memcache类.zip

    Memcache是PHP开发中较常用到的缓存方法,在高并发的系统中是必不可少的组成部分。这个类比较完整,包括链接Memcache服务,设置和获取值,增减值...这里包括了常规的Memcache操作功能,和对全删除(flush)操作的扩展。

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

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

    memcache分布式缓存操作类

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

    自己写的一个php memcache操作类

    NULL 博文链接:https://yeyuan.iteye.com/blog/1284186

    PHP7.x 8.0 memcache dll php_memcache.dll

    php_memcache.dll

    php中Memcache操作类使用

    php中Memcache操作类使用方法,删除缓存的key ,刷新缓存但不释放内存空间,开启大值自动压缩,用于获取一个服务器的在线/离线状态,缓存服务器池中所有服务器统计信息等等 。

    PHP5.5/5.6的 32&63 VC11 Memcache扩展php_memcache.dll

    PHP 添加 Memcache 扩展 : 下载包中包括如下: php_memcache-3.0.8-5.5-nts-vc11-x64.zip php_memcache-3.0.8-5.5-nts-vc11-x86.zip php_memcache-3.0.8-5.5-ts-vc11-x64.zip ...

    memcache图形监控工具phpmemcache

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

    PHP 5.4 使用的 memcache

    PHP 5.4 使用的 memcache 包含 memcache 服务端 和 php_memcache.dll

    memcache3.08-php-源码

    memcache3.08-php-源码,可配合任意php编译。

    php-memcache单文件类库

    无需php-memcache扩展支持,引入单个文件即可连接memcached服务。 使用方法: $mc = new memcached(array( 'servers' =&gt; array('127.0.0.1:11211'), 'debug' =&gt; false, 'compress_threshold' =&gt; 10240, '...

    php中Memcache操作类使用.zip

    php中Memcache操作类使用方法,删除缓存的key ,刷新缓存但不释放内存空间,开启大值自动压缩,用于获取一个服务器的在线/离线状态,缓存服务器池中所有服务器统计信息等等 。

    php5.4.4-php_memcache

    php版本为5.4.4时使用的php_memcache.dll扩展,安装分布式缓存memcache时使用

    php封装Memcache队列缓存类.zip

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

    php7 php_memcache.dll

    php7的windows memcache的扩展,php_memcache.dl(支持64位,发现安装后不可用,看看你的phpinfo Architecture是x86还是x64 )

    php5.4_memcache.dll 64位

    php5.4 php_memcache.dll;memcached window64位

    php_memcache 服务扩展

    memcache win8 x64 php5.4.7 测试通过(开发套件 xampp 1.8.1) 配置如下: 1、开启memcached 服务,注意路径 memcached.exe -d install(安装) memcached.exe -d start(自动启动) 2、调整 php.ini 增加如下...

    windows php memcache 扩展

    windows 系统下 php memcache 扩展,包括 php7.0.x,php7.1.x,php7.2.x,php7.3.x

    PHP memcache 多版本拓展

    PHP memcache 多版本拓展库,包含php7以上的线性和非线性,vc14-vc16,64和x86

    memcache安装php5.2.17的php_memcache.dll

    该压缩包包含memcache-win安装包,安装说明文档,php5.2.17的php_memcache.dll

Global site tag (gtag.js) - Google Analytics