redis thinkphp5.0的集成类

// +----------------------------------------------------------------------

// | ThinkPHP [ WE CAN DO IT JUST THINK ]

// +----------------------------------------------------------------------

// | Copyright (c) 2006~2017http://thinkphp.cnAll rights reserved.

// +----------------------------------------------------------------------

// | Licensed (http://www.apache.org/licenses/LICENSE-2.0)

// +----------------------------------------------------------------------

// | Author: liu21st <liu21st@gmail.com>

// +----------------------------------------------------------------------

namespace think\cache\driver;

use think\cache\Driver;

/**

* Redis缓存驱动,适合单机部署、有前端代理实现高可用的场景,性能最好

* 有需要在业务层实现读写分离、或者使用RedisCluster的需求,请使用Redisd驱动

*

* 要求安装phpredis扩展:https://github.com/nicolasff/phpredis

* @author    robin <1257834076@qq.com>

*/

class Redis extends Driver {

protected $options = [

'host' => '127.0.0.1',

'port' => 6379,

'password' => '',

'select' => 2,

'timeout' => 0,

'expire' => 0,

'persistent' => false,

'prefix' => '',

];

/**

* 构造函数

* @param array $options 缓存参数

* @access public

*/

public function __construct($options = []) {

if (!extension_loaded('redis')) {

throw new \BadFunctionCallException('not support: redis');

}

if (!empty($options)) {

$this->options = array_merge($this->options, $options);

}

$func = $this->options['persistent'] ? 'pconnect' : 'connect';

$this->handler = new \Redis;

$this->handler->$func($this->options['host'], $this->options['port'], $this->options['timeout']);

if ('' != $this->options['password']) {

$this->handler->auth($this->options['password']);

}

if (0 != $this->options['select']) {

$this->handler->select($this->options['select']);

}

}

/**

* 判断缓存

* @access public

* @param string $name 缓存变量名

* @return bool

*/

public function has($name) {

return $this->handler->get($this->getCacheKey($name)) ? true : false;

}

/**

* 读取缓存

* @access public

* @param string $name 缓存变量名

* @param mixed  $default 默认值

* @return mixed

*/

public function get($name, $default = false) {

$value = $this->handler->get($this->getCacheKey($name));

if (is_null($value) || false === $value) {

return $default;

}

$jsonData = json_decode($value, true);

// 检测是否为JSON数据 true 返回JSON解析数组, false返回源数据 byron sampson<xiaobo.sun@qq.com>

return (null === $jsonData) ? $value : $jsonData;

}

/**

* 写入缓存

* @access public

* @param string            $name 缓存变量名

* @param mixed             $value  存储数据

* @param integer|\DateTime $expire  有效时间(秒)

* @return boolean

*/

public function set($name, $value, $expire = null) {

if (is_null($expire)) {

$expire = $this->options['expire'];

}

if ($expire instanceof \DateTime) {

$expire = $expire->getTimestamp() - time();

}

if ($this->tag && !$this->has($name)) {

$first = true;

}

$key = $this->getCacheKey($name);

//对数组/对象数据进行缓存处理,保证数据完整性  byron sampson<xiaobo.sun@qq.com>

$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);

}

isset($first) && $this->setTagItem($key);

return $result;

}

/**

* 自增缓存(针对数值缓存)

* @access public

* @param string    $name 缓存变量名

* @param int       $step 步长

* @return false|int

*/

public function inc($name, $step = 1) {

$key = $this->getCacheKey($name);

return $this->handler->incrby($key, $step);

}

/**

* 自减缓存(针对数值缓存)

* @access public

* @param string    $name 缓存变量名

* @param int       $step 步长

* @return false|int

*/

public function dec($name, $step = 1) {

$key = $this->getCacheKey($name);

return $this->handler->decrby($key, $step);

}

/**

* 删除缓存

* @access public

* @param string $name 缓存变量名

* @return boolean

*/

public function rm($name) {

return $this->handler->delete($this->getCacheKey($name));

}

/**

* 清除缓存

* @access public

* @param string $tag 标签名

* @return boolean

*/

public function clear($tag = null) {

if ($tag) {

// 指定标签清除

$keys = $this->getTagItem($tag);

foreach ($keys as $key) {

$this->handler->delete($key);

}

$this->rm('tag_' . md5($tag));

return true;

}

return $this->handler->flushDB();

}

//Redis lpush 命令用于将一个或多个值插入到列表的尾部(最右边)

public function lPush($key, $value) {

return $this->handler->lPush($key, $value);

}

//移除并获取列表的第一个元素

public function lPop($key) {

return $this->handler->lPop($key);

}

/**

* 获取值长度

* @param string $key

* @return int

*/

public function lLen($key) {

return $this->handler->lLen($key);

}

//不确定是不是方法不对有待验证

/**

* 写入有序列表

* @access public

* @param string $key 列表名

* @param double $score  成员分数

* @param string $member  成员名

* @return boolean

*/

public function Zadd($key, $score, $member) {

if (is_double($score)) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$member = (is_object($member) || is_array($member)) ? json_encode($member) : $member;

$result = $this->handler->Zadd($key, $score, $member);

return $result;

} else {

return false;

}

}

/**

* 统计有序列表成员数

* @access public

* @param string $key 列表名

* @return  int or boolean

*/

public function Zcard($key) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Zcard($key);

return $result;

}

/**

* 获得有序列表成员排名

* @access public

* @param string  $key 列表名

* @param string $member  成员名

* @return boolean

*/

public function Zrevrank($key, $member) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$member = (is_object($member) || is_array($member)) ? json_encode($member) : $member;

$result = $this->handler->Zrevrank($key, $member);

return $result;

}

/**

* 给有序列表制定成员分数增量

* @access public

* @param string  $key 列表名

* @param float or int $value 增量分数

* @param string $member  成员名

* @return boolean

*/

public function Zincrby($key, $value, $member) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$value = is_numeric($value) ? $value : doubleval($value);

$member = (is_object($member) || is_array($member)) ? json_encode($member) : $member;

$result = $this->handler->Zincrby($key, $value, $member);

return $result;

}

/**

* 获得有序列表成员分数

* @access public

* @param string  $key 列表名

* @param string $member  成员名

* @return boolean

*/

public function Zscore($key, $member) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$member = (is_object($member) || is_array($member)) ? json_encode($member) : $member;

$result = $this->handler->Zscore($key, $member);

return $result;

}

/**

* 返回有序集中指定区间内的成员,通过索引,分数从高到底

* @access public

* @param string  $key 列表名

* @param int $start

* @param int $end

* @param string $withscore

* @return boolean

*/

public function Zrevrange($key, $start, $end, $withscore = null) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$start = is_int($start) ? $start : intval($start);

$end = is_int($end) ? $end : intval($end);

$result = $this->handler->Zrevrange($key, $start, $end, $withscore);

return $result;

}

/**

* 移除

*/

public function Zremrangebyrank($key, $start, $end) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$start = is_int($start) ? $start : intval($start);

$end = is_int($end) ? $end : intval($end);

$result = $this->handler->Zremrangebyrank($key, $start, $end);

return $result;

}

/*

* 以下都是hash方法

*

* 删除一个或者多个哈希表字段

* @param   string  $key

* @param   string  $hashKey1

* @param   string  $hashKey2

* @param   string  $hashKeyN

*  @return  int     Number of deleted fields

* */

public function Hdel($key, $hashKey1) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey1 = (is_object($hashKey1) || is_array($hashKey1)) ? json_encode($hashKey1) : $hashKey1;

$result = $this->handler->Hdel($key, $hashKey1);

return $result;

}

/* +@return  bool:   If the member exists in the hash table, return TRUE, otherwise return FALSE.

查看哈希表 key 中,指定的字段是否存在。

* @param   string  $key

* @param   string  $hashKey

* */

public function Hexists($key, $hashKey) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey = (is_object($hashKey) || is_array($hashKey)) ? json_encode($hashKey) : $hashKey;

$result = $this->handler->Hexists($key, $hashKey);

return $result;

}

/* 将哈希表 key 中的字段 field 的值设为 value 。

* @param   string  $key

* @param   string  $hashKey

* @param   string  $value

*  * @return  bool    TRUE if the field was set, FALSE if it was already present.

* */

public function Hset($key, $hashKey, $value) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey = (is_object($hashKey) || is_array($hashKey)) ? json_encode($hashKey) : $hashKey;

$value = (is_object($value) || is_array($value)) ? json_encode($value) : $value;

$result = $this->handler->Hset($key, $hashKey, $value);

return $result;

}

/* 获取存储在哈希表中指定字段的值

* * @param   string  $key

*  @param   string  $hashKey

@return  string  The value, if the command executed successfully BOOL FALSE in case of failure

* */

public function Hget($key, $hashKey) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey = (is_object($hashKey) || is_array($hashKey)) ? json_encode($hashKey) : $hashKey;

$result = $this->handler->Hget($key, $hashKey);

return $result;

}

/* 获取存储在哈希表中所有字段的值

* * @param   string  $key

@return  string  The value, if the command executed successfully BOOL FALSE in case of failure

@Returns the whole hash, as an array of strings indexed by strings.

* */

public function Hgetall($key) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Hgetall($key);

return $result;

}

/* 为哈希表 key 中的指定字段的整数值加上增量 increment 。

* * @param   string  $key

* @param   string  $hashKey

* @param   int     $value (integer) value that will be added to the member's value

* @return  int     the new value

* */

public function Hincrby($key, $hashKey, $value) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey = (is_object($hashKey) || is_array($hashKey)) ? json_encode($hashKey) : $hashKey;

$value = intval($value);

$result = $this->handler->Hincrby($key, $hashKey, $value);

return $result;

}

/* 为哈希表 key 中的指定字段的浮点值加上增量 increment 。

* * @param   string  $key

* @param   string  $hashKey

* @param   float   $increment

* @return  float    the new value

* */

public function Hincrbyfloat($key, $hashKey, $value) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey = (is_object($hashKey) || is_array($hashKey)) ? json_encode($hashKey) : $hashKey;

$value = floatval($value);

$result = $this->handler->Hincrbyfloat($key, $hashKey, $value);

return $result;

}

/* 获取存储在哈希表中所有字段

* @param   string  $key

* @return  array   An array of elements, the keys of the hash. This works like PHP's array_keys().

@Returns the whole hash, as an array of strings indexed by strings.

* */

public function Hkeys($key) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Hkeys($key);

return $result;

}

/* 获取存储在哈希表中字段的数量

* @param   string  $key

* @return  int     the number of items in a hash, FALSE if the key doesn't exist or isn't a hash.

* */

public function Hlen($key) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Hlen($key);

return $result;

}

/* 获取存储在哈希表中所有指定字段的值

* * @param   string  $key

* @param   array   $hashKeys

* @return  array   Array An array of elements, the values of the specified fields in the hash,

* */

public function Hmget($key, $hashKeys) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Hmget($key, $hashKeys);

return $result;

}

/* 同时将多个 field-value (域-值)对设置到哈希表 key 中。

* ** @param   string  $key

* @param   array   $hashKeys key → value array

* @return  bool

* */

public function Hmset($key, $hashKeys) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Hmset($key, $hashKeys);

return $result;

}

/* 将哈希表 key 中的字段 field 的值设为 value 。

* @param   string  $key

* @param   string  $hashKey

* @param   string  $value

*  * @return  bool    TRUE if the field was set, FALSE if it was already present.

* */

public function Hsetnx($key, $hashKey, $value) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$hashKey = (is_object($hashKey) || is_array($hashKey)) ? json_encode($hashKey) : $hashKey;

$value = (is_object($value) || is_array($value)) ? json_encode($value) : $value;

$result = $this->handler->Hsetnx($key, $hashKey, $value);

return $result;

}

/* 获取哈希表中所有值

* @param   string  $key

* @return  array   An array of elements, the values of the hash. This works like PHP's array_values().

* */

public function Hvals($key) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$result = $this->handler->Hvals($key);

return $result;

}

/* 迭代哈希表中的键值对。

* @param   string  $key

* @param   string  $pattern

* @param   string  $value

*  * @return  bool    TRUE if the field was set, FALSE if it was already present.

* */

public function Hscan($key, $iterator, $pattern = '', $count = 0) {

$key = (is_object($key) || is_array($key)) ? json_encode($key) : $key;

$pattern = (is_object($pattern) || is_array($pattern)) ? json_encode($pattern) : $pattern;

$iterator = intval($iterator);

$count = intval($count);

$result = $this->handler->Hscan($key, $iterator, $pattern, $count);

return $result;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348