【完結】利用 Composer 完善本身的 PHP 框架(三)——Redis 緩存

【完結】利用 Composer 完善本身的 PHP 框架(三)——Redis 緩存

本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composerphp

 

回顧

上兩篇文章中咱們完成了 View 視圖加載類和 Mail 郵件發送類的設計,完成了兩個可插拔組件。本篇文章中咱們將構建另外一個可插拔組件——'Redis 接口',並使用它構建 'MFFC' 的高速緩存服務。html

正文

Redis 簡介

'Redis' 是一個高性能的 'key-value' 數據庫,其 'value' 支持 'String'、'Map(Hash)'、'list'、'set' 和 'sorted sets',中文翻譯爲 字符串、字典(哈希,在'世界上最好的語言PHP' 中屬於 '數組' 的一部分)、列表、集合和有序集合。git

咱們能夠用 Redis 做爲高速緩存,存放系統常常須要訪問的數據。相比使用文件做爲緩存,Redis 擁有更高的性能、更好地可維護性和更強大的操做 API。github

Redis 安裝

Redis 官網爲 http://redis.io/ ,能夠很容易地下載安裝並在命令行直接啓動,它默認監聽 '6379' 端口。redis

Redis 服務端裝好並啓動以後,並不能寫一行代碼直接開始使用了,咱們還須要安裝 '客戶端'。目前有兩種方式比較推薦:數據庫

1. 安裝 PHP 的 Redis 擴展json

2. 使用 nrk/predis 包。數組

注意:做爲 PHP 擴展安裝時,請先打印出 'phpinfo()',找到 'Loaded Configuration File' 這一項,編輯這個 'php.ini' 纔有效。別忘了 '重啓' Apache 或者 php-fpm。緩存

Redis 使用

咱們在此選擇 'nrk/predis' 包做爲 Redis 驅動。編輯 'composer.json':composer

"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 類中新增接口都可。

【完結】

相關文章
相關標籤/搜索