有否想过PHP使用 redis 作为缓存时,如何能:,1.前后台模块共用Model层;,2. 但是,不能每个Model类都进行缓存,这样太浪费Redis资源;,3. 前后台模块可以自由决定从数据库还是从缓存读数据;,4. 没有冗余代码;,5. 使用方便。,这里我们先展示实现的最终效果。,最终的代码和使用说明请移步Github:,马上安装使用命令:,经过简单配置就可以使用,请参看Github的README说明。,假设在MVC框架中, model 层有一个 Book 类和一个 getById 方法,如下:,加入缓存技术之后,原来方法的 调用方式 和 返回的数据结构 都不应该改变。
,所以,我们希望,最后的效果应该是这样的:,这样我们可以很清楚的明白自己在做什么,同时又知道数据的来源函数,并且被引用方式完全统一,可谓一箭三雕。
,其实实现起来也比较简单,就是使用PHP的魔术方法 __call() 方法。
,这里简单说明一下 __call 方法的作用。
,在PHP中,当我们访问一个不存在的类方法时,就会调用这个类的 __call() 方法。
,(如果类方法不存在,又没有写 __call() 方法,PHP会直接报错)
,假设我们有一个 Book 类:,当调用 存在的 getName(50) 方法时,程序打印: 我的ID是50 。
,而如果调用 不存在的 getAge() 方法时,程序就会执行到A类的 __call() 方法里面,这里会打印: 类Book不存在方法getAge 。
,这就是 __call 的原理。
,接下来我们就利用 __call() 方法的这种特性,来实现缓存策略。
,从上面的例子,我们看到, __call() 方法被调用时,会传入两个参数。
,$name :想要调用的方法名
,$arguments :参数列表
,我们就可以在参数上面做文章。
,还是以 Book 类为例,我们假设其原本结构如下:,开始之前,我们还确认Redis的连接,这是缓存必须用到的,这里我们写个简单的单例类:,然后,我们开始填充 __call() 方法代码,具体说明请看注释:,这样就实现了我们开始时的效果。
,在实际使用中,我们需要做一些改变,把这一段代码归入一个类中,
,然后在model层的基类中引用这个类,再传入Redis句柄、类对象、方法名和参数,
,这样可以降低代码的耦合,使用起来也更灵活。
© 版权声明
文章版权归作者所有,未经允许请勿转载。