日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SCAN及相关SSCAN,HSCAN和ZSCAN命令解析

發布時間:2023/12/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SCAN及相关SSCAN,HSCAN和ZSCAN命令解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • j3_liuliang
  • 學習Redis命令中碰到了SSCAN命令,一時不知道如何去理解它,所以從Redis中文網上學習了一下用法;雖然很多都是復制粘貼,沒辦法它寫的通俗易懂還詳細嘛,所以我就順勢借鑒了一下(有點意思,小伙子!)

相關文章導航

  • 超詳細Redis之Key操作API,什么?看不懂!你來錘我
  • Redis之String超詳細API使用及應用場景介紹
  • SCAN及相關SSCAN,HSCAN和ZSCAN命令解析
  • 什么?Redis的List類型不會用,看我這個超詳細API使用及應用場景
  • Redis之Hash超詳細API使用及應用場景介紹,不看虧了!
  • Redis之Set集合數據類型API使用及圖文并茂應用場景,不看血虧!
  • Redis之Sorted Set數據類型API及應用場景解析
  • 一、概述

    語法:

    SCAN cursor [MATCH pattern] [COUNT count]
    • cursor - 游標。
    • pattern - 匹配的模式。
    • count - 指定從數據集里返回多少元素,默認值為 10 。

    起始版本:2.8.0

    時間復雜度:O(1) for every call. O(N) for a complete iteration, including enough command calls for the cursor to return back to 0. N is the number of elements inside the collection.

    (中文,考慮到有些靚仔英文看不懂!我反正看不懂)O(1)表示每個調用。O(N)表示一個完整的迭代,包括足夠的命令調用,使光標返回到0。N是集合內的元素數。

    • SCAN 命令用于迭代當前數據庫中的key集合。
    • SSCAN 命令用于迭代SET集合中的元素。
    • HSCAN 命令用于迭代Hash類型中的鍵值對。
    • ZSCAN 命令用于迭代SortSet集合中的元素和元素對應的分值

    以上列出的四個命令都支持增量式迭代,它們每次執行都只會返回少量元素,所以這些命令可以用于生產環境,而不會出現像 EYS 或者 SMEMBERS 命令帶來的可能會阻塞服務器的問題。

    不過,SMEMBERS 命令可以返回集合鍵當前包含的所有元素, 但是對于SCAN這類增量式迭代命令來說,有可能在增量迭代過程中,集合元素被修改,對返回值無法提供完全準確的保證。

    因為 SCAN, SSCAN, HSCAN 和 ZSCAN 四個命令的工作方式都非常相似, 所以這個文檔會一并介紹這四個命令,需要注意的是SSCAN, HSCAN ,ZSCAN命令的第一個參數總是一個key; SCAN 命令則不需要在第一個參數提供任何key,因為它迭代的是當前數據庫中的所有key。

    說明:SSCAN,HSCAN,ZSCAN是針對于SET,HASH,SortSet類型的一個scan擴展,用法和scan一樣

    所以掌握的SCAN和用法,那么它下面的擴展命令還不是收到擒來

    二、SCAN命令基本用法

    SCAN命令是一個基于游標的迭代器。這意味著命令每次被調用都需要使用上一次這個調用返回的游標作為該次調用的游標參數,以此來延續之前的迭代過程當SCAN命令的游標參數被設置為 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值為 0 的游標時, 表示迭代已結束。

    案例:

    127.0.0.1:6379> flushall OK 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5 k6 v6 k7 v7 k8 v8 k9 v9 k10 v10 k11 v11 #添加key和值 OK 127.0.0.1:6379> mset k12 v12 k13 v13 k14 v14 k15 v15 k16 v16 k17 v17 k18 v18 k19 v19 k20 v20 OK 127.0.0.1:6379> scan 0 #開始第一次遍歷,游標為 0 表示開始新的遍歷 1) "14" 2) 1) "k8"2) "k11"3) "k2"4) "k19"5) "k14"6) "k13"7) "k4"8) "k10" 9) "k15"10) "k1" 127.0.0.1:6379> scan 14 #繼續接著上一次遍歷,游標設置上一次返回數組的第一個元素值 14 1) "15" 2) 1) "k6"2) "k5"3) "k16"4) "k3"5) "k12"6) "k7"7) "k18"8) "k9"9) "k20"10) "k17" 127.0.0.1:6379> scan 15 #當返回數組的第一個元素值時0的時候表示集合遍歷完畢 1) "0" 2) (empty list or set) 127.0.0.1:6379>

    在上面這個例子中, 第一次迭代使用 0 作為游標, 表示開始一次新的迭代。第二次迭代使用的是第一次迭代時返回的游標 14 ,作為新的迭代參數 。顯而易見,SCAN命令的返回值 是一個包含兩個元素的數組在第三次調用 SCAN 命令時, 命令返回了游標 0 , 這表示迭代已經結束, 整個數據集已經被完整遍歷過了。

    full iteration :以 0 作為游標開始一次新的迭代, 一直調用 SCAN 命令, 直到命令返回游標 0 , 我們稱這個過程為一次完整遍歷。

    2.1 SCAN命令的保證

    SCAN命令以及其他增量式迭代命令, 在進行完整遍歷的情況下可以為用戶帶來以下保證:

    • 會遍歷到集合中的每一個元素(在遍歷期間):從完整遍歷開始直到完整遍歷結束期間, 一直存在于數據集內的所有元素都會被完整遍歷返回; 這意味著, 如果有一個元素, 它從遍歷開始直到遍歷結束期間都存在于被遍歷的數據集當中, 那么 SCAN 命令總會在某次迭代中將這個元素返回給用戶。
    • 不存在集合中的元素不會遍歷出來(在遍歷期間):同樣,如果一個元素在開始遍歷之前被移出集合,并且在遍歷開始直到遍歷結束期間都沒有再加入,那么在遍歷返回的元素集中就不會出現該元素。

    然而因為增量式命令僅僅使用游標來記錄迭代狀態, 所以這些命令帶有以下缺點:

    • 從集合中遍歷出的元素可能會重復:同一個元素可能會被返回多次。 處理重復元素的工作交由應用程序負責, 比如說, 可以考慮將迭代返回的元素僅僅用于可以安全地重復執行多次的操作上。
    • 遍歷期間添加或刪除集合數據時,在這些數據也可能會被返回:如果一個元素是在迭代過程中被添加到數據集的, 又或者是在迭代過程中從數據集中被刪除的, 那么這個元素可能會被返回, 也可能不會。

    2.2 SCAN命令每次執行返回的元素數量

    SCAN增量式迭代命令并不保證每次執行都返回某個給定數量的元素,甚至可能會返回零個元素, 但只要命令返回的游標不是 0 , 應用程序就不應該將迭代視作結束。

    不過命令返回的元素數量總是符合一定規則的, 對于一個大數據集來說, 增量式迭代命令每次最多可能會返回數十個元素;而對于一個足夠小的數據集來說, 如果這個數據集的底層表示為編碼數據結構(小的sets, hashes and sorted sets), 那么增量迭代命令將在一次調用中返回數據集中的所有元素。

    如果需要的話,用戶可以通過增量式迭代命令提供的COUNT選項來指定每次迭代返回元素的最大值。

    2.3 COUNT選項

    對于增量式迭代命令不保證每次迭代所返回的元素數量,我們可以使用COUNT選項, 對命令的行為進行一定程度上的調整。COUNT 選項的作用就是讓用戶告知迭代命令, 在每次迭代中應該從數據集里返回多少元素。使用COUNT 選項對于對增量式迭代命令相當于一種提示, 大多數情況下這種提示都比較有效的控制了返回值的數量。

    • COUNT 參數的默認值為 10 。
    • 數據集比較大時,如果沒有使用MATCH 選項, 那么命令返回的元素數量通常和 COUNT 選項指定的一樣, 或者比 COUNT 選項指定的數量稍多一些。
    • 在迭代一個編碼為整數集合(intset,一個只由整數值構成的小集合)、 或者編碼為壓縮列表(ziplist,由不同值構成的一個小哈希或者一個小有序集合)時, 增量式迭代命令通常會無視 COUNT 選項指定的值, 在第一次迭代就將數據集包含的所有元素都返回給用戶。

    注意: 并非每次迭代都要使用相同的 COUNT 值,用戶可以在每次迭代中按自己的需要隨意改變 COUNT 值, 只要記得將上次迭代返回的游標用到下次迭代里面就可以了。

    2.4 MATCH 選項

    類似于KEYS 命令,增量式迭代命令通過給定 MATCH 參數的方式實現了通過提供一個 glob 風格的模式參數, 讓命令只返回和給定模式相匹配的元素。
    以下是一個使用 MATCH選項進行迭代的示例:

    127.0.0.1:6379> mset m1 n1 m2 n2 m3 n3 OK 127.0.0.1:6379> keys * #查看所有key1) "k8"2) "k5"3) "k14"4) "k18"5) "k10"6) "k15"7) "m1"8) "k4"9) "m2" 10) "k11" 11) "k16" 12) "k13" 13) "k9" 14) "k19" 15) "k3" 16) "k12" 17) "m3" 18) "k1" 19) "k20" 20) "k17" 21) "k2" 22) "k7" 23) "k6" 127.0.0.1:6379> scan 0 match m* #按照特定規則的方式遍歷 1) "22" 2) 1) "m1" 127.0.0.1:6379> scan 22 match m* 1) "19" 2) 1) "m3"2) "m2" 127.0.0.1:6379> scan 19 match m* 1) "0" 2) (empty list or set) 127.0.0.1:6379>

    MATCH功能對元素的模式匹配工作是在命令從數據集中取出元素后和向客戶端返回元素前的這段時間內進行的, 所以如果被迭代的數據集中只有少量元素和模式相匹配, 那么迭代命令或許會在多次執行中都不返回任何元素。

    redis 127.0.0.1:6379> scan 0 MATCH *11* 1) "288" 2) 1) "key:911" redis 127.0.0.1:6379> scan 288 MATCH *11* 1) "224" 2) (empty list or set) redis 127.0.0.1:6379> scan 224 MATCH *11* 1) "80" 2) (empty list or set) redis 127.0.0.1:6379> scan 80 MATCH *11* 1) "176" 2) (empty list or set) redis 127.0.0.1:6379> scan 176 MATCH *11* COUNT 1000 1) "0" 2) 1) "key:611"2) "key:711"3) "key:118"4) "key:117"5) "key:311"6) "key:112"7) "key:111"8) "key:110"9) "key:113"10) "key:211"11) "key:411"12) "key:115"13) "key:116"14) "key:114"15) "key:119"16) "key:811"17) "key:511"18) "key:11" redis 127.0.0.1:6379>

    可以看出,以上的大部分迭代都不返回任何元素。在最后一次迭代, 我們通過將 COUNT 選項的參數設置為 1000 , 強制命令為本次迭代掃描更多元素, 從而使得命令返回的元素也變多了。

    2.5 并發執行多個迭代

    在同一時間, 可以有任意多個客戶端對同一數據集進行迭代, 客戶端每次執行迭代都需要傳入一個游標, 并在迭代執行之后獲得一個新的游標, 而這個游標就包含了迭代的所有狀態, 因此, 服務器無須為迭代記錄任何狀態。

    2.6 中止迭代

    因為迭代的所有狀態都保存在游標里面, 而服務器無須為迭代保存任何狀態, 所以客戶端可以在中途停止一個迭代, 而無須對服務器進行任何通知。即使有任意數量的迭代在中途停止, 也不會產生任何問題。

    2.7 使用錯誤的游標

    使用SCAN 命令傳入間斷的(broken)、負數、超出范圍或者其他非正常的游標來執行增量式迭代并不會造成服務器崩潰, 但可能會讓命令產生未定義的行為。未定義行為指的是, 增量式命令對返回值所做的保證可能會不再為真。 只有兩種游標是合法的:

    • 在開始一個新的迭代時, 游標必須為 0 。
    • 增量式迭代命令在執行之后返回的, 用于延續迭代過程的游標。

    2.8 迭代能終止的前提

    增量式迭代命令所使用的算法只保證在數據集的大小有界的情況下, 迭代才會停止, 換句話說, 如果被迭代數據集的大小不斷地增長的話, 增量式迭代命令可能永遠也無法完成一次完整迭代。

    從直覺上可以看出, 當一個數據集不斷地變大時, 想要訪問這個數據集中的所有元素就需要做越來越多的工作, 能否結束一個迭代取決于用戶執行迭代的速度是否比數據集增長的速度更快。

    2.9 返回值

    SCAN, SSCAN, HSCAN 和 ZSCAN 命令都返回一個包含兩個元素的 multi-bulk 回復: 回復的第一個元素是字符串表示的無符號 64 位整數(游標), 回復的第二個元素是另一個 multi-bulk 回復, 包含了本次被迭代的元素。

    • SCAN 命令返回的每個元素都是一個key。
    • SSCAN 命令返回的每個元素都是一個集合成員。
    • HSCAN 命令返回的每個元素都是一個鍵值對,一個鍵值對由一個鍵和一個值組成。
    • ZSCAN命令返回的每個元素都是一個有序集合元素,一個有序集合元素由一個成員(member)和一個分值(score)組成。

    2.10 另外的例子

    迭代hash中的鍵值對:

    127.0.0.1:6379> hmset vipclient name j3_liuliang age 18 #添加hash類型數據 OK 127.0.0.1:6379> hscan vipclient 0 #開始迭代 1) "0" 2) 1) "name"2) "j3_liuliang"3) "age"4) "18" 127.0.0.1:6379>

    結束語

    • 本文結合Redis中文網和博主的實踐案例及理解所寫,算是一種擴展把對Redis的命令
    • 由于博主才疏學淺,難免會有紕漏,假如你發現了錯誤或偏見的地方,還望留言給我指出來,我會對其加以修正。
    • 如果你覺得文章還不錯,你的轉發、分享、點贊、留言就是對我最大的鼓勵。
    • 感謝您的閱讀,十分歡迎并感謝您的關注。

    總結

    以上是生活随笔為你收集整理的SCAN及相关SSCAN,HSCAN和ZSCAN命令解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。