实战之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 命令只能一次性地扫描整个数据结构,而不能分批返回。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值