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

原文發表在個人我的網站:利用 Composer 完善本身的 PHP 框架(三)——Redis 緩存php


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


回顧

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

正文

Redis 簡介

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

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

Redis 安裝

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

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

  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,等待安裝完成。composer

而後咱們就要開始構建 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 鍵值對的生命週期,並支持 hmsms 四個單位,表明時、分、秒和毫秒,這樣就能夠方便地用於緩存了。
  3. 嚴格意義上講,緩存類至少還須要一個 判斷 key 是否還存在 的基本操做,因此這個類還只是一個略微強大的 Redis 接口。
  4. 建造緩存接口做爲練習,你們能夠嘗試本身動手寫一下。選擇新建 Cache 類或者在 Redis 類中新增接口都可。

【本系列完結】

相關文章
相關標籤/搜索