原文发表在个人我的网站:利用 Composer 完善本身的 PHP 框架(三)——Redis 缓存php
本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composerhtml
上两篇文章中咱们完成了 View 视图加载类和 Mail 邮件发送类的设计,完成了两个可插拔组件。本篇文章中咱们将构建另外一个可插拔组件——Redis 接口
,并使用它构建 MFFC
的高速缓存服务。git
Redis
是一个高性能的 key-value
数据库,其 value
支持 String
、Map(Hash)
、list
、set
和 sorted sets
,中文翻译为 字符串、字典(哈希,在世界上最好的语言PHP
中属于 数组
的一部分)、列表、集合和有序集合。github
咱们能够用 Redis 做为高速缓存,存放系统常常须要访问的数据。相比使用文件做为缓存,Redis 拥有更高的性能、更好地可维护性和更强大的操做 API。redis
Redis 官网为 http://redis.io/,能够很容易地下载安装并在命令行直接启动,它默认监听 6379
端口。数据库
Redis 服务端装好并启动以后,并不能写一行代码直接开始使用了,咱们还须要安装 客户端
。目前有两种方式比较推荐:json
注意:做为 PHP 扩展安装时,请先打印出
phpinfo()
,找到Loaded Configuration File
这一项,编辑这个php.ini
才有效。别忘了重启
Apache 或者 php-fpm。数组
咱们在此选择 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
是否会在设定的时间结束后从页面上消失。
\Redis
类,提供了 ::set()
、::get()
和 ::delete()
三个静态方法,用于新增、获取和删除一对 key-value
。::set()
方法支持设定 key-value
键值对的生命周期,并支持 h
、m
、s
和 ms
四个单位,表明时、分、秒和毫秒,这样就能够方便地用于缓存了。判断 key 是否还存在
的基本操做,因此这个类还只是一个略微强大的 Redis 接口。