Authored by 沈海生

ssdb方法

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