使用laravel的Redis时候乱用Facades踩了一个坑。。。

判断Redis是否有某个key值得时候是可以这样写,

Redis::exists(key值)

因为使用了Redis门面,所以可以直接使用Redis::exists而不用先建立实例,就是文档中介绍的“Facade 基类使用魔术方法 __callStatic() 从你的门面中调用解析对象”。

简单说就是没有exists这个静态方法,使用的时候会调用__callStatic(),建立实例:

$instance = static::getFacadeRoot();

使用Redis时候没有使用默认库0,所以按照文档上的例子指定服务,

代码如下:

Redis::connection('users');
Redis::exists(key值)

这么做不能判断key值是否存在,测试以后发现第二行Redis::exists连接的仍然是默认库0。

乱用Facades踩到坑了!

我用的是laravel5.2,redis使用Predis。

虽然Redis的Facades是一个静态代理,在使用时候"Redis::"也是静态唯一的,BUT connection并不是一个静态方法。

Redis对应的Facades底层类 Illuminate\Redis\Database,connection方法如下

    /*** Get a specific Redis connection instance.** @param  string  $name* @return \Predis\ClientInterface|null*/public function connection($name = 'default'){return Arr::get($this->clients, $name ?: 'default');}

返回redis的链接实例。

实际上$this->clients在Redis::调用__callStatic()建立实例的时候就已经初始化,

    /*** Create a new Redis connection instance.** @param  array  $servers* @return void*/public function __construct(array $servers = []){$cluster = Arr::pull($servers, 'cluster');$options = (array) Arr::pull($servers, 'options');if ($cluster) {$this->clients = $this->createAggregateClient($servers, $options);} else {$this->clients = $this->createSingleClients($servers, $options);}}

打印发现 $this->clients 是将 redis的所有配置都初始化,当connection传入配置名的时候选择这个配置链接实例。

虽然Redis实例是静态的,但是这个redis链接并不是。

Redis::exists()更是和connection()方法无关,redis门面调用__callStatic()后会执行 Illuminate\Redis\Database 的exists方法,但是Database没有这个方法,所以触发__call()方法。

    /*** Dynamically make a Redis command.** @param  string  $method* @param  array   $parameters* @return mixed*/public function __call($method, $parameters){return $this->command($method, $parameters);}

而command() 方法使用的是default配置,也就是说Redis::所有方法除了connection都是默认库。

    /*** Run a command against the Redis database.** @param  string  $method* @param  array   $parameters* @return mixed*/public function command($method, array $parameters = []){return call_user_func_array([$this->clients['default'], $method], $parameters);}

所以要使用非默认配置的同一个redis链接时候必须保存redis实例,

$redis = Redis::connection("user");
$redis->exists(key值);

$redis->exists 不会调用database的command方法,redis继续使用connection选择的初始化链接,不会选择default配置。

这其实还涉及到Predis底层的实现,已经超出我的理解范围。

看完代码感觉还是有点晕。。。

反正Redis门面还是不要乱用。

转载于:https://blog.51cto.com/daweilang/1911917

PHP laravel框架Redis门面的误用相关推荐

  1. (最全laravel面试必备)面试官问:你对laravel 框架了解多少,为什么说是优雅的框架?

    下面是自己的一些总结,面试的时候可以适用回答. laravel 框架的特点和优秀是集合了php语言的特点,和很多的设计模式.loc模式.依赖注入形成了自己的特定特性. 第一点:Laravel 的亮点 ...

  2. Laravel中Redis的配置和使用

    引入redis composer require predis/predis 会在composer.json中引入最新版本的predis composer update 把下载predis 库加入到v ...

  3. laravel框架的基础学习路线(不带composer的)

    首先,博主这里一直用的都是laravel的一键安装包,所以一直没有用composer来操作过laravel.很多事情不用composer也能完成.这里主要是写给公司同事的一个laravel框架入手顺序 ...

  4. laravel框架中文手册_Laravel框架的这些你都懂的话,它核心架构基本就懂了

    使用过arave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一下 ...

  5. laravel框架应用和composer扩展包开发

    laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,laravel框架思想前卫,跟随时代潮 ...

  6. php框架所用到的核心概念,【PHP】PHP现代框架代表-Laravel框架核心技术特性

    一.php语言特点及发展现状 1.服务端脚本语言,自由度太大 ,一个业务逻辑可言写在模型里,控制器里,也可以单独封装成一个类,甚至可以嵌入到html里,这样势必会造成混乱,业务逻辑散落在各处,尤其对于 ...

  7. php 框架源码分析,Laravel框架源码解析之模型Model原理与用法解析

    本文实例讲述了Laravel框架源码解析之模型Model原理与用法.分享给大家供大家参考,具体如下: 前言 提前预祝猿人们国庆快乐,吃好.喝好.玩好,我会在电视上看着你们. 根据单一责任开发原则来讲, ...

  8. laravel框架 APP 支付宝支付

    首先去 支付宝 下载sdk 我下载的SDK放在第三方vendor中如下: 放入地址以后给alipay权限: sudo chmod -R 777 alipay 放入vendor以后在composer.j ...

  9. laravel框架基础知识总结

    一.laravel简介 laravel是一套优雅简介的PHP开发框架,受欢迎程度非常之高,功能强大,工具齐全:以下是本人在学习过程中记录的laravel比较基础的资料,权当学习笔记,请大神们多多指教 ...

最新文章

  1. MVC4项目中验证用户登录一个特性就搞定
  2. 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像
  3. Java并发教程–线程池
  4. 服务器需要哪些芯片,云计算的服务器需要芯片
  5. 什么导致了android.os.NetworkOnMainThreadException异常
  6. RUBY常用类库文档翻译以及使用示例
  7. Verilog 7人投票表决器
  8. 修改Eclipse配色方案
  9. OP-TEE内核学习笔记(一)(安全存储)—— 安全文件基础操作(创建、读、写)
  10. 【ModelScope】KAN-TTS搭建SAMBERT个性化语音合成开发环境
  11. 教你微信怎么加更多好友的绝佳方法
  12. 如何提高学生对计算机英语的兴趣论文,如何培养小学生英语学习的兴趣_英语论文.doc...
  13. SWUST OJ 1012: 哈希表(链地址法处理冲突)
  14. 解决:el-input添加clearable属性后出现2个×清除图标
  15. 根据视频地址获取视频的第一帧画面做为封面 IllegalArgumentException
  16. 视频编码起源历史发展及现状
  17. 简易51单片机密码锁
  18. 聊一聊龙蜥硬件兼容性 SIG 那些事儿 | 龙蜥 SIG
  19. R 数据可视化 03 | 圈图
  20. AM335x(TQ335x)学习笔记——Nandamp;amp;网卡驱动移植

热门文章

  1. mysqlinnodb教程_MySQL创建数据表时设定引擎MyISAM/InnoDB操作
  2. wxpython开发实例_Python中使用wxPython开发的一个简易笔记本程序实例
  3. 20210310 20210311 :栈、队列、堆类题目合集
  4. (补)20200328:两两交换链表中的节点(leetcode24)
  5. cmd怎么使用post请求’_flutter中dio的post请求方式使用总结
  6. c2665 “initgraph”: 2 个重载中没有一个可以转换所有参数类型_一个使用延迟候选项生成的用于自动化程序修复方法的工具...
  7. python接收邮件内容启动程序_如何使用python获取电子邮件的文本内容?
  8. 总结之前有道笔记的内容--对于Touch 的不同讲解
  9. 光影之路 GPU架构发展史(3/4)
  10. ICLR 2019提交截止,近1600篇论文已全部上线