看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的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')."\n"; Predis::getInstance()->sadd('myset','贝吉塔');
print_r(Predis::getInstance()->sMembers('myset'));

redis单例模式的更多相关文章

  1. TP5.0 Redis(单例模式)(原)

    看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改. 单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行 ...

  2. tp5 redis 单例模式 转载

    单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下3个特点: 1 . 它必须有一个构造函数, ...

  3. php redis 单例模式

    单例模式思想其实很简单 首先 有一个实例的静态变量 构造方法和克隆方法设置为私有,防止外部直接new 提供一个获取实例的静态方法 代码如下: class Redis { private static ...

  4. redis单例模式写法

    <?php /**只看红色重点 * =========================================================== * ZW_Memory_Cache * ...

  5. python 操作redis集群

    一.连接redis集群 python的redis库是不支持集群操作的,推荐库:redis-py-cluster,一直在维护.还有一个rediscluster库,看GitHub上已经很久没更新了. 安装 ...

  6. swoole学习--登录模块

    使用swoole+thinkphp6.0+redis 结合开发的登录模块,做完之后有几点感悟: 1.不要相信任务数据,包括请求的外部接口,特别是超时者部分,尽可能的交给task完成. 2.原来可以在入 ...

  7. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

    1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式. 在它的核心结构中仅仅包括一个被称为单例类的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问.从而方便对实例个 ...

  8. php多进程单例模式下的 MySQL及Redis连接错误修复

    前几天写了个php常驻脚本,主要逻辑如下 //跑完数据后休息60秒 $sleepTime = 60; $maxWorker = 10; while (true) { $htmlModel = new ...

  9. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

随机推荐

  1. c#获取当前系统时间,并提取按格式提取年月日为字符串

    class Program { static void Main(String[] args) { DateTime currentTime = System.DateTime.Now; string ...

  2. java封装的概念学习笔记

      继承.封装.多态.抽象是面向对象编程的四大基本概念,其中封装装为重要,因为从我们学习JAVA开始,就基本上接触了封装,因为JAVA中的所有程序都是写在类中的,类也能当做一种封装. 在面向对象中封装 ...

  3. redis哨兵架构的基础知识及部署和管理

    一.前言 1.哨兵的介绍 sentinal,中文名是哨兵 哨兵是redis集群架构中非常重要的一个组件,主要功能如下 ()集群监控,负责监控redis master和slave进程是否正常工作 ()消 ...

  4. python selenium 基本常用操作

    最近学习UI自动化,把一些常用的方法总结一下,方便自己以后查阅需要.因本人水平有限,有不对之处多多包涵!欢迎指正! 一.xpath模糊匹配定位元素 武林至尊,宝刀屠龙刀(xpath),倚天不出(css ...

  5. ubuntu下多版本OpenCV的共存与使用

    首先,OpenCV历史版本下载:https://www.opencv.org/releases.html 一.把不同版本的OpenCV安装在不同位置 下载好OpenCV源码,在安装之前打开CMakeL ...

  6. PHP:自己写的mysql操作类

    a{ font-weight: bold; display: block; text-align: center; color: #5887bf; font-size: 22px; } .conten ...

  7. Django08-批量创建数据

    通过views.py文件中创建 第1种方法循环创建数据, 这种方法不推荐,因为每一次循环都会连接一次数据库,效率较慢 def user_list(request): user_all = models ...

  8. 分享一个微信自动跳转外部浏览器下载app的api接口!

    现在微信渠道可以说是拉新最快的渠道,因为微信具备强裂变性.但是目前微信对第三方下载链接的拦截是越来越严格了,那么想要在微信内肆无忌惮地推广链接就需要用到微信跳转浏览器的接口,那如何获取该接口呢?   ...

  9. css 之过渡效果

    之前写css的效果,都是使用js 来完成的,但是写js比较耗费时间,有时候逻辑不对,还出不来效果,所以也比较烦:所以一些简单的效果,就使用css 来完成会比较好一些,不必耗费太多的精力: 但是写css ...

  10. C#进阶系列——WebApi 跨域问题解决方案:CORS(转载)

    C#进阶系列——WebApi 跨域问题解决方案:CORS   阅读目录 一.跨域问题的由来 二.跨域问题解决原理 三.跨域问题解决细节 1.场景描述 2.场景测试 四.总结 正文 前言:上篇总结了下W ...