zoukankan      html  css  js  c++  java
  • 写一个Redis封装类

    打算自己封装一个Redis操作类,方便使用,且有一定log记录。
    Redis的封装思路:
    基于Redis类进一步封装


    一般属性

    单例 (配置参数从配置文件中读取还是写死?考虑多配置之间切换)

    常规操作根据业务单独处理。(注意健壮性和容错)

    目的不同,可能做的封装也同。
    我们要基于业务做一些抽象程度较低的封装,也会根据需要,做一些tool级别的高抽象的封装。如果抽象的足够高,可以让通用性变得更好。
    这次封装Redis,我先做一个通用性的Redis操作类,先仅作最基本的一些操作。

    代码如下:

    <?php
    /**
     * Created by PhpStorm.
     * User: freephp
     * Date: 2016/1/4
     * Time: 11:09
     */
    
    class MyRedis extends Redis {
    
        public static $instance = null;  // 单例对象
    
        public $isConnect = false; // 判断redis是否链接成功
    
        public $connectMsg = ''; // redis链接信息
    
        public $date = null; // log记录日期
    
        private $config = [
            //主(master)服务器
            'master' => [
                'hostname' => '192.168.1.223',
                'password' => 'sewerew',
                'port' => '6379',
                'timeout' => '5',
            ],
            //从(slave)服务器
            'slave' => [
                'hostname' => '192.168.1.230',
                'password' => 'qweqq',
                'port' => '6379',
                'timeout' => '5',
            ]
        ];
    
        function __construct($params = array()) {
            parent::__construct();
            $serverArray = $this->config;
    
            //组装参数
            $hostname = $serverArray['master']['hostname']; //连接地址
            $password = $serverArray['master']['password']; //密码
            $port = $serverArray['master']['port']; //端口
            $timeout = $serverArray['master']['timeout']; //超时
            //选择用户指定的主机和数据库
            if (isset($params['redis']) && array_key_exists($params['redis'], $serverArray)) {
                $hostname = $serverArray[$params['redis']]['hostname']; //连接地址
                $password = $serverArray[$params['redis']]['password']; //密码
                $port = $serverArray[$params['redis']]['port']; //端口
                $timeout = $serverArray[$params['redis']]['timeout']; //超时
            }
            $this->date = date('Y-m-d', time());
    
            $this->_connect($hostname, $port, $timeout, $password);
        }
    
        /**
         *  连接数据库
         *
         * @param string $hostname  主机地址
         * @param int    $port      redis端口
         * @param int    $timeout   超时时间默认30s
         * @param string $password  验证密码
         * @param bool   $isPConnect  是否长连接:默认false非长连接
         * @return bool               返回值:成功返回true,失败false
         */
        private function _connect($hostname, $port = 6379, $timeout = 5, $password = '', $isPConnect = false) {
            //开始连接数据库
            try {
                if ($isPConnect == false) {
                    $status = $this->connect($hostname, $port, $timeout);
                } else {
                    $status = $this->pconnect($hostname, $port, $timeout);
                }
    
                if (!$status) {
                    error_log(date('Y-m-d H:i:s') . ":" . 'redis connect error' . "	",3, "./application/logs/redis-error-{$this->date}.log");
                    return $this->response(false, 'redis connect error');
                }
            } catch (Exception $e) {
                error_log(date('Y-m-d H:i:s') . ":" . $e->getMessage() . "	",3, "./application/logs/redis-error-{$this->date}.log");
                return $this->response(false, $e->getMessage());
            }
    
            //验证密码
            if ($password && !$this->auth($password)) {
                error_log(date('Y-m-d H:i:s') . ":" . 'redis password error' . "	",3, "./application/logs/redis-error-{$this->date}.log");
                return $this->response(false, 'redis password error');
            }
    
            return $this->response(true, 'redis connect success');
        }
    
    
        public static function getInstance($params = array(), $flag = false) {
            if (!(self::$instance instanceof self) || $flag) {
                self::$instance = new self($params = array());
            }
            return self::$instance;
        }
    
        /**
         * 返回消息
         *
         * @param  bool   $status   状态
         * @param  string $msg      消息
         * @return void
         */
        private function response($status = false, $msg = '') {
            $this->isConnect = $status; //判断redis是否连接成功
            $this->connectMsg = $msg;  //连接redis的消息通知
            return $status;
        }
    
    }
    
    // 调用
    $myredis = new MyRedis(); var_dump($myredis->connectMsg);die();

     我们基于更详细业务做的其他封装类可以使用这个MyRedis作为一个注入类,多用组合,实现解耦。

  • 相关阅读:
    Hexo
    没有建立起壁垒就容易在竞争中失败(绑定形成利益共同体,稀缺性,早期靠非共识,中期靠执行力,后期靠垄断性)
    Delphi 的TStringBuilder防止服务器内存碎片化
    JSON与Delphi Object的互换
    Delphi调用爷爷类的方法(自己构建一个procedure of Object)
    Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 )
    接口幂等性的实现方式
    Topshelf+Quartz3.0
    时间复杂度
    调优工具/技术网站
  • 原文地址:https://www.cnblogs.com/freephp/p/5098259.html
Copyright © 2011-2022 走看看