自带单例模式的redis类

Posted 御世制人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自带单例模式的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‘);

以上是关于自带单例模式的redis类的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

单例模式

设计模式之单例模式

单例模式

php设计模式——单例模式

性能比较好的单例写法