美文网首页扣丁学堂PHP培训
扣丁学堂PHP实现的Redis操作通用类示例

扣丁学堂PHP实现的Redis操作通用类示例

作者: 994d14631d16 | 来源:发表于2018-06-29 11:35 被阅读5次

    本文实例讲述了PHP实现的Redis操作通用类。分享给大家供大家参考,可以更多的去了解Redis通用类的大概类型,方便之后去接触和深入的了解,更方便以后的去了解PHP的一些其他的东西,好让自己以后学习PHP更加迅速。望大家有好的建议。

    找到一个比较全的RedisPHP操作类库,分享给大家

    /**

    *redis操作类

    *说明,任何为false的串,存在redis中都是空串。

    *只有在key不存在时,才会返回false。

    *这点可用于防止缓存穿透

    *

    */

    classRedis

    {

    private$redis;

    //当前数据库ID号

    protected$dbId=0;

    //当前权限认证码

    protected$auth;

    /**

    *实例化的对象,单例模式.

    *@var\iphp\db\Redis

    */

    staticprivate$_instance=array();

    private$k;

    //连接属性数组

    protected$attr=array(

    //连接超时时间,redis配置文件中默认为300秒

    'timeout'=>30,

    //选择的数据库。

    'db_id'=>0,

    );

    //什么时候重新建立连接

    protected$expireTime;

    protected$host;

    protected$port;

    privatefunction__construct($config,$attr=array())

    {

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

    $this->redis=newRedis();

    $this->port=$config['port']?$config['port']:6379;

    $this->host=$config['host'];

    $this->redis->connect($this->host,$this->port,$this->attr['timeout']);

    if($config['auth'])

    {

    $this->auth($config['auth']);

    $this->auth=$config['auth'];

    }

    $this->expireTime=time()+$this->attr['timeout'];

    }

    /**

    *得到实例化的对象.

    *为每个数据库建立一个连接

    *如果连接超时,将会重新建立一个连接

    *@paramarray$config

    *@paramint$dbId

    *@return\iphp\db\Redis

    */

    publicstaticfunctiongetInstance($config,$attr=array())

    {

    //如果是一个字符串,将其认为是数据库的ID号。以简化写法。

    if(!is_array($attr))

    {

    $dbId=$attr;

    $attr=array();

    $attr['db_id']=$dbId;

    }

    $attr['db_id']=$attr['db_id']?$attr['db_id']:0;

    $k=md5(implode('',$config).$attr['db_id']);

    if(!(static::$_instance[$k]instanceofself))

    {

    static::$_instance[$k]=newself($config,$attr);

    static::$_instance[$k]->k=$k;

    static::$_instance[$k]->dbId=$attr['db_id'];

    //如果不是0号库,选择一下数据库。

    if($attr['db_id']!=0){

    static::$_instance[$k]->select($attr['db_id']);

    }

    }

    elseif(time()>static::$_instance[$k]->expireTime)

    {

    static::$_instance[$k]->close();

    static::$_instance[$k]=newself($config,$attr);

    static::$_instance[$k]->k=$k;

    static::$_instance[$k]->dbId=$attr['db_id'];

    //如果不是0号库,选择一下数据库。

    if($attr['db_id']!=0){

    static::$_instance[$k]->select($attr['db_id']);

    }

    }

    returnstatic::$_instance[$k];

    }

    privatefunction__clone(){}

    /**

    *执行原生的redis操作

    *@return\Redis

    */

    publicfunctiongetRedis()

    {

    return$this->redis;

    }

    /*****************hash表操作函数*******************/

    /**

    *得到hash表中一个字段的值

    *@paramstring$key缓存key

    *@paramstring$field字段

    *@returnstring|false

    */

    publicfunctionhGet($key,$field)

    {

    return$this->redis->hGet($key,$field);

    }

    /**

    *为hash表设定一个字段的值

    *@paramstring$key缓存key

    *@paramstring$field字段

    *@paramstring$value值。

    *@returnbool

    */

    publicfunctionhSet($key,$field,$value)

    {

    return$this->redis->hSet($key,$field,$value);

    }

    /**

    *判断hash表中,指定field是不是存在

    *@paramstring$key缓存key

    *@paramstring$field字段

    *@returnbool

    */

    publicfunctionhExists($key,$field)

    {

    return$this->redis->hExists($key,$field);

    }

    /**

    *删除hash表中指定字段,支持批量删除

    *@paramstring$key缓存key

    *@paramstring$field字段

    *@returnint

    */

    publicfunctionhdel($key,$field)

    {

    $fieldArr=explode(',',$field);

    $delNum=0;

    foreach($fieldArras$row)

    {

    $row=trim($row);

    $delNum+=$this->redis->hDel($key,$row);

    }

    return$delNum;

    }

    /**

    *返回hash表元素个数

    *@paramstring$key缓存key

    *@returnint|bool

    */

    publicfunctionhLen($key)

    {

    return$this->redis->hLen($key);

    }

    /**

    *为hash表设定一个字段的值,如果字段存在,返回false

    *@paramstring$key缓存key

    *@paramstring$field字段

    *@paramstring$value值。

    *@returnbool

    */

    publicfunctionhSetNx($key,$field,$value)

    {

    return$this->redis->hSetNx($key,$field,$value);

    }

    /**

    *为hash表多个字段设定值。

    *@paramstring$key

    *@paramarray$value

    *@returnarray|bool

    */

    publicfunctionhMset($key,$value)

    {

    if(!is_array($value))

    returnfalse;

    return$this->redis->hMset($key,$value);

    }

    /**

    *为hash表多个字段设定值。

    *@paramstring$key

    *@paramarray|string$valuestring以','号分隔字段

    *@returnarray|bool

    */

    publicfunctionhMget($key,$field)

    {

    if(!is_array($field))

    $field=explode(',',$field);

    return$this->redis->hMget($key,$field);

    }

    /**

    *为hash表设这累加,可以负数

    *@paramstring$key

    *@paramint$field

    *@paramstring$value

    *@returnbool

    */

    publicfunctionhIncrBy($key,$field,$value)

    {

    $value=intval($value);

    return$this->redis->hIncrBy($key,$field,$value);

    }

    /**

    *返回所有hash表的所有字段

    *@paramstring$key

    *@returnarray|bool

    */

    publicfunctionhKeys($key)

    {

    return$this->redis->hKeys($key);

    }

    /**

    *返回所有hash表的字段值,为一个索引数组

    *@paramstring$key

    *@returnarray|bool

    */

    publicfunctionhVals($key)

    {

    return$this->redis->hVals($key);

    }

    /**

    *返回所有hash表的字段值,为一个关联数组

    *@paramstring$key

    *@returnarray|bool

    */

    publicfunctionhGetAll($key)

    {

    return$this->redis->hGetAll($key);

    }

    /*********************有序集合操作*********************/

    /**

    *给当前集合添加一个元素

    *如果value已经存在,会更新order的值。

    *@paramstring$key

    *@paramstring$order序号

    *@paramstring$value值

    *@returnbool

    */

    publicfunctionzAdd($key,$order,$value)

    {

    return$this->redis->zAdd($key,$order,$value);

    }

    /**

    *给$value成员的order值,增加$num,可以为负数

    *@paramstring$key

    *@paramstring$num序号

    *@paramstring$value值

    *@return返回新的order

    */

    publicfunctionzinCry($key,$num,$value)

    {

    return$this->redis->zinCry($key,$num,$value);

    }

    /**

    *删除值为value的元素

    *@paramstring$key

    *@paramstirng$value

    *@returnbool

    */

    publicfunctionzRem($key,$value)

    {

    return$this->redis->zRem($key,$value);

    }

    /**

    *集合以order递增排列后,0表示第一个元素,-1表示最后一个元素

    *@paramstring$key

    *@paramint$start

    *@paramint$end

    *@returnarray|bool

    */

    publicfunctionzRange($key,$start,$end)

    {

    return$this->redis->zRange($key,$start,$end);

    }

    /**

    *集合以order递减排列后,0表示第一个元素,-1表示最后一个元素

    *@paramstring$key

    *@paramint$start

    *@paramint$end

    *@returnarray|bool

    */

    publicfunctionzRevRange($key,$start,$end)

    {

    return$this->redis->zRevRange($key,$start,$end);

    }

    /**

    *集合以order递增排列后,返回指定order之间的元素。

    *min和max可以是-inf和+inf表示最大值,最小值

    *@paramstring$key

    *@paramint$start

    *@paramint$end

    *@packagearray$option参数

    *withscores=>true,表示数组下标为Order值,默认返回索引数组

    *limit=>array(0,1)表示从0开始,取一条记录。

    *@returnarray|bool

    */

    publicfunctionzRangeByScore($key,$start='-inf',$end="+inf",$option=array())

    {

    return$this->redis->zRangeByScore($key,$start,$end,$option);

    }

    /**

    *集合以order递减排列后,返回指定order之间的元素。

    *min和max可以是-inf和+inf表示最大值,最小值

    *@paramstring$key

    *@paramint$start

    *@paramint$end

    *@packagearray$option参数

    *withscores=>true,表示数组下标为Order值,默认返回索引数组

    *limit=>array(0,1)表示从0开始,取一条记录。

    *@returnarray|bool

    */

    publicfunctionzRevRangeByScore($key,$start='-inf',$end="+inf",$option=array())

    {

    return$this->redis->zRevRangeByScore($key,$start,$end,$option);

    }

    /**

    *返回order值在startend之间的数量

    *@paramunknown$key

    *@paramunknown$start

    *@paramunknown$end

    */

    publicfunctionzCount($key,$start,$end)

    {

    return$this->redis->zCount($key,$start,$end);

    }

    /**

    *返回值为value的order值

    *@paramunknown$key

    *@paramunknown$value

    */

    publicfunctionzScore($key,$value)

    {

    return$this->redis->zScore($key,$value);

    }

    /**

    *返回集合以score递增加排序后,指定成员的排序号,从0开始。

    *@paramunknown$key

    *@paramunknown$value

    */

    publicfunctionzRank($key,$value)

    {

    return$this->redis->zRank($key,$value);

    }

    /**

    *返回集合以score递增加排序后,指定成员的排序号,从0开始。

    *@paramunknown$key

    *@paramunknown$value

    */

    publicfunctionzRevRank($key,$value)

    {

    return$this->redis->zRevRank($key,$value);

    }

    /**

    *删除集合中,score值在startend之间的元素包括startend

    *min和max可以是-inf和+inf表示最大值,最小值

    *@paramunknown$key

    *@paramunknown$start

    *@paramunknown$end

    *@return删除成员的数量。

    */

    publicfunctionzRemRangeByScore($key,$start,$end)

    {

    return$this->redis->zRemRangeByScore($key,$start,$end);

    }

    /**

    *返回集合元素个数。

    *@paramunknown$key

    */

    publicfunctionzCard($key)

    {

    return$this->redis->zCard($key);

    }

    /*********************队列操作命令************************/

    /**

    *在队列尾部插入一个元素

    *@paramunknown$key

    *@paramunknown$value

    *返回队列长度

    */

    publicfunctionrPush($key,$value)

    {

    return$this->redis->rPush($key,$value);

    }

    /**

    *在队列尾部插入一个元素如果key不存在,什么也不做

    *@paramunknown$key

    *@paramunknown$value

    *返回队列长度

    */

    publicfunctionrPushx($key,$value)

    {

    return$this->redis->rPushx($key,$value);

    }

    /**

    *在队列头部插入一个元素

    *@paramunknown$key

    *@paramunknown$value

    *返回队列长度

    */

    publicfunctionlPush($key,$value)

    {

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

    }

    /**

    *在队列头插入一个元素如果key不存在,什么也不做

    *@paramunknown$key

    *@paramunknown$value

    *返回队列长度

    */

    publicfunctionlPushx($key,$value)

    {

    return$this->redis->lPushx($key,$value);

    }

    /**

    *返回队列长度

    *@paramunknown$key

    */

    publicfunctionlLen($key)

    {

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

    }

    /**

    *返回队列指定区间的元素

    *@paramunknown$key

    *@paramunknown$start

    *@paramunknown$end

    */

    publicfunctionlRange($key,$start,$end)

    {

    return$this->redis->lrange($key,$start,$end);

    }

    /**

    *返回队列中指定索引的元素

    *@paramunknown$key

    *@paramunknown$index

    */

    publicfunctionlIndex($key,$index)

    {

    return$this->redis->lIndex($key,$index);

    }

    /**

    *设定队列中指定index的值。

    *@paramunknown$key

    *@paramunknown$index

    *@paramunknown$value

    */

    publicfunctionlSet($key,$index,$value)

    {

    return$this->redis->lSet($key,$index,$value);

    }

    /**

    *删除值为vaule的count个元素

    *PHP-REDIS扩展的数据顺序与命令的顺序不太一样,不知道是不是bug

    *count>0从尾部开始

    *>0从头部开始

    *=0删除全部

    *@paramunknown$key

    *@paramunknown$count

    *@paramunknown$value

    */

    publicfunctionlRem($key,$count,$value)

    {

    return$this->redis->lRem($key,$value,$count);

    }

    /**

    *删除并返回队列中的头元素。

    *@paramunknown$key

    */

    publicfunctionlPop($key)

    {

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

    }

    /**

    *删除并返回队列中的尾元素

    *@paramunknown$key

    */

    publicfunctionrPop($key)

    {

    return$this->redis->rPop($key);

    }

    /*************redis字符串操作命令*****************/

    /**

    *设置一个key

    *@paramunknown$key

    *@paramunknown$value

    */

    publicfunctionset($key,$value)

    {

    return$this->redis->set($key,$value);

    }

    /**

    *得到一个key

    *@paramunknown$key

    */

    publicfunctionget($key)

    {

    return$this->redis->get($key);

    }

    /**

    *设置一个有过期时间的key

    *@paramunknown$key

    *@paramunknown$expire

    *@paramunknown$value

    */

    publicfunctionsetex($key,$expire,$value)

    {

    return$this->redis->setex($key,$expire,$value);

    }

    /**

    *设置一个key,如果key存在,不做任何操作.

    *@paramunknown$key

    *@paramunknown$value

    */

    publicfunctionsetnx($key,$value)

    {

    return$this->redis->setnx($key,$value);

    }

    /**

    *批量设置key

    *@paramunknown$arr

    */

    publicfunctionmset($arr)

    {

    return$this->redis->mset($arr);

    }

    /*************redis无序集合操作命令*****************/

    /**

    *返回集合中所有元素

    *@paramunknown$key

    */

    publicfunctionsMembers($key)

    {

    return$this->redis->sMembers($key);

    }

    /**

    *求2个集合的差集

    *@paramunknown$key1

    *@paramunknown$key2

    */

    publicfunctionsDiff($key1,$key2)

    {

    return$this->redis->sDiff($key1,$key2);

    }

    /**

    *添加集合。由于版本问题,扩展不支持批量添加。这里做了封装

    *@paramunknown$key

    *@paramstring|array$value

    */

    publicfunctionsAdd($key,$value)

    {

    if(!is_array($value))

    $arr=array($value);

    else

    $arr=$value;

    foreach($arras$row)

    $this->redis->sAdd($key,$row);

    }

    /**

    *返回无序集合的元素个数

    *@paramunknown$key

    */

    publicfunctionscard($key)

    {

    return$this->redis->scard($key);

    }

    /**

    *从集合中删除一个元素

    *@paramunknown$key

    *@paramunknown$value

    */

    publicfunctionsrem($key,$value)

    {

    return$this->redis->srem($key,$value);

    }

    /*************redis管理操作命令*****************/

    /**

    *选择数据库

    *@paramint$dbId数据库ID号

    *@returnbool

    */

    publicfunctionselect($dbId)

    {

    $this->dbId=$dbId;

    return$this->redis->select($dbId);

    }

    /**

    *清空当前数据库

    *@returnbool

    */

    publicfunctionflushDB()

    {

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

    }

    /**

    *返回当前库状态

    *@returnarray

    */

    publicfunctioninfo()

    {

    return$this->redis->info();

    }

    /**

    *同步保存数据到磁盘

    */

    publicfunctionsave()

    {

    return$this->redis->save();

    }

    /**

    *异步保存数据到磁盘

    */

    publicfunctionbgSave()

    {

    return$this->redis->bgSave();

    }

    /**

    *返回最后保存到磁盘的时间

    */

    publicfunctionlastSave()

    {

    return$this->redis->lastSave();

    }

    /**

    *返回key,支持*多个字符,?一个字符

    *只有*表示全部

    *@paramstring$key

    *@returnarray

    */

    publicfunctionkeys($key)

    {

    return$this->redis->keys($key);

    }

    /**

    *删除指定key

    *@paramunknown$key

    */

    publicfunctiondel($key)

    {

    return$this->redis->del($key);

    }

    /**

    *判断一个key值是不是存在

    *@paramunknown$key

    */

    publicfunctionexists($key)

    {

    return$this->redis->exists($key);

    }

    /**

    *为一个key设定过期时间单位为秒

    *@paramunknown$key

    *@paramunknown$expire

    */

    publicfunctionexpire($key,$expire)

    {

    return$this->redis->expire($key,$expire);

    }

    /**

    *返回一个key还有多久过期,单位秒

    *@paramunknown$key

    */

    publicfunctionttl($key)

    {

    return$this->redis->ttl($key);

    }

    /**

    *设定一个key什么时候过期,time为一个时间戳

    *@paramunknown$key

    *@paramunknown$time

    */

    publicfunctionexprieAt($key,$time)

    {

    return$this->redis->expireAt($key,$time);

    }

    /**

    *关闭服务器链接

    */

    publicfunctionclose()

    {

    return$this->redis->close();

    }

    /**

    *关闭所有连接

    */

    publicstaticfunctioncloseAll()

    {

    foreach(static::$_instanceas$o)

    {

    if($oinstanceofself)

    $o->close();

    }

    }

    /**这里不关闭连接,因为session写入会在所有对象销毁之后。

    publicfunction__destruct()

    {

    return$this->redis->close();

    }

    **/

    /**

    *返回当前数据库key数量

    */

    publicfunctiondbSize()

    {

    return$this->redis->dbSize();

    }

    /**

    *返回一个随机key

    */

    publicfunctionrandomKey()

    {

    return$this->redis->randomKey();

    }

    /**

    *得到当前数据库ID

    *@returnint

    */

    publicfunctiongetDbId()

    {

    return$this->dbId;

    }

    /**

    *返回当前密码

    */

    publicfunctiongetAuth()

    {

    return$this->auth;

    }

    publicfunctiongetHost()

    {

    return$this->host;

    }

    publicfunctiongetPort()

    {

    return$this->port;

    }

    publicfunctiongetConnInfo()

    {

    returnarray(

    'host'=>$this->host,

    'port'=>$this->port,

    'auth'=>$this->auth

    );

    }

    /*********************事务的相关方法************************/

    /**

    *监控key,就是一个或多个key添加一个乐观锁

    *在此期间如果key的值如果发生的改变,刚不能为key设定值

    *可以重新取得Key的值。

    *@paramunknown$key

    */

    publicfunctionwatch($key)

    {

    return$this->redis->watch($key);

    }

    /**

    *取消当前链接对所有key的watch

    *EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了

    */

    publicfunctionunwatch()

    {

    return$this->redis->unwatch();

    }

    /**

    *开启一个事务

    *事务的调用有两种模式Redis::MULTI和Redis::PIPELINE,

    *默认是Redis::MULTI模式,

    *Redis::PIPELINE管道模式速度更快,但没有任何保证原子性有可能造成数据的丢失

    */

    publicfunctionmulti($type=\Redis::MULTI)

    {

    return$this->redis->multi($type);

    }

    /**

    *执行一个事务

    *收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行

    */

    publicfunctionexec()

    {

    return$this->redis->exec();

    }

    /**

    *回滚一个事务

    */

    publicfunctiondiscard()

    {

    return$this->redis->discard();

    }

    /**

    *测试当前链接是不是已经失效

    *没有失效返回+PONG

    *失效返回false

    */

    publicfunctionping()

    {

    return$this->redis->ping();

    }

    publicfunctionauth($auth)

    {

    return$this->redis->auth($auth);

    }

    /*********************自定义的方法,用于简化操作************************/

    /**

    *得到一组的ID号

    *@paramunknown$prefix

    *@paramunknown$ids

    */

    publicfunctionhashAll($prefix,$ids)

    {

    if($ids==false)

    returnfalse;

    if(is_string($ids))

    $ids=explode(',',$ids);

    $arr=array();

    foreach($idsas$id)

    {

    $key=$prefix.'.'.$id;

    $res=$this->hGetAll($key);

    if($res!=false)

    $arr[]=$res;

    }

    return$arr;

    }

    /**

    *生成一条消息,放在redis数据库中。使用0号库。

    *@paramstring|array$msg

    */

    publicfunctionpushMessage($lkey,$msg)

    {

    if(is_array($msg)){

    $msg=json_encode($msg);

    }

    $key=md5($msg);

    //如果消息已经存在,删除旧消息,已当前消息为准

    //echo$n=$this->lRem($lkey,0,$key)."\n";

    //重新设置新消息

    $this->lPush($lkey,$key);

    $this->setex($key,3600,$msg);

    return$key;

    }

    /**

    *得到条批量删除key的命令

    *@paramunknown$keys

    *@paramunknown$dbId

    */

    publicfunctiondelKeys($keys,$dbId)

    {

    $redisInfo=$this->getConnInfo();

    $cmdArr=array(

    'redis-cli',

    '-a',

    $redisInfo['auth'],

    '-h',

    $redisInfo['host'],

    '-p',

    $redisInfo['port'],

    '-n',

    $dbId,

    );

    $redisStr=implode('',$cmdArr);

    $cmd="{$redisStr}KEYS\"{$keys}\"|xargs{$redisStr}del";

    return$cmd;

    }

    }

    以上就时扣丁学堂对PHP实现的Redis操作通用类示例的简述,希望大家多加浏览,方便大家查阅,更多的让大家去了解PHP,如果有对PHP感兴趣的朋友,想要了解更多,请登录扣丁学堂官网,或关注微信公众号,了解更多知识,更有大量PHP在线视频教程等你来学习观看!!

    相关文章

      网友评论

        本文标题:扣丁学堂PHP实现的Redis操作通用类示例

        本文链接:https://www.haomeiwen.com/subject/jdtayftx.html