`
m635674608
  • 浏览: 4966622 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Redis Scan命令

 
阅读更多

Redis Scan命令

SCAN cursor [MATCH pattern] [COUNT count]

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 (offer limited guarantees about the returned elements)。

因为 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四个命令的工作方式都非常相似, 所以这个文档会一并介绍这四个命令, 但是要记住:

  • SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。
  • 而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。

SCAN命令的基本用法】  

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

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

以下是一个 SCAN 命令的迭代过程示例:

SCAN的命令保证

  SCAN 命令, 以及其他增量式迭代命令, 在进行完整遍历的情况下可以为用户带来以下保证: 从完整遍历开始直到完整遍历结束期间, 一直存在于数据集内的所有元素都会被完整遍历返回; 这意味着, 如果有一个元素, 它从遍历开始直到遍历结束期间都存在于被遍历的数据集当中, 那么 SCAN 命令总会在某次迭代中将这个元素返回给用户。

然而因为增量式命令仅仅使用游标来记录迭代状态, 所以这些命令带有以下缺点:

  • 同一个元素可能会被返回多次。 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上。
  • 如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会, 这是未定义的(undefined)。

SCAN 命令每次执行返回的元素数量

  增量式迭代命令并不保证每次执行都返回某个给定数量的元素。

  增量式命令甚至可能会返回零个元素, 但只要命令返回的游标不是 0 , 应用程序就不应该将迭代视作结束。

  用户可以通过增量式迭代命令提供的 COUNT 选项来指定每次迭代返回元素的最大值。

  虽然增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。

基本上, COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。

虽然 COUNT 选项只是对增量式迭代命令的一种提示(hint), 但是在大多数情况下, 这种提示都是有效的。

MATCH选项

  和 KEYS 命令一样, 增量式迭代命令也可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH <pattern> 参数来实现。

  以下是一个使用 MATCH 选项进行迭代的示例:

  

参考:http://redisdoc.com/key/scan.html

 

 

http://www.cnblogs.com/tekkaman/p/4887293.html

分享到:
评论

相关推荐

    Redis Scan命令的基本使用方法

    SCAN 命令以及比较相近的 SSCAN、HSCAN 和 ZSCAN 命令都用于增量迭代数据集元素: SCAN 命令用于迭代当前数据库中的数据库键。 SSCAN 命令用于迭代集合(Set)中的元素。 HSCAN 命令用于迭代哈希(Hash)中的字段以及...

    Redis中Scan命令的踩坑实录

    但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限。所以记录下这个踩坑的过程,背景如下: 公司因为redis服务器内存吃紧,需要删除一些无用的没有设置过期时间的key。...

    详解Redis SCAN命令实现有限保证的原理

    Redis中的`SCAN`命令是一个用于迭代数据库中键的命令,提供了有限保证的遍历机制,这意味着它能够确保在完整遍历期间存在的所有元素至少被返回一次,但可能会返回多次。这是因为`SCAN`命令的设计考虑到了在遍历过程...

    Redis中scan命令的深入讲解

    Redis的`scan`命令是为了解决在大量键值对中查找特定键时避免阻塞服务器的问题,特别是在处理`keys`命令可能导致的性能问题时。`keys`命令虽然能快速找到所有匹配模式的键,但它的时间复杂度是O(N),在键库庞大的...

    redis 用scan指令 代替keys指令(详解)

    众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会阻塞服务器,对单线程的redis来说,简直是灾难,终于找到了替代命令scan。  SCAN cursor [MATCH pattern] [COUNT count] SCAN 命令及其相关的 ...

    Redis中Scan命令的基本使用教程

    二是scan命令,以非阻塞的方式实现key值的查找,绝大多数情况下是可以替代keys命令的,可选性更强 以下写入100000条key***:value***格式的测试数据(ps:用pipline的话,1w一笔,每一笔在秒级完成) # -*- coding: ...

    php redis扩展支持scan命令实现方法

    当我们谈论“php redis扩展支持scan命令实现方法”时,实际上是指如何在PHP中利用Redis的`SCAN`命令来迭代并查找键空间中的键。`SCAN`命令是Redis提供的一种非阻塞的遍历方式,相比`KEYS`命令,它不会锁定服务器,...

    redis中scan命令的基本实现方法

    redis的键在键值对大小大于hash-max-ziplist-value且个数小于hash-max-ziplist-entries的时候,是存放在散列表数据结构中的,在运行keys命令的时候,需要遍历数据库键空间,把所有键都取出来后与keys后面的pattern...

    C#操作Redis服务器Demo

    你可以通过NuGet包管理器安装StackExchange.Redis库,命令为:`Install-Package StackExchange.Redis`。 接下来,我们需要创建连接到Redis服务器的配置。在C#代码中,这通常涉及到创建`ConnectionMultiplexer`对象...

    redis-scanstreams:Redis *SCAN 命令的流接口,用于 node_redis

    为 Redis *SCAN 命令提供流接口。 使用流版本客户端上的 SCAN、SSCAN、HSCAN 和 ZSCAN 方法。 您可以阅读有关 SCAN 的更多信息。 示例:与使用 var redis = require ( "redis" ) // replace the methods for any...

    REDIS命令文档网页离线版

    此外,`KEYS`和`SCAN`命令用于查找匹配模式的键,`FLUSHALL`和`FLUSHDB`则清除所有数据库或当前数据库的数据。 集群方面,Redis支持主从复制和自动故障转移,通过`SLAVEOF`命令设置节点为其他节点的副本。最新版本...

    redis-desktop-manager-0.8.8.384

    `SCAN`命令是Redis中的一个迭代命令,用于无阻塞地遍历数据库中的键,它在较新的Redis版本中广泛使用。在腾讯云的环境中,可能出于安全或服务特性的考虑,未实现对`SCAN`命令的支持。 Redis Desktop Manager 0.8.8....

    Redis中统计各种数据大小的方法

    接着,使用 Redis 的 `SCAN` 命令迭代所有的键,`SCAN` 是一个非阻塞的迭代器,可以避免遍历整个数据库时阻塞其他操作。`SCAN` 的 `$match` 参数允许我们指定匹配模式,这里使用通配符 `*` 来匹配所有键。每次迭代,...

Global site tag (gtag.js) - Google Analytics