Redis 迭代器SCAN、SSCAN、HSCAN、ZSCAN

>关于keys命令

Warning: consider KEYS as a command that should only be used in production environments 
with extreme care. It may ruin performance when it is executed against large databases. 
This command is intended for debugging and special operations, such as changing your 
keyspace layout. Don't use KEYS in your regular application code. If you're looking for a 
way to find keys in a subset of your keyspace, consider using sets.

官方文档声明,KEYS命令不能用在生产的环境中,这个时候如果数量过大效率是十分低的。同时也不要用KEYS正则匹配,官方建议直接用集合类型。

有人说 KEYS 相当于关系性数据的库的 select *,在生产环境几乎是要禁用的。

  • KEYS 命令的性能随着数据库数据的增多而越来越慢
  • KEYS 命令会引起阻塞,连续的 KEYS 命令足以让 Redis 阻塞

试想如果Redis阻塞超过10秒,如果有集群的场景,可能导致集群判断Redis已经故障,从而进行故障切换;

以上的情况严重会导致应用程序出现雪崩的情况。

>迭代命令

scan cursor [MATCH pattern] [COUNT count]
hscan key cursor [MATCH pattern] [COUNT count]
  • scan 命令提供三个参数,第一个是cursor,第二个是要匹配的正则,第三个是单次遍历的槽位
  • 第一个遍历是 cursor 值为0,然后将返回结果的第一个整数作为下一个遍历的游标,如果最后返回的到cursor的值为0就代表结束。
192.168.79.130:8001> scan 0 match * count 1
1) "2"
2) 1) "qyjzhash"
192.168.79.130:8001> scan 2 match * count 1
1) "0"
2) 1) "myhash"
192.168.79.130:8001> hscan myhash 0 match * count 1000
1) "0"
2) 1) "n1"
   2) "1"
   3) "n2"
   4) "2"
   5) "n3"
   6) "3"

SCAN 命令、 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都返回一个包含两个元素的 multi-bulk 回复。

回复的1)第一个元素是字符串表示的无符号 64 位整数(游标),SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。

回复的2)第二个元素是另一个 multi-bulk 回复, 这个 multi-bulk 回复包含了本次被迭代的元素。

你可能感兴趣的:(NoSql)