Redis中的Scan命令的使用

2021-10-01 23:49:54 字數 2334 閱讀 2575

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 datetime

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

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

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個字典槽,肯定能完全遍歷出來結果。

scan 指令是一系列指令,除了可以遍歷所有的 key 之外,還可以對指定的容器集合進行遍歷。

zscan 遍歷 zset 集合元素,

hscan 遍歷 hash 字典的元素、

sscan 遍歷 set 集合的元素。

sscan 命令、 hscan 命令和 zscan 命令的第乙個引數總是乙個資料庫鍵(某個指定的key)。

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

理解redis中的scan

redis在2.8版本提供了scan相關命令用來遍歷集合中的元素。和keys,smembers命令遍歷大集合場景下會阻塞redis一定時間不同,scan命令每次遍歷只會返回一定數量集合元素和當前的遍歷位置的游標,時間非常短,不會阻塞redis,遍歷大集合時對其他業務影響較小。缺點是通過多次呼叫sca...

Redis中Scan命令的基本使用教程

前言 redis中有乙個經典的問題,在巨大的資料量的情況下,做類似於查詢符合某種規則的www.cppcns.comkey的資訊,這裡就有兩種方式,一是keys命令,簡單粗暴,由於redis單執行緒這一特性,keys命令是以阻塞的方式執行的,keys是以遍歷的方式實現的複雜度是 o n redis庫中...

Redis中的各種scan命令的區別與用法

redis中的keys 的訪問,容易引起redis的阻塞。於是有了各種scan命令,它如同游標一樣,逐漸的遍歷redis中的key。以下是各命令的使用,其中 中是引數,中是可選引數。scan match count hscan key match count sscan key match coun...