redis 查询命令

有缺陷的查询----keys 命令

Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。
这个指令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。

  1. 没有 offset、limit 参数,一次性吐出所有满足条件的 key,万一实例中有几百 w 个
    key 满足条件,当你看到满屏的字符串刷的没有尽头时,你就知道难受了。
  2. keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令
    就会导致 Redis 服务卡顿,所有读写 Redis 的其它的指令都会被延后甚至会超时报错,因为
    Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才
    可以继续

查询----SCAN 命令

SCAN cursor [MATCH pattern] [COUNT count]
127.0.0.1:6379> scan 0 match e*  count 100
1) "0"
2) 1) "emai"
   2) "email"

规则

Redis 为了解决这个问题,它在 2.8 版本中加入了大海捞针的指令——scan。scan 相比
keys 具备有以下特点:

  1. 复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;
  2. 提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的
    结果可多可少;
  3. 同 keys 一样,它也提供模式匹配功能;
  4. 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
  5. 返回的结果可能会有重复,需要客户端去重复,这点非常重要;
  6. 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
  7. 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零;

limit 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。

你可能感兴趣的:(redis 查询命令)