V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daoqiongsi1101
V2EX  ›  Redis

redis keys 有性能问题,用 scan 代替吗

  •  
  •   daoqiongsi1101 · 2021-11-29 13:43:33 +08:00 · 3323 次点击
    这是一个创建于 1074 天前的主题,其中的信息可能已经有所发展或是发生改变。

    redis keys 有性能问题,用 scan 代替吗,但是用了 scan ,cpu 飙升

    7 条回复    2022-01-18 12:36:07 +08:00
    leeyuzhe
        1
    leeyuzhe  
       2021-11-29 13:46:28 +08:00
    keys 是阻塞,肯定不能用的。scan 你具体怎么用的?
    luin
        2
    luin  
       2021-11-29 13:47:06 +08:00
    不一定,如果是 GUI 管理工具的话用 scan 代替。正常使用要看具体需求,一般会避免用 KEYS 或 SCAN 遍历整个数据库,比如有的场景可以用一个 Set 键来代替
    lshero
        3
    lshero  
       2021-11-29 13:52:24 +08:00
    如果不要求在线处理的话
    导出 rdb 慢慢分析不好么?
    daoqiongsi1101
        4
    daoqiongsi1101  
    OP
       2021-11-29 14:16:45 +08:00
    从官网文档:

    > scan 相比 keys 具备有以下特点:

    复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;

    提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是对增量式迭代命令的一种提示(hint),返回的结果可多可少;

    同 keys 一样,它也提供模式匹配功能;

    服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;

    返回的结果可能会有重复,需要客户端去重复,这点非常重要;

    遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;

    单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零
    awanganddong
        5
    awanganddong  
       2021-11-29 14:23:40 +08:00   ❤️ 1
    scan 也是全表扫描。只不过是分段查询了。

    下边是关于 scan 滥用引发的事故。

    https://developer.51cto.com/art/202103/648155.htm
    daoqiongsi1101
        6
    daoqiongsi1101  
    OP
       2021-12-01 16:40:49 +08:00
    @awanganddong 这个例子很好
    2TsukasA
        7
    2TsukasA  
       2022-01-18 12:36:07 +08:00
    虽然 scan 带来的影响小于 keys ,但是理论上来说任何全量的检索应该避免在生产环境做,无论是 keys 还是 scan

    之前做过一个工具,删除实例内某一类 key ,是用的 scan 做的,是在确认这个工具不会用于生产环境的前提下做的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1434 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:51 · PVG 07:51 · LAX 15:51 · JFK 18:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.