单例模式封装Redis操作类
为什么要封装 Redis 的操作类
原因非常简单, 使用过 Redis 的都知道, 通常我们 set
一个数据需要以下几步操作
$ip = '127.0.0.1';
$port = 6379;
$redis = new Redis();
$redis->pconnect($ip, $port, 1);
$key = "test";
$value = "this is test";
$redis->set($key, $value);
如果项目真的很小, 只有几处用到Redis的操作, 那么以上的操作完全可以每次都写一遍
但是项目只要不是很小, 就会遇到维护和管理的问题, 把这些什么 new
、connect
、close
全部抽象成 gateway,封装缓存单例,封装底层驱动等等就很有必要了。
当然,网上已经有无数多的轮子了,直接用现成的轮子完全没有任何毛病,出于学习的目的,造一个玩具车、遥控车也不是不行,嘻嘻~
封装Redis操作类
class Rds
{
private static $redis;
private static $instance;
private static $status;
private function __construct()
{
self::$redis = new \Redis();
self::$status = self::$redis->pconnect('127.0.0.1', 6379, 1);
}
public static function __callStatic($name, $arguments) {
!self::$instance && self::$instance = new self;
return self::$status ? self::$instance->$name($arguments) : false;
}
private function exists($e) {
return self::$redis->exists($e[0]);
}
private function get($e) {
return json_decode(self::$redis->get($e[0]), true);
}
private function set($e) {
return self::$redis->set($e[0], json_encode($e[1], 320));
}
private function setex($e) {
return self::$redis->setex($e[0], $e[1], json_encode($e[2], 320));
}
public function __destruct()
{
self::$redis->close();
}
}
看看, 造一个玩具车就是这么简单~ 调用方法如下:
Rds::exists('key')
Rds::get('key');
Rds::set('key', ['foo' => 'bar']);
Rds::setex('key', 60, ['foo' => 'bar']);
看看上面调用方法写起来是不是让人感觉心旷神怡? 哈哈哈 妈妈再也不用担心我写一堆乱七八糟的代码了
注解
最后,解释一下为什么要在析构函数中进行 close
?
pconnect
即长连接,还有一个 connect
即短连接,它们的区别是:
长连接只有在当前的 FastCGI 进程被 PHP-FPM 回收时才会被释放,长连接的生命周期就是当前 FastCGI 进程的生命周期,而短连接会在 FastCGI 进程每次接收到 Web Server 的请求后就会重新打开一个, 在执行完请求, 返回数据给 WebServer 后被释放
所以可以看出长连接的作用主要是用于连接复用,降低连接成本的,手动 close
就是出于此目的。
close
不是真正释放当前的 FastCGI 进程与 Redis 的连接,而是关闭当前连接,让这个连接能够更快速地让其他客户端拿来复用,避免因为当前连接没有关闭而一直占用着一个连接,其他客户端就必须新建连接,那这个连接就浪费了。

发布评论
还没有评论,快来抢沙发吧!