memcache系列——memcache客户端类的实现(一)

原创 2013年12月01日 23:18:01

一个memcache类的具体实现过程:

class Core_Memcache {
    private $_cache;

    private $_isMemcached;

    private function _connect()
    {
        if ($this->_cache != null && is_object($this->_cache)) {
            return true;
        }

        if ($_isMemcached) {
            $this->_cached = new memcached();

            // 添加服务器
            $servers = array();
            foreach ($this->_config['servers'] as $server) {
                $server += array('host' => '127.0.0.1', 'port' => '11211', 'weight' => 1);
                $servers[] = array($server['host'], $server['port'], $server['weight']);
            }

            $this->_cache->addServers($servers);
            // 开启一致性哈希
            $this->_cache->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);

            // 开启ketama算法兼容,注意,打开本算法时,sub_hash会使用KETAMA默认的MD5
            $this->_cache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);

            // 设置哈希算法,当不使用KETAMA算法时,这个设置才生效,有几种可选择,不过如果启用ketama,这个选项是没用的
            // $this->_cache->setOption(Memcached::OPT_HASH, Memcached::HASH_MD5);
            // $this->_cache->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

            // 开启已连接socket的无延迟特性(在某些环境可能会带来速度上的提升)
            $this->_cache->setOption(Memcached::OPT_TCP_NODELAY, true);

            // 开启异步I/O。这将使得存储函数传输速度最大化。
            $this->_cache->setOption(Memcached::OPT_NO_BLOCK, true);
        } 
    }
}

 需要考虑的问题如下:

  (a)  安装了memcache服务器后,为什么php可以访问到memcache?

因为php提供了连接memcache的扩展,当使用到memcache这个扩展类的时候,就可以连接并使用memcache,连接一台memcache服务器需要知道服务器的ip,监听的端口号,权重。一台主机上可以按照多台memcache,只需要每个memcache监听的端口号不一样的就可以了。

 (b)memcache类是否可以做成单例模式  (即定义private $_cache 为 private static $_cache)?

      使用单例模式最重要的是理解类静态成员。在php发起一次请求中,多次调用memcache的类,静态成员变量$_cache只需要实例化一次,就可以被多个多个实例化类共享,这就是单例模式的好处,为了节约实例化同一个类的开销。但是memcache类是否能做出单例模式呢。

      显然是不能的,因为使用到memcache的时候,会根据不同的情况使用不同的配置文件(有多台memcache,对应相应的配置文件),也就是说,memcache可能会需要读取不同的配置文件实例化多次。

  (c)memcache 分布式算法的理解

     memcache分布式算法中,使用到了一致性算法,具体的算法实现请关注下一篇文章(php版) 

   (d)这个类中,如何实现调用memcache的内置方法?

使用PHP的魔术方法和内置函数call_user_func_array().

    /**
     * 调用魔术方法(大多数会直接转移调用原生方法,少部分方法会重写)
     *
     * @param string $method
     * @param mixed $args
     * @return mixed
     */
    public function __call($method, $args)
    {
        $this->_connect();
        return call_user_func_array(array($this->_cache, $method), $args);
    }

   写入:

    /**
     * 写入操作
     *
     * @param string $func set/add/replace
     * @param string $key
     * @param string $value
     * @param int $ttl
     * @return bool
     */
    private function _write($func, $key, $value, $ttl = 0)
    {
        $this->_connect();

        if ($this->_isMemcached) {
            return $this->_cache->$func($key, $value, $ttl);
        } else {
            return $this->_cache->$func($key, $value, MEMCACHE_COMPRESSED, $ttl);
        }
    }

具体写入方法:

    public function set($key, $value, $ttl = 0)
    {
        return $this->_write('set', $key, $value, $ttl);
    }

   (e)memcache析构函数,释放连接

    /**
     * 释放连接
     */
    public function __destruct()
    {
        if ($this->_cache && is_object($this->_cache)) {
            if (method_exists($this->_cache, 'close')) {
                $this->_cache->close();
            }
            $this->_cache = null;
        }
    }



    

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

用PHP实现memcache客户端

1、缘起偶然翻看openresty安装文件的目录,看到lualib/resty目录下有一些用lua写的模块,其中有个memcached.lua,原来是memcache客户端的源码,突然想起memcac...

用PHP实现memcache客户端(续)

1、说明睡了一觉,回想了下昨天的代码,发现有些地方写得不好: 出现错误时不必抛出异常,免得打断了正常的执行流程,而是仅仅记录错误信息,把异常交给使用者处理,这样更灵活 socket_create, s...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

MemCache的客户端优化

MemCached Cache在大型网站被应用得越来越广泛,不同语言的客户端也都在官方网站上有提供,但是Java的选择并不多。由于现在的MemCached Cache服务端是用C写的,因此对C不太熟悉...

memcache客户端操作memcached

memcache和memcached的安装过程我这里就不详细介绍了,我的博客里面有一、启动memcached[root@iZ23hh6yk41Z ~]# /usr/local/bin/memcache...

memcache Java客户端调用小例子

‍ 当然,这个小例子也是参考官方的说明,准确说是把官方的小例子原封不动的运行了一下,呵呵。希望大家不要说我太偷懒,不过我可是亲手运行了这个例子,绝不是直接转载的。 说真的,memcache的J...

spy memcache 客户端使用体会

incr 和desc 方法法引入        项目中需要使用到一个计数的功能,而且是在指定的时间段内某事物的使用的次数。经过查询使用到了memcache的incr 和desc方法。该功能很好用,分...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)