zoukankan      html  css  js  c++  java
  • 【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存

    本教程示例代码见 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 PredisClient;
    
    /**
    
    * 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 类中新增接口均可。

  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/dreamboycx/p/12084918.html
Copyright © 2011-2022 走看看