搜尋
首頁資料庫RedisRedis中的Scan指令的使用詳解

以下由Redis教學專欄為大家介紹關Redis中的Scan指令的使用詳解,希望對需要的朋友有幫助!

 Redis中的Scan指令的使用詳解

Redis中有一個經典的問題,在龐大的資料量的情況下,做類似尋找符合某種規則的Key的訊息,這裡就有兩種方式,
一是keys命令,簡單粗暴,由於Redis單線程這一特性,keys命令是以阻塞的方式執行的,keys是以遍歷的方式實現的複雜度是O(n),Redis庫中的key越多,查找實現代價越大,產生的阻塞時間越長。
二是scan指令,以非阻塞的方式實作key值的查找,絕大多數情況下是可以取代keys指令的,可選性更強

以下寫入100000條key** *:value***格式的測試資料(ps:用pipline的話,1w一筆,每一筆在秒級完成)

# -*- 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*,一次全部查出來。

Redis中的Scan指令的使用詳解

同樣,如果使用scan指令,則用 scan 0 match key1111* count 20

Redis中的Scan指令的使用詳解

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

SCAN指令是一個基於遊標的迭代器。這意味著指令每次被呼叫都需要使用上一次這個呼叫所傳回的遊標作為該次呼叫的遊標參數,以此來延續先前的迭代過程。
這裡使用scan 0 match key1111* count 20指令來完成這個查詢,稍顯意外的是,使用一開始都沒有查詢到結果,這個要從scan指令的原理來看。
scan在遍歷key的時候,0就代表第一次,key1111*代表依照key1111開頭的模式匹配,count 20中的20並不是代表輸出符合條件的key,而是限定伺服器單次遍歷的字典槽位數量(約等於)。

那麼,什麼又叫做槽的資料?這個槽是不是Redis集群中的slot?答案是否定的。其實上圖已經給了答案。
如果上面說的「字典槽」的數量是集群中的slot,又知道集群中的slot數量是16384,那麼遍歷16384個槽之後,必然能遍歷出來所有的key信息,
上面清楚地看到,當遍歷的字典槽的數量20000的時候,遊標依舊沒有走完遍歷結果,因此這個字典槽並不等於集群中的slot的概念。
經過測試,在scan的時候,究竟遍歷多大的COUNT值能完全match到符合條件的key,跟具體對象的key的個數有關,
如果以超過key個數的count來scan,必定會一次性就查找到所有符合條件的key,例如在key個數為10W個的情況下,一次遍歷20w個字典槽,肯定能完全遍歷出來結果。

 Redis中的Scan指令的使用詳解

scan 指令是一系列指令,除了可以遍歷所有的 key 之外,還可以對指定的容器集合進行遍歷。
zscan 遍歷 zset 集合元素,
hscan 遍歷 hash 字典的元素、
sscan 遍歷 set 集合的元素。
SSCAN 指令、 HSCAN 指令和 ZSCAN 指令的第一個參數總是一個資料庫鍵(某個指定的key)。

另外,使用redis desktop manager的時候,當刷新某個函式庫的時候,控制台自動不斷刷新scan指令,也就知道它在幹嘛了

Redis中的Scan指令的使用詳解

## 

#

以上是Redis中的Scan指令的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:cnblogs。如有侵權,請聯絡admin@php.cn刪除
es和redis区别es和redis区别Jul 06, 2019 pm 01:45 PM

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

一起来聊聊Redis有什么优势和特点一起来聊聊Redis有什么优势和特点May 16, 2022 pm 06:04 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

实例详解Redis Cluster集群收缩主从节点实例详解Redis Cluster集群收缩主从节点Apr 21, 2022 pm 06:23 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

Redis实现排行榜及相同积分按时间排序功能的实现Redis实现排行榜及相同积分按时间排序功能的实现Aug 22, 2022 pm 05:51 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

详细解析Redis中命令的原子性详细解析Redis中命令的原子性Jun 01, 2022 am 11:58 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

一文搞懂redis的bitmap一文搞懂redis的bitmapApr 27, 2022 pm 07:48 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

实例详解Redis实现排行榜及相同积分按时间排序功能的实现实例详解Redis实现排行榜及相同积分按时间排序功能的实现Aug 26, 2022 pm 02:09 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

redis error什么意思redis error什么意思Jun 17, 2019 am 11:07 AM

redis error就是redis数据库和其组合使用的部件出现错误,这个出现的错误有很多种,例如Redis被配置为保存数据库快照,但它不能持久化到硬盘,用来修改集合数据的命令不能用。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具