|
|
<?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);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
...
|
...
|
|