使用redis扩展的scan函数,发现这个函数写的很有问题,返回值并没有游标,而且游标初始值要设置为null而不是0,感觉用起来还是挺别捏的,直接放弃了,直接使用万能的rawCommand函数来执行原生的redis命令。
可参考:https://blog.csdn.net/raoxiaoya/article/details/100515541

SCAN 命令用于迭代当前数据库中的数据库
HSCAN 命令用于迭代哈希键中的键值对

1、scan 命令
比如,总共有9个key,两次调用 scan 命令返回值类似于

array:2 [0 => "33"1 => array:4 [0 => "read3:departRank:7_660_avg"1 => "read3:departRank:7_662_user"2 => "read3:departRank:7_660_sum"3 => "read3:departRank:7_0_avg"]
]
array:2 [0 => "0"1 => array:5 [0 => "read3:departRank:7_5_user"1 => "read3:departRank:7_660_user"2 => "read3:departRank:7_5_sum"3 => "read3:departRank:7_5_avg"4 => "read3:departRank:7_0_sum"]
]

封装函数,整理数据,最终返回key的数组。

public static function scanGetKeys($pattern, $count = 50){$ret = [];$iterator = 0;while (true) {$result = Redis::rawCommand("scan", $iterator, 'match', $pattern, 'count', $count);dump($result);if ($result === false) {break;}$ret = array_merge($ret, $result[1]);$iterator = $result[0];if($result[0] == 0){break;}}return $ret;
}

调用 $r1 = Read3Service::scanGetKeys('getReadtimeUserRank:*');

2、hscan 命令
如果你的hash表的key较多,那么也需要使用hscan命令,hscan 命令返回值类似于

array(2) {[0]=>string(1) "0"[1]=>array(4) {[0]=>string(1) "5"[1]=>string(1) "3"[2]=>string(1) "2"[3]=>string(1) "4"}
}

对应的是

封装函数,整理数据,最终返回 key => value 的数组。

public static function hscanGetKeyValue($key, $pattern, $count = 50)
{$ret = [];$iterator = 0;while (true) {$result = Redis::rawCommand("hscan", $key, $iterator, 'match', $pattern, 'count', $count);if ($result === false) {break;}$temp = $result[1];foreach($temp as $k => $v){if($k % 2 == 0){$ret[$v] = ''; // $k偶数为key}else{$ret[$temp[$k-1]] = $v; // $k奇数为value}}$iterator = $result[0];if($result[0] == 0){break;}}return $ret;
}

hscanGetKeyValue函数返回的是整理后的key => value 对。
调用 $list = RedisService::hscanGetKeyValue($key, '*');

array(2) {[5]=>string(1) "3"[2]=>string(1) "4"
}

3、zscan 命令

public static function zscanGetKeyValue($key, $pattern, $count = 50)
{$ret = [];$iterator = 0;while (true) {$result = Redis::rawCommand("zscan", $key, $iterator, 'match', $pattern, 'count', $count);if ($result === false) {break;}$temp = $result[1];foreach($temp as $k => $v){if($k % 2 == 0){$ret[$v] = ''; // $k偶数为key}else{$ret[$temp[$k-1]] = $v; // $k奇数为value}}$iterator = $result[0];if($result[0] == 0){break;}}return $ret;
}

php调用redis的scan,hscan,zscan 命令相关推荐

  1. redis的scan命令的源码分析,实现原理

    简言 1. 线上环境keys命令不可用,会导致redis卡死.scan命令因为可以分批遍历,比较实用 2. scan命令包括多个 遍历整个数据库的scan命令,处理函数 scanCommand(),最 ...

  2. redis keys scan筛选

    查找符合某个条件比如前缀为cart_的key,这里我预先插入了一万条数据,在正式开始之前先说一下keys 指令的匹配规则: keys pattern里面有3个通配符 分别是 *,?,[] *:通配多个 ...

  3. Redis - 使用scan代替keys与hgetall操作

    1.scan前言 当我们使用 keys * 或 hgetall 进行查询的时候会进行堵塞,导致 redis 整体不可用(因为redis是单线程的),而使用 scan 命令则不会. 从Redis v2. ...

  4. redis使用scan模糊匹配key

    在redis实际使用中,会遇到一个问题:如何从海量的key中找出满足特定前缀的key列表? 1.不要使用keys* redis提供了一个简单包里的指令keys用来列出所有满足特定正则字符串规则的key ...

  5. redis 用scan 代替keys,hgetAll

    转载自:https://blog.csdn.net/w05980598/article/details/80264568 众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会 ...

  6. Redis 常用数据结构及其控制命令整合

    Redis 键值支持5种基本结构,分别是字符串,列表,哈希,集合,有序集合.每一种数据结构都有对应的取值和设值命令,辅助命令,除此之外,还有一些全局命令,用来管理Redis存储的所有键. 全局命令 针 ...

  7. php?redis的scan用法实例分析

    更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.c ...

  8. Redis基础--Hash操作常用命令

    目录 HGET HSET HSETNX HLEN HINCRBY HINCRBYFLOAT HMGET HMSET HKEYS HVALS HGETALL HEXISTS HDEL HSCAN HGE ...

  9. Redis基础,Linux下安装Redis和hredis,C++调用Redis,Redis中字符串设计

    文章目录 一.Redis是什么 Redis架构 Redis优势 Redis应用场景 二.Linux下载安装Redis(Ubuntu系统) 了解Redis版本 在线安装Redis 启动Redis服务端 ...

  10. Redis第二集:Linux下安装Redis和测试,包含命令代码和问题处理办法,超详细版

    Redis第二集:Linux下安装Redis和测试,包含命令代码和问题处理办法,超详细版 一.资源 Linux下的Redis的下载地址 二.安装与测试 上传至自己的Linux平台 解压安装包 tar ...

最新文章

  1. 马斯克用实力赢得信任!SpaceX获NASA批准,可用“二手”火箭和飞船载人航天
  2. golang sync.Mutex 互斥锁 使用实例
  3. mysql常用语句整理
  4. 下载量过百万的吴恩达机器学习和深度学习笔记更新了!(附PDF下载)
  5. spring_IOC_自動裝配
  6. Android210更新2---支持喇叭
  7. 《中国人工智能学会通讯》——4.7 当前研究热点
  8. Maven 仓库、镜像
  9. C语言 如何判断一个主机是大端还是小端
  10. MySQL 8.0 正式版发布,比 MySQL 5.7 快 2 倍!
  11. php的布局设计,php学习之div+css布局设计排版(六)
  12. Visual Studio 2005 重置设置
  13. pickle.dump()和pickle.load()进行文件操作
  14. maxscale mysql 主从_使用Maxscale实现mysql读写分离
  15. BGI-College生信入门系列——3、数据库
  16. win10桌面图标变成白色文件
  17. 一篇文章理解JS中同步任务和异步任务以及宏任务与微任务的原理和执行机制
  18. JavaScript之读取txt文本文件内容
  19. Angular项目实战:创建项目
  20. 牛!虚拟化SIG最新技术成果受国际媒体报道!

热门文章

  1. IBM AppScan v9.0.3.12+安全规则17339下载、安装和使用
  2. mysql授权数据库(或表)给用户
  3. 三星s6android7.0资源,【更新】Galaxy S6 SM-G9200 7.0的官方固件
  4. 安装nvm下载node,npm以及配置的全过程。解析npm下载包使用 -v指令 发现下载的包不存在的原因。
  5. SpringBoot项目实现敏感词汇过滤
  6. 蓝桥杯真题 杨辉三角形 C++
  7. 蓝桥杯真题-数列求值(填空-10分)
  8. 解压.tar.bz2文件命令
  9. 操作系统高响应比优先调度算法模拟实验
  10. 操作系统中高响应比优先调度算法例子