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