PHP7+REDIS3.2 phpredis scan命令 游标问题

redis 中匹配某些key的方法一般有keys和scan两种方式,但是鉴于直接在线上执行keys操作可能会造成Redis卡死等问题,所以想看有哪些keys,只能使用scan来操作了。在Redis命令行下操作没啥问题:
SCAN 游标 MATCH 模式 COUNT
每次执行都会返回当前遍历到了哪个槽位和是否找到了对应的key
项目中使用了Phpredis扩展,所以想着用程序来遍历一下看看,一开始按照phpredis官网文档提供的代码示例执行
:这是官方文档,我在PHP7下执行了一下,发现并没有结果。。。。。。。
scan
Description: Scan the keyspace for keys

Parameters
LONG (reference): Iterator, initialized to NULL STRING, Optional: Pattern to match LONG, Optional: Count of keys per iteration (only a suggestion to Redis)

Return value
Array, boolean: This function will return an array of keys or FALSE if Redis returned zero keys

Example

/ Without enabling Redis::SCAN_RETRY (default condition) /
$it = NULL;
do {
// Scan for some keys
$arr_keys = $redis->scan($it);

// Redis may return empty results, so protect against that
if ($arr_keys !== FALSE) {
    foreach($arr_keys as $str_key) {
        echo "Here is a key: $str_key\n";
    }
}

} while ($it > 0);
echo "No more keys to scan!\n";

/ With Redis::SCAN_RETRY enabled /
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$it = NULL;

/ phpredis will retry the SCAN command if empty results are returned from the
server, so no empty results check is required.
/
while ($arr_keys = $redis->scan($it)) {
foreach ($arr_keys as $str_key) {
echo "Here is a key: $str_key\n";
}
}
echo "No more keys to scan!\n";

然后从网上搜了一下,发现有 $redis->scan($it,$match,$count)的,这样好像能搜到一些key,但还是不行。
我的理想情况是跟命令行一样,每次scan能够返回一个游标的位置和这次扫描出的keys。。。。。。。。。

最后是同事写了一个版本,这个版本可以

$it = null;
$match = ‘zhongce:activity_vote*‘;
$count = 10000;
$index = 0;
$redis->setOption(Redis::OPT_SCAN,Redis::SCAN_RETRY);
$iterator = null;
while ($keys = call_user_func_array(array($redis, ‘scan‘), array(&$it, $match))) {

foreach ($keys as $key) {
    echo $key . PHP_EOL;
}

}

上面是没加count的版本,会直接遍历出所有满足条件的keys,你也可以加上count限制每次遍历的数量。。。。。。。。。。

原文地址:http://blog.51cto.com/fulin0532/2336474

时间: 2024-10-10 03:16:40

PHP7+REDIS3.2 phpredis scan命令 游标问题的相关文章

Redis Scan命令

原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUNT count] SCAN 命令及其相关的 SSCAN 命令. HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements): SCAN 命令用于迭代当前数据库中的数据库键. SSCAN 命令用于迭代集

redis中关于scan命令的使用

概念 KEYS 查找所有符合给定模式pattern的key // 需很谨慎使用,耗时长影响正常业务,线上禁用KEYS命令 SCAN 用于增量地迭代获取key 语法 SCAN cursor [MATCH pattern] [COUNT count] SSCAN.HSCAN.ZSCAN命令与之类似 示例 scan 0 scan 0 match item* scan 0 match item* count 200 scan 128 match item* count 200 注意事项 scan的参数没

Mac给php7.0安装php-redis扩展

注:操作系统10.13.3 版本,其他版本的Mac系统应该也是可以的 先安装 按照顺序在命令行执行下面命令,如果当前用户权限不够的话,执行命令加上 sudo cd /usr/local/Cellar //我是安装到Cellar目录下了 git clone https://github.com/phpredis/phpredis.git cd phpredis phpize //phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块 make //编译程序 make in

php-Redis 常用命令专题

Keys del,delete - 删除键 dump - 返回存储在指定键值的序列化版本. exists - 确定键是否存在 expire,setTimeout,pexpire - 设置键的生存时间(以秒为单位) expireAt,pexpireAt - 将密钥的到期时间设置为UNIX时间戳 keys,getKeys - 查找与给定模式匹配的所有键 scan - 扫描键空间中的键(Redis> = 2.8.0) migrate - 将密钥从Redis实例原子传输到另一个实例 move - 将键移

Redis遍历所有key的两个命令 -- KEYS 和 SCAN

当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令: KEYS pattern   官网对于KEYS命令有一个提示: KEYS 的速度非常快,例如,Redis在一个有1百万个key的数据库里面执行一次查询需要的时间是40毫秒 .但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 KEYS, 你最好还是用 Redis 的集合结构 SETS 来代替. KEYS命令使用很简单. redis> MSET one 1 two 2 three

redis 迭代命令SCAN、SSCAN、HSCAN、ZSCAN

SCAN 命令用于迭代当前数据库中的数据库键.SSCAN 命令用于迭代集合键中的元素.HSCAN 命令用于迭代哈希键中的键值对.ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值). SCAN.SSCAN.HSCAN.ZSCAN每次执行都只会返回少量元素,所以这些命令可以用于生产环境,而不会出现像KEYS.SMEMBERS命令带来的问题,当KEYS命令被用于处理一个大的数据库时,又或者SMEMBERS命令被用于处理一个大的集合键时,它们可能会阻塞服务器达数秒之久. SCAN cur

phpredis命令

<?php //redis //检查一个扩展是否已经加载.大小写不敏感. if (!function_exists('redis')) { echo '不支持 redis'; return ; } redis(); function redis(){ //Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. //Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. //Redis支持数据的

centos 安装PHP7并且与其他版本共存并且为PHP7安装redis扩展

centos 安装PHP7并且与其他版本共存 wget -c -Ophp-7.1.5.tar.gz http://cn2.php.net/get/php-7.1.5.tar.gz/from/this/mirror tar -xvf php-7.1.5.tar.gz cd php-7.1.5 在安装之前首先要搞定一些依赖,不过有一些依赖我在安装PHP5.6.30的时候都安装过了,还有少数部分依赖没有安装,那么我也给出全新的依赖谁让我们是伸手党,安装过了重新安装也没啥 yum install lib

第二课补充01——redis-cli命令行详解、string类型、list类型、hash类型命令操作详解

一. redis-cli命令行参数 1.-x参数:从标准输入读取一个参数: [问题] [解决] 因为echo命令是默认带有回车\n的,不带回车需要echo –n命令: echo -n "haha"|redis-cli -x set name,从标准输入读入一个参数到redis,就不会有回车符: 2.-r参数:重复执行一个命令指定的次数: -i参数:设置命令执行的间隔: 例子:每隔1秒执行一次,一共执行3次info命令 3.-rdb文件:获取指定redis实例的rdb文件,保存到本地 可