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

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

Redis怎么快速掃描Scan

redis怎么快速掃描Scan,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、網(wǎng)站制作、涼城網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、涼城網(wǎng)絡(luò)營銷、涼城企業(yè)策劃、涼城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供涼城建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

在平時我們維護(hù)線上Redis的時候需要從n個key里面找到某些特定規(guī)則的key,可能查看某些key可能清理某些不需要的key,可能我們第一印象就是keys這個指令,我們可以使用這個指令匹配我們想要的key,下面我們來試試。

keys指令基本用法
> mset name1 a name2 a na1me a na2me aOK> keys name*1) "name"2) "name2"3) "name1"> keys na*me1) "name"2) "na1me"3) "na2me"

這個指令使用非常簡單,但是還是存在非常多的問題:

  1. 沒有一個類似獲取某幾條或某個區(qū)間的搜索,比如我只想要搜索第一條,比如我想分頁搜索獲取第一頁的10條數(shù)據(jù)。

  2. keys的方法是遍歷整個redis樹,執(zhí)行效率是O(n),所以當(dāng)我們搜索的key非常龐大的時候。必須等到這個指令執(zhí)行完后才能執(zhí)行其他指令,redis搜索會延遲,這樣會阻塞其他指令或者延遲等問題。

所以針對這個問題,我們的Redis在2.8版本提出了scan這個指令,那么這個指令有哪些特色呢?

  1. 復(fù)雜度雖然也是O(n),但它是通過游標(biāo)分步進(jìn)行的,不會阻塞線程 。

  2. 提供limit參數(shù),可以控制每次返回結(jié)果的最大條數(shù),limit只是個hint,返回的結(jié)果可多可少。

  3. 同keys一樣,它也提供模式匹配功能。

  4. 服務(wù)器不需要為 游標(biāo)保存狀態(tài) ,游標(biāo)的唯一狀態(tài)就是 scan 返回給客戶端的游標(biāo)整數(shù)。

  5. 返回的結(jié)果可能會有重復(fù),需要客戶端去重,這點非常重要。

  6. 遍歷的過程中如果有數(shù)據(jù)修改,改動后的數(shù)據(jù)能不能遍歷到是不確定的。

  7. 單次返回的結(jié)果是空的并不意昧著遍歷結(jié)束,而要看返回的游標(biāo)值是否為零。

scan指令基本用法  
..........漫長的添加數(shù)據(jù)> scan 0 match name* count 101) "30"2)  1) "name3"    2) "name9"    3) "name12"    4) "name"    5) "name6"    6) "name8"    7) "name11"    8) "name4"    9) "name2"   10) "name7"> scan 30 match name* count 101) "0"            #游標(biāo)為0,沒有數(shù)據(jù)了2) 1) "name10"   2) "name5"   3) "name1"

Redis怎么快速掃描Scan

scan遍歷原理

首先我們介紹redis整個模型,redis簡單來講其實就是一個大的字典,關(guān)于字典不了解的同學(xué)可以查看我的redis字典基礎(chǔ)。字典是由一維數(shù)組+鏈表構(gòu)成,那么我們把這個一維數(shù)組叫做槽當(dāng)然也有叫桶的,那么scan遍歷的時候就是遍歷這個槽,那么在上面我們發(fā)現(xiàn)有時候我們想返回10條記錄,但是redis返回的并沒有10條,這是因為我們的scan遍歷槽,每個槽下面不一定有鏈表或者鏈表值不一定只有一個,所以我們在有些時候使用scan返回的數(shù)據(jù)是不規(guī)則的就是這個原因。

關(guān)于scan的遍歷順序

scan的遍歷順序和我們普通的順序不同,普通方式就是從0->1->2->3....這樣遍歷下去,而scan的遍歷規(guī)則是反過來的,這樣的特殊遍歷方式是考慮到字典擴容和內(nèi)存回收字典收縮時避免槽位重復(fù)或者沖突。Redis怎么快速掃描Scanscan指令擴展

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

集合進(jìn)行遍歷。

比如zscan遍歷zset集合元素,hscan遍歷hash字典的元素,sscan遍歷set集合的元素。

它們的原理同scan類似,因為hash底層就是字典,set也是一個特殊的hash(所有的value指向同一個元素,zset內(nèi)部也使用了字典來存儲所有的元素內(nèi)容。

避免大key掃描

比如我們在操作hash或者zset的時候,它的底層實現(xiàn)是一個字典,我們知道當(dāng)字典的值到達(dá)一定程度的時候就會擴容,每次擴容的時候都會開辟一個更大的內(nèi)存空間,如果在集群環(huán)境中,這個key或被遷移或被刪除會影響系統(tǒng)性能導(dǎo)致系統(tǒng)卡頓現(xiàn)象,我們在運維redis系統(tǒng)的時候如果說redis內(nèi)存大起大落的很有可能就是大key回收導(dǎo)致的。

那么我們在開發(fā)過程中如何避免呢?這里我們就需要用到scan指令了,對于掃描出來的每一個key,使用type指令獲得key的類型,然后使用相應(yīng)數(shù)據(jù)結(jié)構(gòu)的size或者len方法來得到它的大小,對于每一種類型,將大小排名的前若干名作為掃描結(jié)果展示出來。

上面這樣的過程需要編寫腳本,比較煩瑣,不過Redis官方已經(jīng)在redis-cli指令

redis-cli -h 127.0.0.1 -p 7001 --bigkeys -i 0.1

看完上述內(nèi)容,你們掌握Redis怎么快速掃描Scan的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


本文標(biāo)題:Redis怎么快速掃描Scan
鏈接地址:http://weahome.cn/article/gsshej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部