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')."\n";
Predis::getInstance()->sadd('myset','贝吉塔');
print_r(Predis::getInstance()->sMembers('myset'));
redis单例模式的更多相关文章
- TP5.0 Redis(单例模式)(原)
看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改. 单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行 ...
- tp5 redis 单例模式 转载
单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下3个特点: 1 . 它必须有一个构造函数, ...
- php redis 单例模式
单例模式思想其实很简单 首先 有一个实例的静态变量 构造方法和克隆方法设置为私有,防止外部直接new 提供一个获取实例的静态方法 代码如下: class Redis { private static ...
- redis单例模式写法
<?php /**只看红色重点 * =========================================================== * ZW_Memory_Cache * ...
- python 操作redis集群
一.连接redis集群 python的redis库是不支持集群操作的,推荐库:redis-py-cluster,一直在维护.还有一个rediscluster库,看GitHub上已经很久没更新了. 安装 ...
- swoole学习--登录模块
使用swoole+thinkphp6.0+redis 结合开发的登录模块,做完之后有几点感悟: 1.不要相信任务数据,包括请求的外部接口,特别是超时者部分,尽可能的交给task完成. 2.原来可以在入 ...
- 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式. 在它的核心结构中仅仅包括一个被称为单例类的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问.从而方便对实例个 ...
- php多进程单例模式下的 MySQL及Redis连接错误修复
前几天写了个php常驻脚本,主要逻辑如下 //跑完数据后休息60秒 $sleepTime = 60; $maxWorker = 10; while (true) { $htmlModel = new ...
- Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...
随机推荐
- Jq写个联级菜单
这个效果很好看,Jq很容易实现: $(document).ready(function(){ $('.menu li').hover(function(){ $(this).children('ul' ...
- JS 实现兼容浏览器报警提示声音
<!DOCTYPE HTML> <head> <title>JS实现报警提示音</title> <meta http-equiv="co ...
- 使用requests+BeautifulSoup爬取龙族V小说
这几天想看龙族最新版本,但是搜索半天发现 没有网站提供 下载, 我又只想下载后离线阅读(写代码已经很费眼睛了).无奈只有自己 爬取了. 这里记录一下,以后想看时,直接运行脚本 下载小说. 这里是从 ...
- Postman A请求的返回值作为B请求的入参( 之‘’token‘’ ,用代码设置全局变量)
问题: 登陆接口获取token,其他接口访问时需携带token 方案: 在登陆接口访问后设置Postman的全局变量(Globals),例如设置环境变量名:token2,值(实时的不用自己手动设置的) ...
- Python科学计算结果的存储与读取
Python科学计算结果的存储与读取 总结于2019年3月17日 荆楚理工学院 计算机工程学院 一.前言 显然,作为一名工科僧,执行科学计算,需用Python.PS:快忘记Matlab吧.我用了二十 ...
- spring配置文件注入到静态变量
spring配置注入到静态文件代码如下: package com.test.oss; import org.springframework.beans.factory.annotation.Value ...
- JeecgBoot版本4月份新版即将发布,抢先体验。。
JeecgBoot版本4月份新版即将发布,抢先体验.. 即将发布版本-更新日志: 1.代码生成器GUI工具 2.支持一对多代码生成器 3.支持按钮权限 4.支持数据权限 ...
- 关于spring boot 的事务类型配置留存
一.在声明式的事务处理中,要配置一个切面,其中就用到了propagation,表示打算对这些方法怎么使用事务,是用还是不用,其中propagation有七种配置,REQUIRED.SUPPORTS.M ...
- Python re.findall函数不能匹配但是notepad++能匹配
我使用同样的表达式匹配同样的网页源码,在notepad++里面不能直接使用,需要将内容都弄到同一行中. 但是我使用 requests.get(self.url).content.decode('UTF ...
- (ZT)算法杂货铺——分类算法之决策树(Decision tree)
https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分 ...