zoukankan      html  css  js  c++  java
  • 自带单例模式的redis类

    <?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');

  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/yszr/p/12539163.html
Copyright © 2011-2022 走看看