首页 » PHP笔记 » PHP使用Redis集群 封装RedisCluster类

PHP使用Redis集群 封装RedisCluster类

高蒙 2020/10/23 16:11 1.2k浏览 8评论 PHPRedisPHP技术


最近项目要进行升级改造,之前的Redis单例和主从配置的方式,要向Redis集群的方向迁移。于是就简单的封装了RedisCluster类。

PHP本身已经有了最底层的方法,这里呢,只是封装了一层,便于开发使用。

注意:PHP安装的redis扩展的时候,记得要安装3.0以上的版本,不然会不支持Redis集群的调用方式。

class Rediscluster
{

    /**
     * 集群地址
     * @var array
     */
    protected $servers = [
        '192.168.1.10:7000',
        '192.168.1.10:7001',
        '192.168.1.11:7002',
        '192.168.1.11:7003',
        '192.168.1.12:7004',
        '192.168.1.12:7005',
    ];

    private static $instance = [];
    
    protected $options = array(
        'prefix' => '',
        'timeOut' => 3,
        'readTime' => 3,
        'persistent' => true // 是否复用链接
    );


    public function __construct($servers = array(), $optionParam = array())
    {
        if (!empty($servers) && is_array($servers)) {
            $this->servers = $servers;
        }

        if (!empty($optionParam) && is_array($optionParam)) {
            $this->options = $optionParam;
        }

        try {
            $this->handler = new \RedisCluster(null, $this->servers,
                $this->options['timeOut'],
                $this->options['readTime'],
                $this->options['persistent']
            );
            // 主从节点 读取分配策略
            $this->handler->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES);
            return $this->handler;
        } catch (\Exception $exception) {
            return null;
        }

    }
    
    /**
     * 获取类单例
     * @param array $options
     * @param int $db_index
     * @return self
     */
    public static function getRedisInstance($options = [])
    {
        try {
            if (isset(self::$instance[$options['prefix']]) && self::$instance[$options['prefix']]->Ping("") === true) {
                return self::$instance[$options['prefix']];
            }
        } catch (\Exception $e) {
        }
        self::$instance[$options['prefix']] = new self($options);
        return self::$instance[$options['prefix']];
    }

    /**
     * 读取缓存
     * @access public
     * @param string $name 缓存变量名
     * @return mixed
     */
    public function get($name)
    {
        $key = $this->options['prefix'] . $name;
        $value = $this->handler->get($key);
        $jsonData = json_decode($value, true);
        return ($jsonData === NULL) ? $value : $jsonData;
    }


    /**
     * 写入缓存
     * @access public
     * @param string $name 缓存变量名
     * @param mixed $value 存储数据
     * @param integer $expire 有效时间(秒)
     * @return boolean
     */
    public function set($name, $value, $expire = null)
    {
        if (is_null($expire)) {
            $expire = $this->options['expire'];
        }
        $key = $this->options['prefix'] . $name;
        //对数组/对象数据进行缓存处理,保证数据完整性
        $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value;
        if (is_int($expire) && $expire) {
            $result = $this->handler->setex($key, $expire, $value);
        } else {
            $result = $this->handler->set($key, $value);
        }
        return $result;
    }

    /**
     * 删除缓存
     * @access public
     * @param string $name 缓存变量名
     * @return boolean
     */
    public function rm($name)
    {
        $key = $this->options['prefix'] . $name;
        return $this->handler->del($key);
    }

    /**
     * 清除缓存
     * @access public
     * @return boolean
     */
    public function clear()
    {
        return $this->handler->flushDB();
    }

    public function hMset($key, $value)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->hMset($key, $value);
    }

    public function hMGet($key, $array)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->hMGet($key, $array);
    }

    public function hSet($key, $field, $value)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->hSet($key, $field, $value);
    }

    public function hGet($key, $value)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->hGet($key, $value);
    }

    public function hIncrBy($key, $field, $value)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->hIncrBy($key, $field, $value);
    }

    public function zIncrBy($key, $increment, $member)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->zIncrBy($key, $increment, $member);
    }

    public function INCR($key)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->INCR($key);
    }

    public function expire($key, $time)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->expire($key, $time);
    }

    public function ZREVRANK($key, $field)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->ZREVRANK($key, $field);
    }

    public function ZREVRANGE($key, $begin, $end)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->ZREVRANGE($key, $begin, $end);
    }

    public function HGETALL($key)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->HGETALL($key);
    }

    /**
     * 添加无序集合
     * @DateTime:    2020-04-07 15:53:09
     * @Author:  gm
     */
    public function Zsadd($key, $value)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->SADD($key, $value);
    }

    /**
     * 判断无序集合成员是否存在
     * @DateTime:    2020-04-07 15:53:09
     * @Author:  gm
     */
    public function Zsismember($key, $value)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->SISMEMBER($key, $value);
    }

    /**
     * 获取集合的成员数
     * @DateTime:    2020-04-07 15:53:09
     * @Author:  gm
     */
    public function Zscard($key)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->SCARD($key);
    }

    /**
     * 指定自增增量值
     * @DateTime:    2020-05-08 15:53:09
     * @Author:  gm
     */
    public function INCRBY($key, $num)
    {
        $key = $this->options['prefix'] . $key;
        return $this->handler->INCRBY($key, $num);
    }

}

使用:

new Rediscluster::getRedisInstance()

以上就是在PHP中使用Redis集群,并且封装RedisCluster类的所有内容。




相关文章

我有话说

站长昵称:(*)

输入内容:

选个头像:

评论列表

    ...

    高蒙

    男, PHP程序猿

    文章

    492

    标签

    43

    热度

    10w+

    南京, 江苏, 中国

    人生要是没有理想, 那跟咸鱼有什么分别。