zoukankan      html  css  js  c++  java
  • 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'));
  • 相关阅读:
    __dict__
    谷歌浏览器如何清除当前页面的缓存
    博客园插入超链接时如何取消下划线
    杂七杂八
    博客园首页如何添加 Live 2D 模型
    访问 IIS 元数据库失败 的解决方法 .
    VS 关于无法打开项目文件,此安装不支持该项目类型的问题
    汉字转为unicode
    Windchill 预览效果偏向左边
    MD04
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/10736465.html
Copyright © 2011-2022 走看看