• 技术文章 >数据库 >Redis

    Redis 中如何使用 scan 替换 keys

    藏色散人藏色散人2020-01-28 14:06:32转载1996

    我们都知道查找 Redis 的键时,可以使用 keys pattern,但当 key 太多时,keys 命令的效率就很低,如果在线上直接使用,甚至可能发生生产事故,这时候,我们不妨使用 scan 命令。

    SCAN 命令是一个基于游标的迭代器(cursor based iterator):

    SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

    当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。

    生成 key

    <?php
    // 生成1000个
    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379, 10);
    $redis->select(2);
    $arr = [
        'rwer',
        '24erw',
        'rterq4',
        'sdgfd5',
        'dgsdg',
        'sfst',
    ];
    for ($i=0; $i<1000; $i++) {
        $redis->set(md5($i.$arr[$i%6]), md5($arr[$i%6].'sdfsd'));
    }
    echo "OK".PHP_EOL;

    keys 查看个数

    keys c*

    bc35f5b68e4b6b478e6069a0457a5a8.png

    Redis中使用scan替换keys

    scan 遍历

    <?php
    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379, 10);
    $redis->select(2);
    $iterator = null;
    // 遍历前缀
    $pattern = 'c*';
    $count = 100;
    // 务必设置,如果没扫描到,继续扫描,而不是返回空,否则while直接退出,遍历就会不准确
    $redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY);
    $total = [];
    $i = 0;
    // $count可以不设置,非必需参数
    while($arr = $redis->scan($iterator, $pattern, $count)) {
        $arrVal = $redis->mget($arr);
        $ret = array_combine($arr, $arrVal);
        $total = array_merge($total, $ret);
        $i++;
    }
    // var_dump($total);
    var_dump($i);
    echo count($total).PHP_EOL;

    Redis中使用scan替换keys

    c1338b868f878933e2d484199bcffd7.png

    当然你也可以不使用 \Redis::OPT_SCAN, \Redis::SCAN_RETRY 这两个参数,自行循环,判断返回值是不是 false,也能遍历成功。

    更多redis知识请关注redis数据库教程栏目。

    以上就是Redis 中如何使用 scan 替换 keys的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:Redis
    上一篇:Redis主从复制介绍及原理详解 下一篇:redis数据类型及应用场景
    大前端线上培训班

    相关文章推荐

    • PHP基于Redis实现轻量级延迟队列(多线程)• php监听redis key失效触发回调事件• PHP使用redis作为缓存(高效技术)• PHP操作Redis数据库常用方法(总结)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网