IT基地
用户登陆
我要注册
用户名或密码错误
登 陆
注 册
IT基地 >李蓝猫的博客 >我要发文
Thinkphp Redis缓存驱动基础类 【修正版】
作者:李蓝猫   发布时间:2017-04-12 12:30:35   点击数:12616

针对底层TP支持Redis缓存基础类

原文出处 TP论坛 后做修改版

用于TP5.0以下若干版本

附类包源码

<?php

// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2017 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: lixiang <945559567@qq.com>
// +----------------------------------------------------------------------

defined('THINK_PATH') or exit();

/**
 * Redis缓存驱动 - 支持Redis集群与读写分离
 * 要求安装phpredis扩展:https://github.com/nicolasff/phpredis
 * @category   Extend
 * @package  Extend
 * @subpackage  Driver.Cache
 * @author    terry <i@pengyong.info>
 */
 
class CacheRedis extends Cache 
{
         /**
         * 架构函数
         * @param array $options 缓存参数
         * @access public
         */
        public function __construct($options=array()) 
        {
            if ( !extension_loaded('redis') ) {
                throw_exception(L('_NOT_SUPPERT_').':redis');
            }
            if(empty($options)) 
            {
                $options = array (
                    'host'          => C('REDIS_HOST') ? C('REDIS_HOST') : '127.0.0.1',
                    'port'          => C('REDIS_PORT') ? C('REDIS_PORT') : 6379,
                    'timeout'       => C('REDIS_TIMEOUT') ? C('REDIS_TIMEOUT') : 300,
                    //pengyong 2013年12月13日 16:21:01 add config
                    'persistent'    => C('REDIS_PERSISTENT') ? C('REDIS_PERSISTENT') : false,
                    'auth'        => C('REDIS_AUTH') ? C('REDIS_AUTH'):null,//auth认证
                    'rw_separate'    => C('REDIS_RW_SEPARATE') ? C('REDIS_RW_SEPARATE') :false,//主从分离
                );
            }
            $this->options =  $options;
            $this->options['expire'] =  isset($options['expire'])?  $options['expire']  :   C('DATA_CACHE_TIME');
            $this->options['prefix'] =  isset($options['prefix'])?  $options['prefix']  :   C('DATA_CACHE_PREFIX');        
            $this->options['length'] =  isset($options['length'])?  $options['length']  :   0;        
            $this->options['func'] = $options['persistent'] ? 'pconnect' : 'connect';
            $this->handler  = new Redis;
        }


        /**
         * 主从连接
         * @access public
         * @param bool $master true=主连接
         */
         
         
        public function master($master=false)
        {
            
            $host = explode(",",$this->options['host']);
            
            if(count($host) > 1 && $master ==false && $this->options['rw_separate']==true)
            {
                array_shift($host);
            }
            if($this->options['rw_separate']==false)
            {
                shuffle($host);
            }
            $this->options['master'] = $master ==true ? $host[0]:'';
            $this->options['slave'] = $master ==false ? $host[0]:'';
            $func = $this->options['func'];
            $connect = $this->options['timeout'] ===false ? 
            $this->handler->$func($host[0], $this->options['port']) :
            $this->handler->$func($host[0], $this->options['port'], $this->options['timeout']);
            //pengyong 2013年12月13日 16:17:50 支持认证模式
            if($this->options['auth']!=null)
            {
                    $this->handler->auth($this->options['auth']);
            }
        }

        /**
         * 读取缓存
         * @access public
         * @param string $name 缓存变量名
         * @return mixed
         */
         
         
        public function get($name) 
        {
            N('cache_read',1);
            $this->master(false);
            #F('read',$this->options['slave']);
            $value = $this->handler->get($this->options['prefix'].$name);
            $jsonData  = json_decode( $value, true );
            return ($jsonData === NULL) ? $value : $jsonData;    //检测是否为JSON数据 true 返回JSON解析数组, false返回源数据
        }

        /**
         * 写入缓存
         * @access public
         * @param string $name 缓存变量名
         * @param mixed $value  存储数据
         * @param integer $expire  有效时间(秒)
         * @return boolen
         */
         
         
        public function set($name, $value, $expire = null) 
        {
            N('cache_write',1);
            $this->master(true);
            #F('write',$this->options['master']);
            if(is_null($expire)) 
            {
                $expire  =  $this->options['expire'];
            }
            $name   =   $this->options['prefix'].$name;
            //对数组/对象数据进行缓存处理,保证数据完整性
            $value  =  (is_object($value) || is_array($value)) ? json_encode($value) : $value;
            //删除缓存操作支持
            if($value===null)
            {
                return $this->handler->delete($this->options['prefix'].$name);
            }
            if(is_int($expire) && $expire !=0) 
            {
                $result = $this->handler->setex($name, $expire, $value);
            }
            else
            {
                $result = $this->handler->set($name, $value);
            }
            if($result && $this->options['length']>0) 
            {
                // 记录缓存队列
                $this->queue($name);
            }
            return $result;
        }

        /**
        * 删除缓存
        * @access public
        * @param string $name 缓存变量名
        * @return boolen
        */
        
        
        public function rm($name) 
        {
            $this->master(true);
            return $this->handler->delete($this->options['prefix'].$name);
        }

        
        /**
        * 清除缓存
        * @access public
        * @return boolen
        */
        
        
        public function clear() 
        {
            $this->master(true);
            return $this->handler->flushDB();
        }


        /**
        * 析构释放连接
        * @access public
        */
        
        
        public function __destruct()
        {
            $this->handler->close();
        }
}


附类包代码

CacheRedis.class.zip


本站部分数据来自软件的自动采集,仅用于学习交流,决不用于商用,如有侵犯您的合法权益,请联系我们删除。
发表技术文档,,记录个人生活,聚集意见领袖,众多IT精英,以我们的技术让开发更便捷。
IT基地版权所有,伪版必究 京ICP备17064610号-1
微信QQ空间QQ好友新浪微博FacebookTwitter