本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer


回顾

上两篇文章中我们完成了 View 视图加载类和 Mail 邮件发送类的设计,完成了两个可插拔组件。本篇文章中我们将构建另一个可插拔组件——'Redis 接口',并使用它构建 'MFFC' 的高速缓存服务。

正文

Redis 简介

'Redis' 是一个高性能的 'key-value' 数据库,其 'value' 支持 'String'、'Map(Hash)'、'list'、'set' 和 'sorted sets',中文翻译为 字符串、字典(哈希,在'世界上最好的语言PHP' 中属于 '数组' 的一部分)、列表、集合和有序集合。

我们可以用 Redis 作为高速缓存,存放系统经常需要访问的数据。相比使用文件作为缓存,Redis 拥有更高的性能、更好地可维护性和更强大的操作 API。

Redis 安装

Redis 官网为 http://redis.io/ ,可以很容易地下载安装并在命令行直接启动,它默认监听 '6379' 端口。

Redis 服务端装好并启动之后,并不能写一行代码直接开始使用了,我们还需要安装 '客户端'。目前有两种方式比较推荐:

1. 安装 PHP 的 Redis 扩展

2. 使用 nrk/predis 包。

注意:作为 PHP 扩展安装时,请先打印出 'phpinfo()',找到 'Loaded Configuration File' 这一项,编辑这个 'php.ini' 才有效。别忘了 '重启' Apache 或者 php-fpm。

Redis 使用

我们在此选择 'nrk/predis' 包作为 Redis 驱动。编辑 'composer.json':

"require": {

  "codingbean/macaw": "dev-master",

  "illuminate/database": "*",

  "filp/whoops": "*",

  "nette/mail": "*",

  "predis/predis": "*"

},

运行 'composer update',等待安装完成。

然后我们就要开始构建 Redis 类了,新建 'services/Redis.php':

<?php

use Predis\Client;

/**

* \Redis

*/

class Redis

{

  const CONFIG_FILE = '/config/redis.php';

  protected static $redis;

  public static function init()

  {

    self::$redis = new Client(require BASE_PATH.self::CONFIG_FILE);

  }

  public static function set($key,$value,$time=null,$unit=null)

  {

    self::init();

    if ($time) {

      switch ($unit) {

        case 'h':

          $time *= 3600;

          break;

        case 'm':

          $time *= 60;

          break;

        case 's':

        case 'ms':

          break;

        default:

          throw new InvalidArgumentException('单位只能是 h m s ms');

          break;

      }

      if ($unit=='ms') {

        self::_psetex($key,$value,$time);

      } else {

        self::_setex($key,$value,$time);

      }

    } else {

      self::$redis->set($key,$value);

    }

  }

  public static function get($key)

  {

    self::init();

    return self::$redis->get($key);

  }

  public static function delete($key)

  {

    self::init();

    return self::$redis->del($key);

  }

  private static function _setex($key,$value,$time)

  {

    self::$redis->setex($key,$time,$value);

  }

  private static function _psetex($key,$value,$time)

  {

    self::$redis->psetex($key,$time,$value);

  }

}

新建配置文件 'config/redis.php':

<?php

return [

  'host' => '127.0.0.1',

  'port' => 6379

];

然后我们就可以开始测试啦~ 在 'HomeController' 中增加:

Redis::set('key','value',5,'s');

echo Redis::get('key');

运行一次后将上面一行注释掉,不断刷新,看 'value' 是否会在设定的时间结束后从页面上消失。

代码分析

1. 我们创建了 '\Redis' 类,提供了 '::set()'、'::get()' 和 '::delete()' 三个静态方法,用于新增、获取和删除一对 'key-value'。

2. '::set()' 方法支持设定 'key-value' 键值对的生命周期,并支持 'h'、'm'、's' 和 'ms' 四个单位,代表时、分、秒和毫秒,这样就可以方便地用于缓存了。

3. 严格意义上讲,缓存类至少还需要一个 '判断 key 是否还存在' 的基本操作,所以这个类还只是一个略微强大的 Redis 接口。

4. 建造缓存接口作为练习,大家可以尝试自己动手写一下。选择新建 Cache 类或者在 Redis 类中新增接口均可。


【完结】

【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存的更多相关文章

  1. 利用 Composer 完善自己的 PHP 框架(一)——视图装载

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 经过了上一个 系列教程  <利用 Comp ...

  2. 利用 Composer 完善自己的 PHP 框架(二)——发送邮件

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 上一篇文章中,我们手工建造了一个简易的视图加载器 ...

  3. 利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备

    『Composer 一统天下的时代已经到来!』——白岩松 “一个时代结束了,另一个时代开始了.” Framework Interoperability Group(框架可互用性小组),简称 FIG,成 ...

  4. 利用composer安装laraval

    首先,毋庸置疑我们需要安装composer.这个在我上一篇文章中有提到,这里不做过多赘述. 其次,配置composer国内镜像.(如果不配置国内镜像,你们懂得) 打开cmd输入以下命令即可 compo ...

  5. 利用jQuery扩展接口为jQuery框架定义了两个自定义函数,然后调用这两个函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. php 利用composer引用第三方类库构建项目

    经常看到各种开源库推荐使用 composer 安装代码,却总是看不懂怎么用composer, 这几天静下心来学习了composer的使用,发现这可真是一个好东西,先贴上一个讲的很棒的视频教程: PHP ...

  7. 【实践】如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统)

    如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统) 一.环境配置 1. Python3.7.x(注:我用的是3.7.3.安 ...

  8. ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存

    基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...

  9. 数据库历险记(三) | 缓存框架的连环炮 数据库历险记(二) | Redis 和 Mecached 到底哪个好? 数据库历险记(一) | MySQL这么好,为什么还有人用Oracle? 面对海量请求,缓存设计还应该考虑哪些问题?

    数据库历险记(三) | 缓存框架的连环炮   文章首发于微信公众号「陈树义」,专注于 Java 技术分享的社区.点击链接扫描二维码,与500位小伙伴一起共同进步.微信公众号二维码 http://p3n ...

随机推荐

  1. LeetCode题解——4Sum

    题目: 给定一个数组,找出其中和为0的所有4个数组合,每个组合内的4个数非递降. 解法: ①先排序,然后利用4个指针,前两个遍历,后两个在第二个指针之后的部分里夹逼,时间O(N3). ②或者利用一个哈 ...

  2. 对Spring的理解

    1.Spring实现了工厂模式的工厂类,这个类名为BeanFactory实际上是一个接口,在程序中通常BeanFactory的子类ApplicationContext.Spring相当于一个大的工厂类 ...

  3. Nonlinear Transform

    前文中,我们已经学习了linear classification,linear regression,logistic regression三种线性方法. 如何解决这种问题呢? 其实很好解决,只需要加 ...

  4. Oracle11g TNS-12541:TNS无监听程序

    Oracle11g TNS-12541:TNS 无监听程序 问题描述:Oracle11.2客户端访问服务器端服务一直正常,隔了一段时间没有用,再次连接时出现错误“TNS-12541:TNS 无监听程序 ...

  5. 集合-Collection

    集合中存放的依然是对象的引用,而不是对象本身 ArrayList: 1) ArrayList底层使用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的O ...

  6. 使用logback.xml配置来实现日志文件输出

    转自:http://sungang-1120.iteye.com/blog/2104296 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback- ...

  7. 转】Maven学习总结(四)——Maven核心概念

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4051819.html 感谢! 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中 ...

  8. Web Service学习之六:CXF解决无法处理的数据类型

    CXF不能够处理像Map复杂的数据类型,需要单独转换处理. 总体思路:创建一个转换器和一个对应的可以处理的数据结构类型,将不能处理的类型转换成可以处理的类型: 步骤: 一.创建一个可以处理的类型 举例 ...

  9. CodeForces 567A Gerald is into Art

    http://codeforces.com/problemset/problem/567/A A. Lineland Mail time limit per test 3 seconds memory ...

  10. Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)

    题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...