最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis遍歷所有key的兩個命令(KEYS 和 SCAN)

 更新時間:2021年04月12日 14:14:32   作者:代碼一天不寫我渾森難廋  
這篇文章主要介紹了Redis遍歷所有key的兩個命令(KEYS 和 SCAN),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

當我們需要遍歷Redis所有key或者指定模式的key時,首先想到的是KEYS命令:

KEYS pattern

官網對于KEYS命令有一個提示:  KEYS 的速度非常快,例如,Redis在一個有1百萬個key的數(shù)據庫里面執(zhí)行一次查詢需要的時間是40毫秒 。但在一個大的數(shù)據庫中使用它仍然可能造成性能問題,如果你需要從一個數(shù)據集中查找特定的  KEYS , 你最好還是用 Redis 的集合結構  SETS  來代替。
KEYS命令使用很簡單。

redis> MSET one 1 two 2 three 3 four 4
OK
redis> KEYS *o*
1) "four"
2) "one"
3) "two"
redis> KEYS t??
1) "two"
redis> KEYS *
1) "four"
2) "three"
3) "one"
4) "two"
redis>

但由于KEYS命令一次性返回所有匹配的key,所以,當redis中的key非常多時,對于內存的消耗和redis服務器都是一個隱患,
對于Redis 2.8以上版本給我們提供了一個更好的遍歷key的命令 SCAN 該命令的基本格式:

SCAN cursor [MATCH pattern] [COUNT count]

SCAN  每次執(zhí)行都只會返回少量元素,所以可以用于生產環(huán)境,而不會出現(xiàn)像 KEYS 或者 SMEMBERS 命令帶來的可能會阻塞服務器的問題。

SCAN命令是一個基于游標的迭代器。這意味著命令每次被調用都需要使用上一次這個調用返回的游標作為該次調用的游標參數(shù),以此來延續(xù)之前的迭代過程

當SCAN命令的游標參數(shù)(即cursor)被設置為 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值為 0 的游標時, 表示迭代已結束。

簡單的迭代演示:

redis 127.0.0.1:6379> scan 0
1) "17"
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"
    5) "key:16"
    6) "key:17"
    7) "key:15"
    8) "key:10"
    9) "key:3"
   10) "key:7"
   11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
   2) "key:18"
   3) "key:0"
   4) "key:2"
   5) "key:19"
   6) "key:13"
   7) "key:6"
   8) "key:9"
   9) "key:11"

在上面這個例子中, 第一次迭代使用 0 作為游標, 表示開始一次新的迭代。第二次迭代使用的是第一次迭代時返回的游標 17 ,作為新的迭代參數(shù) 。

顯而易見,SCAN命令的返回值 是一個包含兩個元素的數(shù)組, 第一個數(shù)組元素是用于進行下一次迭代的新游標, 而第二個數(shù)組元素則又是一個數(shù)組, 這個數(shù)組中包含了所有被迭代的元素。

注意:返回的游標不一定是遞增的,可能后一次返回的游標比前一次的小。
在第二次調用 SCAN 命令時, 命令返回了游標 0 , 這表示迭代已經結束, 整個數(shù)據集已經被完整遍歷過了。

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

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

不過命令返回的元素數(shù)量總是符合一定規(guī)則的, 對于一個大數(shù)據集來說, 增量式迭代命令每次最多可能會返回數(shù)十個元素;而對于一個足夠小的數(shù)據集來說,可能會一次迭代返回所有的key

COUNT選項

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

注意:COUNT選項并不能嚴格控制返回的key數(shù)量,只能說是一個大致的約束。并非每次迭代都要使用相同的 COUNT 值,用戶可以在每次迭代中按自己的需要隨意改變 COUNT 值, 只要記得將上次迭代返回的游標用到下次迭代里面就可以了。

MATCH 選項

類似于KEYS 命令,增量式迭代命令通過給定 MATCH 參數(shù)的方式實現(xiàn)了通過提供一個 glob 風格的模式參數(shù), 讓命令只返回和給定模式相匹配的元素。

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

以下是這種情況的一個例子:

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 選項的參數(shù)設置為 1000 , 強制命令為本次迭代掃描更多元素, 從而使得命令返回的元素也變多了。

基于SCAN的這種安全性,建議大家在生產環(huán)境都使用SCAN命令來代替KEYS,不過注意,該命令是在2.8.0版本之后加入的,如果你的Redis低于這個版本,則需要升級Redis。

下面用PHP代碼演示SCAN命令的使用:

<?php
 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
/* 設置遍歷的特性為不重復查找,該情況下擴展只會scan一次,所以可能會返回空集合 */
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY);
$it = NULL;
$pattern = '*';
$count = 50;  // 每次遍歷50條,注意是遍歷50條,遍歷出來的50條key還要去匹配你的模式,所以并不等于就能夠取出50條key
do
{
    $keysArr = $redis->scan($it, $pattern, $count);
    if ($keysArr)
    {
        foreach ($keysArr as $key)
        {
            echo $key . "\n";
        }
    }
} while ($it > 0);   //每次調用 Scan會自動改變 $it 值,當$it = 0時 這次遍歷結束 退出循環(huán)
echo '---------------------------------------------------------------------------------' . "\n";
/* 設置擴展在一次scan沒有查找出記錄時 進行重復的scan 直到查詢出結果或者遍歷結束為止 */
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
//這種用法下我們只需要簡單判斷返回結果是否為空即可, 如果為空說明遍歷結束
while ($keysArr = $redis->scan($it, $pattern, $count))
    foreach ($keysArr as $key)
        echo $key . "\n";
}

執(zhí)行結果:

[root@localhost php]# /usr/local/php/bin/php scan.php
bm
bm2
h1
name
bit
bm1
places
cities
hhl
---------------------------------------------------------------------------------
bm
bm2
h1
name
bit
bm1
places
cities
hhl

注意:如果php執(zhí)行報錯 請升級到較新版本的Redis擴展

更多請參考:

http://www.redis.cn/commands/keys.html

http://www.redis.cn/commands/scan.html

https://github.com/phpredis/phpredis#scan

到此這篇關于Redis遍歷所有key的兩個命令(KEYS 和 SCAN)的文章就介紹到這了,更多相關Redis遍歷所有key內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Redis從單點到集群部署模式(單機模式?主從模式?哨兵模式)

    Redis從單點到集群部署模式(單機模式?主從模式?哨兵模式)

    這篇文章主要為大家介紹了Redis從單點集群部署模式(單機模式?主從模式?哨兵模式)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Redis實現(xiàn)編碼生成規(guī)則方式

    Redis實現(xiàn)編碼生成規(guī)則方式

    在自動生成編碼時應采用“MD+年月日+4位序列號”的規(guī)則,如“MD202310130001”,為避免使用隨機序列號導致的重復編碼,建議使用從0開始的自增序列號,此外,使用Redis的incrBy功能實現(xiàn)序列號自增,可以有效提高效率和降低實現(xiàn)難度
    2023-01-01
  • Redis數(shù)據庫的應用場景介紹

    Redis數(shù)據庫的應用場景介紹

    這篇文章主要介紹了Redis數(shù)據庫的應用場景介紹,本文講解了MySql+Memcached架構的問題、Redis常用數(shù)據類型、Redis數(shù)據類型應用和實現(xiàn)方式、Redis實際應用場景等內容,需要的朋友可以參考下
    2015-06-06
  • Redis獲取某個大key值的腳本實例

    Redis獲取某個大key值的腳本實例

    這篇文章主要給大家分享介紹了關于Redis獲取某個大key值的一個腳本實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • Redis動態(tài)熱點數(shù)據緩存策略設計

    Redis動態(tài)熱點數(shù)據緩存策略設計

    本文主要介紹了Redis動態(tài)熱點數(shù)據緩存策略設計,包括熱點數(shù)據識別、動態(tài)緩存、多級緩存、預加載機制、更新策略以及監(jiān)控告警等,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • redis實現(xiàn)sentinel哨兵架構的方法

    redis實現(xiàn)sentinel哨兵架構的方法

    哨兵是一個分布式系統(tǒng),可以在一個架構中運行多個哨兵(sentinel) 進程,這些進程使用流言協(xié)議(gossip protocols)來接收關于Master主服務器是否下線的信息,這篇文章主要介紹了redis實現(xiàn)sentinel哨兵架構,需要的朋友可以參考下
    2022-11-11
  • 深入理解Redis BigKey

    深入理解Redis BigKey

    本文主要介紹了Redis中的BigKey問題及其處理方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • redis防止短信惡意調用的實現(xiàn)

    redis防止短信惡意調用的實現(xiàn)

    本文主要介紹了在場景登錄或注冊接口中使用短信驗證碼時遇到的惡意調用問題,并通過使用Redis分布式鎖來解決,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • redis中scan命令的基本實現(xiàn)方法

    redis中scan命令的基本實現(xiàn)方法

    這篇文章主要給大家介紹了關于redis中scan命令的基本實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • redis解決高并發(fā)看門狗策略的實現(xiàn)

    redis解決高并發(fā)看門狗策略的實現(xiàn)

    本文主要介紹了redis解決高并發(fā)看門狗策略的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02

最新評論

雷州市| 南康市| 沈阳市| 阳春市| 大余县| 阳山县| 小金县| 敦化市| 周宁县| 寿阳县| 汾西县| 永寿县| 芦溪县| 乾安县| 鄯善县| 江孜县| 怀远县| 凌源市| 鲁甸县| 曲沃县| 景德镇市| 兴国县| 尉犁县| 长汀县| 布尔津县| 万年县| 东山县| 海南省| 东阳市| 莲花县| 紫金县| 称多县| 延庆县| 霍城县| 昌江| 托里县| 杂多县| 黎城县| 山阳县| 汉中市| 鄯善县|