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

  • 相关阅读:
    wpf中DataGrid自定义验证(包含BindingGroup)
    WPF博客地址分享
    ComboBox在WPF中的绑定示例:绑定项、集合、转换,及其源代码
    【windows phone】CollectionViewSource的妙用
    WPF之Binding深入探讨
    正确理解WPF中的TemplatedParent
    继续聊WPF——获取ComboBox中绑定的值
    WPF触发器(Trigger、DataTrigger、EventTrigger)
    jQuery和javaScript页面加载完成时触发的事件
    jQuery对象和dom对象的转换
  • 原文地址:https://www.cnblogs.com/yszr/p/12539163.html
Copyright © 2011-2022 走看看