php hscan,hgetall 替代 hscan的用法详解。

php hscan,hgetall 替代 hscan的用法详解。众所周知 hgetall 如果遇到 redis 中的 bigkey 会造成慢查 严重的甚至直接卡死 redis 服务进程 redis 提供了 hscan 的替代方案 本例使用 yield 协程 来实现对 hscankey 的遍历 下面是错误的示例 原因 cursor 无法进行递进 这是个大坑 所以改造下 functionhsca key count 5 pattern curs

众所周知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;}}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201231.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:47
下一篇 2026年3月20日 上午9:48


相关推荐

  • python列表的创建

    python列表的创建列表是任何元素的序列 而字符串只是一个字符序列 二者均为序列类型 1 基本语法 创建 创建空的列表对象 a 10 20 abc 2 list 创建 list 可将任何可迭代的数据转换为列表 list 创建空的列表对象 即 a a list abcd 输出 a a b c d a list range 10 输出 a 为 0 1 2 3 4 5 6 7 8 9 range 表示整数 0 93 range 创建整数列表 返回的是一个 range 对象

    2026年3月26日
    2
  • centos7安装kong网关

    centos7安装kong网关下载安装包:https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-1.0.2.el7.noarch.rpm运行下面的两个命令进行安装$sudoyuminstallepel-release$sudoyuminstallkong-community-edition-1.0.2.el7.noarch.rpm–nogpgche

    2025年10月18日
    8
  • 月之暗面杨植麟:Kimi K2 发布后的深度思考与未来之路

    月之暗面杨植麟:Kimi K2 发布后的深度思考与未来之路

    2026年3月12日
    2
  • 分布式Session共享解决方案「建议收藏」

    Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session共享会出现请求落到不同机器要重复登录的情况,一般来说解决Session共享有以下几种方案。1、session复制session复制是早期的企业级的使用比较多的一种服务器集群session管理机制。应用服务器开启web容器的sessi…

    2022年4月4日
    41
  • JDK下载与安装教程

    JDK下载与安装教程学习JAVA,必须得安装一下JDK(javadevelopmentkitjava开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程:1.JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html点开链接你应该看到如下图所示的界面:2.点击上图中箭头所指的地方,会出

    2022年4月26日
    33
  • Scripting.FileSystemObject 的文件复制,删除,移动操作

    Scripting.FileSystemObject 的文件复制,删除,移动操作<%’创建一个FileSystemObject的事例SetMyFileObject=Server.CreateObject(“Scripting.FileSystemObject”)’创建一个要进行操作的文件SetMyFile=MyFileObject.CreateTextFile(“c:\test.txt”)MyFile.WriteLine(“Hello”)MyFile.Close’复…

    2022年7月14日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号