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;}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值