Redis中的Scan命令的使用详解


本文摘自PHP中文网,作者藏色散人,侵删。

下面由Redis教程栏目给大家介绍关Redis中的Scan命令的使用详解,希望对需要的朋友有所帮助!

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# -*- coding: utf-8 -*-

# !/usr/bin/env python3

import redis

import sys

import datetimedef create_testdata():

    r = redis.StrictRedis(host='***.***.***.***', port=***, db=0, password='***')

    counter = 0

    with r.pipeline(transaction=False) as p:

        for i in range(0, 100000):

            p.set('key' + str(i), "value" + str(i))

            counter = counter + 1

            if (counter == 10000):

                p.execute()

                counter = 0

                print("set by pipline loop")

 

if __name__ == "__main__":

    create_testdata()

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

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

4166021c7bd041abbb83da183f0bd88.png

同样,如果使用scan命令,则用 scan 0 match key1111* count 20

74dfa841e6c1047c89748d881ab642a.png

scan的语法为:SCAN cursor [MATCH pattern] [COUNT count] The default COUNT value is 10.

SCAN命令是一个基于游标的迭代器。这意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。
这里使用scan 0 match key1111* count 20命令来完成这个查询,稍显意外的是,使用一开始都没有查询到结果,

阅读剩余部分

相关阅读 >>

Redis学习之:介绍Redis事务

Redis的增量同步如何实现

Redis有什么用?

Redis主从复制什么时候复制

Redis除了缓存还能做什么

如何查看Redis密码

Redis分片详解

关于spring Redis注解实现缓存机制

解决Redis容器使用Redis.conf启动失败

Redis的分区实现

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...