CacheSSDB.php 7.65 KB
<?php
/**
 * Created by PhpStorm.
 * User: shin
 * Date: 15/10/19
 * Time: 下午3:12
 */
namespace Hood\Cache;

use Hood\Core\Root;
use Hood\Cache\Ssdb;
use Hood\Debug\DebugException;
use Hood\Cache\Ssdb\SSDBException;

class CacheSSDB extends Root implements CacheInterface
{

    private $instances = array();

    private $section = 'ssdb';

    private $node = 'servers';

    private $childNodes = 'hosts';

    private $port = 8888;

    private $timeout = 5000;//毫秒

    private $persistentID = 'hood.ssdb';

    public function __construct($prefix = '', $persistentID = 'hood.ssdb')
    {
        parent::__construct();
        $this->persistentID = $persistentID;
    }


    /**
     * 设置子节点
     * @param $childNode
     * @return $this
     */
    public function setChildNodes($childNode)
    {
        $this->childNodes = $childNode;
        return $this;
    }


    /**
     * 设置配置的块
     * @param $section
     * @return $this
     */
    public function setSection($section)
    {
        $this->section = $section;
        return $this;
    }

    /**
     * 设置配置的块节点
     * @param $node
     * @return $this
     */
    public function setNode($node = null)
    {
        if ($node != null) $this->node = $node;
        return $this;
    }


    /**
     * 设置共享连接ID
     * @param $persistentID
     * @return $this
     */
    public function setPersistentID($persistentID)
    {
        $this->persistentID = $persistentID;
        return $this;
    }


    /**
     * 指定连接id删除
     * @param $persistentID
     * @return $this
     */
    public function delInstances($persistentID)
    {
        if (isset($this->instances[$persistentID])) {
            unset($this->instances[$persistentID]);
        }
        return $this;
    }


    public function init()
    {
        if (isset($this->instances[$this->persistentID])) {
            return $this->instances[$this->persistentID];
        } else {
            $server = $this->getServerHost('cache');
            $_serverHosts = $server->getServerConfig($this->section, $this->node);
            if (empty($_serverHosts)) {
                throw new DebugException('ssdb node :' . $this->node . ' is null');
            }
            if (!isset($_serverHosts[$this->childNodes]) || empty($_serverHosts[$this->childNodes])) {
                throw new DebugException('ssdb Host:' . $this->childNodes . ' is Null.');
            }

            $allServerAndPort = $this->_makeHosts($_serverHosts[$this->childNodes]);
            $serverAndPort = $allServerAndPort[rand(0, count($allServerAndPort) - 1)];
            $host = $serverAndPort[0];
            if (isset($serverAndPort[1]) && !empty($serverAndPort[1])) {
                $this->port = $serverAndPort[1];
            }
            try {
                $ssdb = new Ssdb\SimpleSSDB($host, $this->port, $this->timeout);
            } catch (SSDBException $e) {
                throw new DebugException('ssdb connetc error:' . $host . ':' . $this->port . ' ' . $e->getMessage());
            }
            $this->instances[$this->persistentID] = $ssdb;
            return $ssdb;
        }
    }

    /**
     * 组织host
     * @param array $hosts
     * @return array
     */
    private function _makeHosts($hosts)
    {
        $servers = explode(',', $hosts);
        $_server = array();
        foreach ($servers as $val) {
            $_server[] = explode(':', $val);
        }
        return $_server;
    }


    /**
     * @param $key
     * @return mixed
     */
    public function get($key)
    {
        return $this->init()->get($key);
    }


    /**
     *
     * @param $key
     * @param $value
     * @param $second
     * @return bool
     * @throws DebugException
     */
    public function add($key, $value, $second)
    {
        $result = $this->init()->setnx($key, $value);
        if ($result == 1) {
            $this->expire($key, $second);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 设置过期时间,秒
     * @param $key
     * @param $ttl
     * @throws DebugException
     */
    public function expire($key, $ttl)
    {
        return $this->init()->expire($key, $ttl);
    }

    /**
     * @param $key
     * @param $value
     * @param $minutes
     * @return mixed
     */
    public function set($key, $value, $second)
    {
        return $this->init()->setx($key, $value, $second);
    }

    /**
     * @param $key
     * @param int $value
     * @return mixed
     */
    public function increment($key, $value = 1)
    {

    }

    /**
     * @param $key
     * @param int $value
     * @return mixed
     */
    public function decrement($key, $value = 1)
    {

    }

    /**
     * @param $key
     * @return mixed
     */
    public function delete($key)
    {
        return $this->init()->del($key);
    }

    /**
     * @param $tagName
     * @return $this
     */
    public function tag($tagName)
    {

    }


    /**
     * zset类型添加
     * @param $zname
     * @param $zkey
     * @param $score
     * @return mixed
     * @throws DebugException
     */
    public function zset($zname, $zkey, $score)
    {
        return $this->init()->zset($zname, $zkey, $score);
    }


    /**
     * 将zset里的东西列表
     * @param $name_start
     * @param $name_end
     * @param $limit
     * @throws DebugException
     */
    public function zlist($name_start, $name_end, $limit)
    {
        $this->init()->zlist($name_start, $name_end, $limit);
    }


    /**
     * 返回 zset 中的元素个数.
     * @param $zname
     * @return mixed
     * @throws DebugException
     */
    public function zsize($zname)
    {
        return $this->init()->zsize($zname);
    }


    /**
     * 删除权重处于区间 [start,end] 的元素.包含边界
     * @param $zname
     * @param $score_start
     * @param $score_end
     */
    public function zremrangebyscore($zname, $score_start, $score_end)
    {
        return $this->init()->zremrangebyscore($zname, $score_start, $score_end);
    }


    /**
     * 从 zset 首部删除并返回 `limit` 个元素.
     * @param $zname
     * @param $limit
     * @return mixed
     * @throws DebugException
     */
    public function zpop_front($zname, $limit)
    {
        return $this->init()->zpop_front($zname, $limit);
    }


    /**
     * 从 zset 尾部删除并返回 `limit` 个元素.
     * @param $zname
     * @param $limit
     * @return mixed
     * @throws DebugException
     */
    public function zpop_back($zname, $limit)
    {
        return $this->init()->zpop_back($zname, $limit);
    }


    /**
     * 根据下标索引区间 [offset, offset + limit) 获取 key-score 对, 下标从 0 开始
     * @param $zname
     * @param $offset
     * @param $limist
     * @return mixed
     * @throws DebugException
     */
    public function zrange($zname, $offset, $limist)
    {
        return $this->init()->zrange($zname, $offset, $limist);
    }


    /**
     * 根据下标索引区间 [offset, offset + limit) 获取 key-score 对, 下标从 0 开始 zrrange 是反向顺序获取.
     * @param $zname
     * @param $offset
     * @param $limist
     * @return mixed
     * @throws DebugException
     */
    public function zrrange($zname, $offset, $limist)
    {
        return $this->init()->zrrange($zname, $offset, $limist);
    }


    /**
     *  删除 zset 中的指定 key.
     */
    public function zdel($zname, $key)
    {
        return $this->init()->zdel($zname, $key);
    }


    /**
     * 删除 zset 中的所有 key. 如果出错则返回 false, 否则返回删除的 key 的数量.
     */
    public function zclear($zname)
    {
        return $this->init()->zclear($zname);
    }
    
}