扣丁学堂PHP培训

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

2018-06-29  本文已影响5人  994d14631d16

本文实例讲述了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在线视频教程等你来学习观看!!

上一篇下一篇

猜你喜欢

热点阅读