复述中扫描命令的基本使用教程

  

  

复述,中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的关键的信息,这里就有两种方式,
  一是钥匙命令,简单粗暴,由于复述,单线程这一特性,钥匙命令是以阻塞的方式执行的,钥匙是以遍历的方式实现的复杂度是O (n),复述,库中关键的越多,查找实现代价越大,产生的阻塞时间越长。
  

  

二是扫描命令,以非阻塞的方式实现关键值的查找,绝大多数情况下是可以替代钥匙命令的,可选性更强

  

以下写入100000条关键* * *:* * *值格式的测试数据(ps:用的油话,1 w一笔,每一笔在秒级完成)

        # - * -编码:utf - 8 - *   # !/usr/bin/env python3   进口复述,   导入系统   进口日期时间      def create_testdata ():   r=redis.StrictRedis(主机=' * * * * * * * * *。* * *”,端口=* * * *,db=0,密码='根”)   计数器=0   与r.pipeline p(事务=False):   因为我在范围(0,100000):   p。集(“关键”+ str (i),“价值”+ str (i))   counter=counter + 1   如果(counter==10000):   p.execute ()   计数器=0   打印(“时设定的循环”)      if __name__==癬_main__”:   create_testdata ()      

比如这里查询key111开头的关键有哪些?

  

若使用钥匙命令,则执行键key1111 *,一次性全部查出来。

  

复述中扫描命令的基本使用教程

  

同样,如果使用扫描命令,则用<代码>扫描0 key1111 *匹配数20

  

复述中扫描命令的基本使用教程

  

扫描的语法为:<代码>扫描光标(匹配模式)(数计数)默认的计算值是10>   

扫描命令是一个基于游标的迭代器。这意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。
  

  

这里使用<代码>扫描0 key1111 *匹配数20 命令来完成这个查询,稍显意外的是,使用一开始都没有查询到结果,这个要从扫描命令的原理来看。
  

  

扫描在遍历关键的时候,0就代表第一次,key1111 *代表按照key1111开头的模式匹配,计数20中的20并不是代表输出符合条件的关键,而是限定服务器单次遍历的字典槽位数量(约等于)。

  

那么,什么又叫做槽的数据?这个槽是不是复述,集群中的槽?答案是否定的。其实上图已经给出了答案了。
  

  

如果上面说的“字典槽”的数量是集群中的位置,又知道集群中的槽数量是16384,那么遍历16384个槽之后,必然能遍历出来所有的关键信息,上面清楚地看的到,当遍历的字典槽的数量20000的时候,游标依旧没有走完遍历结果,因此这个字典槽并不等于集群中的槽的概念。
  

  

经过测试,在扫描的时候,究竟遍历多大的计算值能完全匹配到符合条件的关键,跟具体对象的关键的个数有关,
  如果以超过关键个数的计数来扫描,必定会一次性就查找到所有符合条件的关键,比如在关键个数为10 w个的情况下,一次遍历20 w个字典槽,肯定能完全遍历出来结果。

  

复述中扫描命令的基本使用教程

  

扫描指令是一系列指令,除了可以遍历所有的关键之外,还可以对指定的容器集合进行遍历。
  

  

zscan遍历zset集合元素,
  

  

hscan遍历哈希字典的元素,
  

  

sscan遍历集合集合的元素。
  

  

SSCAN命令,HSCAN命令和ZSCAN命令的第一个参数总是一个数据库键(某个指定的关键)。

  

另外,使用<代码>复述,桌面管理器>   

复述中扫描命令的基本使用教程

  

参考:http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

复述中扫描命令的基本使用教程