略微加速

略速 - 互联网笔记

redis 中 scan 命令 查找key

2021-03-01 leiting (2741阅读)

标签 Redis

平时使用redis时候我们要从redis数据中查找key或者查找带特定前缀后缀的key列表手动处理数据。


如果有成千上万个key呢。


输入keys * 然后 cmd窗口一直在刷数据,一直刷…


keys

redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。



假设这是几百万个数据


现在我们使用keys * 可想而知会一直刷数据,占用资源,严重造成服务器崩溃。


keys 正则


可以使用keys 正则 来查询数据


但无法返回指定数据数量,海量数据中运气好会查到你想要的数据,运气不好还是会一直刷数据。


明显有两个缺点


1 没有 offset、limit 参数,一次性吐出所有满足条件的 key。

2 keys 算法是遍历算法,复杂度是 O(n) 数据量大时可能会造成服务器卡顿等。


Redis 为了解决这个问题,在2.8版本后为我们提供了一个带返回结果的最大条数和正则的查看命令 scan


scan

scan 参数提供了三个参数

第一个是 cursor 整数值

第二个是 key 的正则模式

第三个是遍历的 limit hint。


第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。


可以如下图所示


数据库里有8条数据,我们来使用scan查出k开头的key,如下所有k开头的数据。


现在查看k开头的数据 每次返回1(大概)条 。( limit 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于) )



可以看到刚开始 查询时 cursor 是 0 表示第一次查询 , 要求返回1条数据,返回2条(这个结果是大概返回近似于要求返回的结果条数)


返回的游标值不为零 ,图中的绿色线标注的返回的第一行的数值结果 是4, 然后接着下一次查询 按照这次返回的游标继续查询,直到游标是0 表示返回结果完毕。


大白话就是返回的游标不是0就表示遍历没结束,只是拿到了返回的一定数量值(这里可以理解为分页,多少页的数据),然后下次遍历查询,根据上次返回的游标值作为开始查询的游标值再进行查询(可以理解为上次已经查询过了的多少页,继续往下查下一页数据。)



图中返回的位空数据,遍历到这块儿的时候,槽为是空的,没有数据。


其他指令

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


比如


zscan 遍历 zset 集合元素

hscan 遍历 hash 字典的元素

sscan 遍历 set 集合的元素


原文链接:https://blog.csdn.net/weixin_38361347/article/details/104742263


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3