> 文章列表 > 实战之redis进行模糊查找

实战之redis进行模糊查找

实战之redis进行模糊查找

剧情回顾:

一般,我们都是用keys abc。但是这个会进行全局的搜索,会阻塞redis进程。

解决方法:

使用scan替代keys *。
SCAN的关键词:渐进式迭代。通过游标指定下一次迭代的位置,如果返回的游标为0,说明迭代结束。
SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。
SSCAN, HSCAN,ZSCAN的用法和SCAN很相似,都是迭代获取内部的元素,他们的第一个参数都是元素的key。
由于这些命令允许增量迭代,每次调用只返回少量的元素,它们可以在生产中使用,而没有像KEYS或SMEMBERS这样的命令的缺点,因为当针对大的键或元素集合调用时,可能会阻塞服务器很长时间(甚至几秒钟)

命令:

scan 0 => keys *
scan 0 match *abc* [count 10] => keys *abc*
hscan hello 0 [match abc*] [count 10] => hgetall hello
sscan hello 0 [match abc*] => smembers hello
zscan hello 0 [match abc*] => zrange hello 0 -1

SCAN的缺点:
SCAN 命令在遍历集合的过程中,集合的内容可能会发生变化,导致某些元素被重复扫描。元素可能会被返回多次。应用程序需要处理重复元素的情况。
在一次完整的迭代遍历过程中,不断出现在集合中的元素,可能不返回。

扩展:
SCAN 命令在处理一些小的集合数据类型时,可能会忽略 COUNT 选项的值,而直接返回所有的元素。这是因为Redis为了节省内存,会使用一种紧凑的编码方式来存储这些小的集合数据类型,
而这种编码方式不支持游标的遍历。所以 SCAN 命令只能一次性地扫描整个数据结构,而不能分批返回。