原文发表在我的个人网站:利用 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 服务端装好并启动之后,并不能写一行代码直接开始使用了,我们还需要安装 客户端
。目前有两种方式比较推荐:
- 安装 PHP 的 Redis 扩展。
- 使用 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
是否会在设定的时间结束后从页面上消失。
代码分析
- 我们创建了
\Redis
类,提供了::set()
、::get()
和::delete()
三个静态方法,用于新增、获取和删除一对key-value
。 -
::set()
方法支持设定key-value
键值对的生命周期,并支持h
、m
、s
和ms
四个单位,代表时、分、秒和毫秒,这样就可以方便地用于缓存了。 - 严格意义上讲,缓存类至少还需要一个
判断 key 是否还存在
的基本操作,所以这个类还只是一个略微强大的 Redis 接口。 - 建造缓存接口作为练习,大家可以尝试自己动手写一下。选择新建 Cache 类或者在 Redis 类中新增接口均可。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。