header-bg.jpg
单例模式封装Redis操作类
发表于 2018-12-11 02:47
|
分类于 PHP
|
评论次数 0
|
阅读次数 2901

7841544274435.gif

为什么要封装 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的操作, 那么以上的操作完全可以每次都写一遍

但是项目只要不是很小, 就会遇到维护和管理的问题, 把这些什么 newconnectclose 全部抽象成 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 的连接,而是关闭当前连接,让这个连接能够更快速地让其他客户端拿来复用,避免因为当前连接没有关闭而一直占用着一个连接,其他客户端就必须新建连接,那这个连接就浪费了。

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