python中redis进行模糊查询(keys()、scan()、scan_iter())

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 python中redis进行模糊查询(keys()、scan()、scan_iter()),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、redis模糊查询介绍

python中使用redis进行模糊查询,可以使用scan()命令模糊匹配key。

keys命令:简单粗暴,但是由于Redis是单线程,keys命令是以阻塞的方式执行的,keys是以遍历的方式实现的复杂度是 O(n),Redis库中的key越多,查找实现代价越大,产生的阻塞时间越长。

scan命令: 以非阻塞的方式实现key值的查找,绝大多数情况下是可以替代keys命令的,可选性更强。

2、scan()介绍

2.1 scan 命令:

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

2.2 SCAN 命令的基本用法:

SCAN cursor [MATCH pattern] [COUNT count]

参数解释:

  • cursor :游标位置
  • pattern:匹配的值
  • count:每次渐进的值并不是返回结果的数量,也可以理解为每次扫描的值这个 值也并不是越大越好,测试中500w数据 设置为15000时效率最好。默认值是10。

注意 :Count 参数越大,Redis 阻塞时间也会越长,需要取舍。开始不知道直接设置了Integer.MAX_VALUE 结果上线直接凉凉堵塞死。并且返回的值中会存在重复的key 且是无序的 所以要注意去重。

2.3 模糊查询通配符

Redis中keys命令进行获取key值,具体命令格式:keys pattern

redis中允许模糊查询的有3个通配符,分别是:*,?,[]

其中:

  • *:通配任意多个字符
  • ?:通配单个字符
  • []:通配括号内的某一个字符

2.4 scan()命令优缺点

优点:同样是O(N)复杂度的scan命令,支持通配查找,scan命令或者其他的scan如SSCAN ,HSCAN,ZSCAN命令,可以不用阻塞主线程,并支持游标按批次迭代返回数据,所以是比较理想的选择。keys相比scan命令优点是,keys是一次返回,而scan是需要迭代多次返回。

缺点:返回的数据有可能重复,需要我们在业务层按需要去重,scan命令的游标从0开始,也从0结束,每次返回的数据,都会返回下一次游标应该传的值,我们根据这个值,再去进行下一次的访问,如果返回的数据为空,并不代表没有数据了,只有游标返回的值是0的情况下代表结束。

3、实战演示

3.1 生成数据:

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    for i in range(100):
        s.set(f"name_{i}", f"dgw_{i}")
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

 3.2 正常查询所有的键key

示例代码1:  【直接使用keys()方法】

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    keys = s.keys()
    print(keys)
    print(len(keys))
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

示例代码2:  【根据键遍历查询所有的值】

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    for i in range(100):
        ret = s.get(f"name_{i}")
        print(ret)
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

示例代码3:【使用scan()方法】

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    keys = s.scan(count=100)  # 返回的是一个元组,默认count返回是10个
    # scan中count:向Redis提供有关每批要返回的密钥数的提示,此处要注意返回的数量
    print(keys)
    print(len(keys[1]))
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

示例代码4:【使用scan_iter()迭代方法】

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    keys = s.scan_iter()  # 返回的是一个迭代器
    count = 0
    for key in keys:
        print(key)
        count += 1
    print(count)
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

3.3 查找模糊匹配的键key

示例代码1:  【直接使用keys(),不建议这样使用】

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    keys = s.keys(pattern="name_6*")
    print(keys)
    print(len(keys))
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

  • 示例代码2: 【使用scan()方法】
from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    # keys = s.scan(match="name_6*")  # 注意:本人测试这种写法(没有加count)没有返回数据
    keys = s.scan(match="name_6*", count=100)
    print(keys)
    print(len(keys[1]))
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

示例代码3:  【使用scan_iter()迭代方法】

from redis import StrictRedis

try:
    s = StrictRedis.from_url('redis://192.168.124.49/1')
    keys = s.scan_iter(match="name_6*")
    count = 0
    for key in keys:
        print(key)
        count += 1
    print(count)
except Exception as e:
    print(e)

python中redis进行模糊查询(keys()、scan()、scan_iter())

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142804.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!