php hscan,hgetall 替代 hscan的用法详解。
眾所周知hgetall 如果遇到redis 中的bigkey會(huì)造成慢查,嚴(yán)重的甚至直接卡死redis 服務(wù)進(jìn)程。redis 提供了hscan 的替代方案。本例使用yield 協(xié)程。來(lái)實(shí)現(xiàn)對(duì)hscan key的遍歷。
下面是錯(cuò)誤的示例,原因cursor 無(wú)法進(jìn)行遞進(jìn),這是個(gè)大坑。所以改造下
function?hscanKey($key,?$count?=?5,?$pattern?=?'*')
{
$cursor?=?null;
$redisInstance?=?//cache::connect('order')->getInstance();//這里實(shí)現(xiàn)對(duì)redis?的鏈接
do?{
if?($result?=?$redisInstance->hscan($key,?$cursor,?$pattern,?$count))?{
yield?$result;
}
$cursor++;
}?while?(!empty($result));
}
try?{
$nowTimeStamp?=?time();
foreach?(hscanKey('unReadOrders',?1000)?as??$allUnReadOrders)?{
foreach?($allUnReadOrders?as?$allUnReadOrderKey?=>?$allUnReadOrder)?{
}
}
echo?'done';
}catch?(Exception?$ex){
logDebug($ex->getMessage(),'unReadOrders_cron');
}
//使用原生的rawCommand 替代redis 擴(kuò)展封裝的hscan
public functionhscanKey($key,$count=5,$pattern='*'){$cursor=0;$gs=new\Vendor\RedisCommon\GathinRedis();$redisInstance=$gs::getInstance();$redisInstance->setOption(4,1);do{if($result=$redisInstance->rawCommand('hscan',$key,$cursor,'match',$pattern,'count',$count)) {if(count($result) >1) {$cursor=$result[0];yield$result[1];}else{break;}}}while(!empty($cursor));}
//統(tǒng)計(jì)場(chǎng)次的關(guān)注人數(shù)public functionfollow($site_id,$userInfo,$action){$gs=new\Vendor\RedisCommon\GathinRedis();//實(shí)例化redis$Cache=$gs::getInstance();if($action==1) {//設(shè)置if(!empty($userInfo)) {$UM=newUserModel();$msg=$UM->getNewUserMsg($userInfo['uid']);$ret=$Cache->hset($site_id,$userInfo['uid'],json_encode(['uid'=>$userInfo['uid'],'icon'=>$msg['avatar']]));}}else{//讀取$data['count'] =0;$data['list'] = [];if(!empty($site_id)) {$data['count'] =$Cache->hlen($site_id);$i=0;foreach($this->hscanKey($site_id,3)as$rows) {foreach($rowsas$key=>$val) {if($key%2==0) { //偶數(shù)為key$uid=$val;}else{//奇數(shù)為data$row= json_decode($val, true);$data['list'][] =$row;}}}}return$data;}}
總結(jié)
以上是生活随笔為你收集整理的php hscan,hgetall 替代 hscan的用法详解。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CAP
- 下一篇: 腾讯地图api php经纬度转换地址,腾