• redis单例模式


    看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改.

    单例模式(Singleton Pattern 单件模式或单元素模式)

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

    单例模式有以下3个特点:

    1 . 它必须有一个构造函数,而且构造函数必须为私有

    2.必须有一个保存实例的静态成员变量

    3.拥有一个访问这个实例的公共的静态方法

    为什么使用单例模式?

    PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。

    单例模式下面上代码:

    class Predis {
    
        private static $handler = null;
        private static $_instance = null;
        private static $options = [
            'host' => '127.0.0.1',
            'port' => 6379,
            'password' => '',
            'db' => 0,
            'timeout' => 0,
            'expire' => 0,
            'persistent' => false,
            'prefix' => '',
        ];
    
        /*
         * 私有构造函数
         */
        private function __construct($options = [])
        {
            if (!extension_loaded('redis')) {
                throw new BadFunctionCallException('not support: redis');      //判断是否有扩展
            }
    
            if (!empty($options)) {
                self::$options = array_merge(self::$options, $options);
            }
    
            $func = self::$options['persistent'] ? 'pconnect' : 'connect';     //长链接
    
            self::$handler = new Redis;
            self::$handler->$func(self::$options['host'], self::$options['port'], self::$options['timeout']);
    
            if ('' != self::$options['password']) {
                self::$handler->auth(self::$options['password']);
            }
    
            if (0 != self::$options['db']) {
                self::$handler->select(self::$options['db']);
            }
    
        }
    
        /**
         * @return Predis|null 对象
         */
        public static function getInstance()
        {
            if (!(self::$_instance instanceof self)){
                self::$_instance = new self();
            }
    
            return self::$_instance;
        }
    
        /*
         * 禁止外部克隆
         */
        final public function __clone()
        {
            trigger_error('Clone is not allow!',E_USER_ERROR);
        }
    
    
        public function set($key, $value, $time = 0 ) {
            if(!$key) {
                return '';
            }
            if(is_array($value)) {
                $value = json_encode($value);
            }
    
            if(!$time) {
                return self::$handler->set($key, $value);
            }
    
            return self::$handler->setex($key, $time, $value);
        }
    
        public function get($key) {
            if(!$key) {
                return '';
            }
    
            return self::$handler->get($key);
        }
    
        public function __call($name,$args)
        {
            return call_user_func_array([self::$handler,$name],$args);
        }
    
    }
    
    //测试
    Predis::getInstance()->set('name','孙悟空');
    echo Predis::getInstance()->get('name')."
    ";
    
    Predis::getInstance()->sadd('myset','贝吉塔');
    print_r(Predis::getInstance()->sMembers('myset'));
  • 相关阅读:
    MJExtension使用
    使用html5结构化元素
    我的第一个html页面
    编写delegate(明天补充)
    iOS 获取系统相册数据(不是调系统的相册)
    CocoaLumberjack+XcodeColor(输出带有颜色的日志)在安装过程中遇到的问题
    iOS基础-UIKit框架-高级视图-UIPickerView-实例1:点菜(列与列之间无关系)
    iOS基础-UIKit框架-基础视图-UIScrollView
    OC与iOS开发
    Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法---1-2章
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/10736465.html
Copyright © 2020-2023  润新知