php hscan,hgetall 替代 hscan的用法详解。
眾所周知hgetall 如果遇到redis 中的bigkey會造成慢查,嚴重的甚至直接卡死redis 服務進程。redis 提供了hscan 的替代方案。本例使用yield 協程。來實現對hscan key的遍歷。
下面是錯誤的示例,原因cursor 無法進行遞進,這是個大坑。所以改造下
function?hscanKey($key,?$count?=?5,?$pattern?=?'*')
{
$cursor?=?null;
$redisInstance?=?//cache::connect('order')->getInstance();//這里實現對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 擴展封裝的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));}
//統計場次的關注人數public functionfollow($site_id,$userInfo,$action){$gs=new\Vendor\RedisCommon\GathinRedis();//實例化redis$Cache=$gs::getInstance();if($action==1) {//設置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) { //偶數為key$uid=$val;}else{//奇數為data$row= json_decode($val, true);$data['list'][] =$row;}}}}return$data;}}
總結
以上是生活随笔為你收集整理的php hscan,hgetall 替代 hscan的用法详解。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CAP
- 下一篇: 互联网晚报 | 1月23日 星期日 |