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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令

發布時間:2023/12/14 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、總結

Scan命令又細分為:scan命令,Sscan命令、Hscan命令、Zscan命令。

  • scan命令用于迭代字符串中的元素。
  • Sscan命令用于迭代集合鍵中的元素。
  • Hscan命令用于迭代哈希鍵中的鍵值對。
  • Zscan命令用于迭代有序集合中的元素(包括元素成員和元素分值)。

二、scan的由來

Redis中的Keys命令和Smembers命令類似于數據庫中的全表掃描,其中,Smembers命令返回集合中的所有的成員,與數據庫中的全表掃描無異。由于Redis是單線程,而Keys命令和Smembers命令會造成Redis線程的堵塞,在生產環境需要十分慎重的使用。

為了避免Redis線程的堵塞出現了查詢迭代命令,也就是Scan命令,其用于迭代當前數據庫中的緩存數據。Scan 命令是一個基于游標的迭代器,每次被調用之后, 都會向用戶返回一個新的游標, 用戶在下次迭代時需要使用這個新游標作為Scan命令的游標參數, 以此來延續之前的迭代過程。

Scan命令返回一個包含兩個元素的數組,
第一個元素:是用于進行下一次迭代的新游標(如果新游標返回 0 表示迭代已結束)?
第二個元素:則是一個數組, 這個數組中包含了所有被迭代的元素。

在同一時間,可以有任意多個客戶端對同一數據集進行迭代,客戶端每次執行迭代都需要傳入一個游標,并在迭代執行之后獲得一個新的游標,而這個游標就包含了迭代的所有狀態,因此,服務器無須為迭代記錄任何狀態。因為迭代的所有狀態都保存在游標里面,而服務器無須為迭代保存任何狀態,所以客戶端可以在中途停止一個迭代,而無須對服務器進行任何通知。即使有任意數量的迭代在中途停止,也不會產生任何問題。

例如:

以下是一個SCAN命令的迭代過程示例:

127.0.0.1:6379> scan 0 MATCH ops-coffee-*

1)"38"

2)?"ops-coffee-25"

? ? "ops-coffee-19"

? ? "ops-coffee-29"

? ? "ops-coffee-10"

? ? "ops-coffee-23"

? ? "ops-coffee-5"

? ? "ops-coffee-14"

? ? "ops-coffee-16"

? ? "ops-coffee-11"

? ? "ops-coffee-15"

? ? "ops-coffee-7"

? ? "ops-coffee-1"

127.0.0.1:6379> scan 38 MATCH ops-coffee-* COUNT 1000

1) "0"

2) "ops-coffee-13"

? ? "ops-coffee-9"

? ? "ops-coffee-21"

? ? "ops-coffee-6"

? ? "ops-coffee-30"

? ? "ops-coffee-20"

? ? "ops-coffee-2"

? ? "ops-coffee-12"

? ? "ops-coffee-28"

? ? "ops-coffee-3"

? ? "ops-coffee-26"

? ? "ops-coffee-4"

? ? "ops-coffee-31"

? ? "ops-coffee-8"

? ? "ops-coffee-22"

? ? "ops-coffee-27"

? ? "ops-coffee-18"

? ? "ops-coffee-24"

? ? "ops-coffee-17"


參考自:https://www.jianshu.com/p/e325015ad5fa

上面這個例子的意思是掃描所有前綴為“ops-coffee-”的key

  • 第一次迭代:使用0作為游標,表示開始一次新的迭代,同時使用了MATCH匹配前綴為ops-coffee-的key,返回了游標值38以及遍歷到的數據。
  • 第二次迭代:使用的是第一次迭代時返回的游標,也即是命令回復第一個元素的值38,同時通過將COUNT選項的參數設置為1000,強制命令為本次迭代掃描更多元素
    在第二次調用SCAN命令時,命令返回了游標0,這表示迭代已經結束,整個數據集已經被完整遍歷過了。

三、擴展

1. linux shell命令

KEYS命令的時間復雜度為O(n),而SCAN命令會將遍歷操作分解成m次時間復雜度為O(1)的操作來執行,從而解決使用keys命令遍歷大量數據而導致服務器阻塞的情況,使用下邊的指令可以達到優雅刪除的目的:

redis-cli --scan --pattern "ops-coffee-*" | xargs -L 2000 redis-cli del

其中xargs -L指令表示xargs一次讀取的行數,也就是每次刪除的key數量,一次讀取太多xargs會報錯

2.??sscan?

類似的SCAN命令,對于Redis不同的數據類型還有另外幾個SSCAN、HSCAN和ZSCAN,使用方法類似:

sscan ops-coffee 0 MATCH v1*

1) "7"
2) "v15"
? ? "v13"
? ? "v12"
? ? "v10"
? ? "v14"
? ? "v1"

與SCAN命令不同的是這幾個命令需要多加一個key的參數,例如本例中的ops-coffee


轉載自:?

Redis迭代查詢詳解:Scan命令、Sscan命令、Hscan命令、Zscan命令 - MyBatis中文官網

redis scan 優雅的批量刪除 - 簡書

總結

以上是生活随笔為你收集整理的Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令的全部內容,希望文章能夠幫你解決所遇到的問題。

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