真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Redis中Scan命令的使用方法

小編給大家分享一下redis中Scan命令的使用方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

迎澤ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

Redis中有一個(gè)經(jīng)典的問題,在巨大的數(shù)據(jù)量的情況下,做類似于查找符合某種規(guī)則的Key的信息,這里就有兩種方式,
一是keys命令,簡(jiǎn)單粗暴,由于Redis單線程這一特性,keys命令是以阻塞的方式執(zhí)行的,keys是以遍歷的方式實(shí)現(xiàn)的復(fù)雜度是 O(n),Redis庫(kù)中的key越多,查找實(shí)現(xiàn)代價(jià)越大,產(chǎn)生的阻塞時(shí)間越長(zhǎng)。
二是scan命令,以非阻塞的方式實(shí)現(xiàn)key值的查找,絕大多數(shù)情況下是可以替代keys命令的,可選性更強(qiáng)

以下寫入100000條key***:value***格式的測(cè)試數(shù)據(jù)(ps:用pipline的話,1w一筆,每一筆在秒級(jí)完成)

# -*- 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命令,則執(zhí)行keys key1111*,一次性全部查出來(lái)。

Redis中Scan命令的使用方法

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

Redis中Scan命令的使用方法

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

SCAN命令是一個(gè)基于游標(biāo)的迭代器。這意味著命令每次被調(diào)用都需要使用上一次這個(gè)調(diào)用返回的游標(biāo)作為該次調(diào)用的游標(biāo)參數(shù),以此來(lái)延續(xù)之前的迭代過程。
這里使用scan 0 match key1111* count 20命令來(lái)完成這個(gè)查詢,稍顯意外的是,使用一開始都沒有查詢到結(jié)果,這個(gè)要從scan命令的原理來(lái)看。
scan在遍歷key的時(shí)候,0就代表第一次,key1111*代表按照key1111開頭的模式匹配,count 20中的20并不是代表輸出符合條件的key,而是限定服務(wù)器單次遍歷的字典槽位數(shù)量(約等于)。

那么,什么又叫做槽的數(shù)據(jù)?這個(gè)槽是不是Redis集群中的slot?答案是否定的。其實(shí)上圖已經(jīng)給出了答案了。
如果上面說的“字典槽”的數(shù)量是集群中的slot,又知道集群中的slot數(shù)量是16384,那么遍歷16384個(gè)槽之后,必然能遍歷出來(lái)所有的key信息,
上面清楚地看到,當(dāng)遍歷的字典槽的數(shù)量20000的時(shí)候,游標(biāo)依舊沒有走完遍歷結(jié)果,因此這個(gè)字典槽并不等于集群中的slot的概念。
經(jīng)過測(cè)試,在scan的時(shí)候,究竟遍歷多大的COUNT值能完全match到符合條件的key,跟具體對(duì)象的key的個(gè)數(shù)有關(guān),
如果以超過key個(gè)數(shù)的count來(lái)scan,必定會(huì)一次性就查找到所有符合條件的key,比如在key個(gè)數(shù)為10W個(gè)的情況下,一次遍歷20w個(gè)字典槽,肯定能完全遍歷出來(lái)結(jié)果。

Redis中Scan命令的使用方法

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

另外,使用redis desktop manager的時(shí)候,當(dāng)刷新某個(gè)庫(kù)的時(shí)候,控制臺(tái)自動(dòng)不斷刷新scan命令,也就知道它在干嘛了

Redis中Scan命令的使用方法

看完了這篇文章,相信你對(duì)Redis中Scan命令的使用方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前題目:Redis中Scan命令的使用方法
網(wǎng)站URL:http://weahome.cn/article/gdides.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部