<?php // 愿美女保佑 永无BUG // // .::::. // .::::::::. // ::::::::::: // ..:::::::::::' // '::::::::::::' // .:::::::::: // '::::::::::::::.. // ..::::::::::::. // ``:::::::::::::::: // ::::``:::::::::' .:::. // ::::' ':::::' .::::::::. // .::::' :::: .:::::::'::::. // .:::' ::::: .:::::::::' ':::::. // .::' :::::.:::::::::' ':::::. // .::' ::::::::::::::' ``::::. // ...::: ::::::::::::' ``::. // ```` ':. ':::::::::' ::::.. // '.:::::' '::'````.. defined('DYMall') or exit('Access Invalid!'); class caching{ const LOCKRSETUSR = 'lockuser'; const SETNXKEYS = 'user_nx_%s'; const NOT_FREQUENT_OPERATION = '请勿频繁操作,请等待%s s'; protected $options = [ 'host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ]; private $handler = NULL; private static $_instance = NULL; public static function getInstance() { if (NULL == self::$_instance) { self::$_instance = new self; } return self::$_instance; } public function __construct() { $redis = new Redis(); //实例化redis $redis->connect($this->options['host'], $this->options['port']); $redis->auth($this->options['password']); $this->handler = &$redis; if (0 != $this->options['select']) { $this->handler->select($this->options['select']); } } public function __destruct() { $this->handler->close(); } /** * 获取实际的缓存标识 * @access public * @param string $name 缓存名 * @return string */ public function getCacheKey($name) { return $this->options['prefix'] . $name; } /** * 读取缓存 * @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)) { 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(); } /**向key的尾部添加一个字符串元素 * @param $key * @param $value * @return int */ public function rPush($key,$value){ $result = $this->handler->rPush($key, $value); return $result; } public function rpop($key){ $result = $this->handler->rpop($key); return $result; } /** * 判断一个key值是不是存在 * @param unknown $key */ public function exists($key) { return $this->handler->exists($key); } public function ttl($key) { return $this->handler->ttl($key); } public function lockset($cachekey, $value, $expire_time=1) { return $this->handler->set($cachekey, $value, ['NX', 'EX'=>$expire_time]); } public function unlockset($cachekey,$token) { $script = 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end'; return $this->handler->eval($script, [$cachekey, $token],1); } /*****************hash表操作函数*******************/ /** * 得到hash表中一个字段的值 * @param string $key 缓存key * @param string $field 字段 * @return string|false */ public function hGet($key,$field) { return $this->handler->hGet($key,$field); } /** * 为hash表设定一个字段的值 * @param string $key 缓存key * @param string $field 字段 * @param string $value 值。 * @return bool */ public function hSet($key,$field,$value) { return $this->handler->hSet($key,$field,$value); } /** * 判断hash表中,指定field是不是存在 * @param string $key 缓存key * @param string $field 字段 * @return bool */ public function hExists($key,$field) { return $this->handler->hExists($key,$field); } /** * 删除hash表中指定字段 ,支持批量删除 * @param string $key 缓存key * @param string $field 字段 * @return int */ public function hdel($key,$field) { $fieldArr=explode(',',$field); $delNum=0; foreach($fieldArr as $row) { $row=trim($row); $delNum+=$this->handler->hDel($key,$row); } return $delNum; } /** * 返回hash表元素个数 * @param string $key 缓存key * @return int|bool */ public function hLen($key) { return $this->handler->hLen($key); } /** * 为hash表设定一个字段的值,如果字段存在,返回false * @param string $key 缓存key * @param string $field 字段 * @param string $value 值。 * @return bool */ public function hSetNx($key,$field,$value) { return $this->handler->hSetNx($key,$field,$value); } /** * 为hash表多个字段设定值。 * @param string $key * @param array $value * @return array|bool */ public function hMset($key,$value) { if(!is_array($value)) return false; return $this->handler->hMset($key,$value); } /** * 为hash表多个字段设定值。 * @param string $key * @param array|string $value string以','号分隔字段 * @return array|bool */ public function hMget($key,$field) { if(!is_array($field)) $field=explode(',', $field); return $this->handler->hMget($key,$field); } /** * 为hash表设这累加,可以负数 * @param string $key * @param int $field * @param string $value * @return bool */ public function hIncrBy($key,$field,$value) { $value=intval($value); return $this->handler->hIncrBy($key,$field,$value); } /** * 返回所有hash表的所有字段 * @param string $key * @return array|bool */ public function hKeys($key) { return $this->handler->hKeys($key); } /** * 返回所有hash表的字段值,为一个索引数组 * @param string $key * @return array|bool */ public function hVals($key) { return $this->handler->hVals($key); } /** * 返回所有hash表的字段值,为一个关联数组 * @param string $key * @return array|bool */ public function hGetAll($key) { return $this->handler->hGetAll($key); } }
调用方法:
$this->redis = caching::getInstance();
$aa = $this->redis->get('aa');