1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

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

    來源:腳本之家  責任編輯:小易  

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

    KEYS pattern

    官網對于KEYS命令有一個提示:  KEYS 的速度非常快,例如,Redis在一個有1百萬個key的數據庫里面執行一次查詢需要的時間是40毫秒 。但在一個大的數據庫中使用它仍然可能造成性能問題,如果你需要從一個數據集中查找特定的  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  每次執行都只會返回少量元素,所以可以用于生產環境,而不會出現像 KEYS 或者 SMEMBERS 命令帶來的可能會阻塞服務器的問題。

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

    當SCAN命令的游標參數(即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 ,作為新的迭代參數 。

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

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

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

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

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

    COUNT選項

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

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

    MATCH 選項

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

    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 , 強制命令為本次迭代掃描更多元素, 從而使得命令返回的元素也變多了。

    基于SCAN的這種安全性,建議大家在生產環境都使用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時 這次遍歷結束 退出循環
    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";
    }
    

    執行結果:

    [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執行報錯 請升級到較新版本的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內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:Redis批量刪除KEY的方法Redis如何優雅的刪除特定前綴keyPython獲取Redis所有Key以及內容的方法Python操作Redis之設置key的過期時間實例代碼redis數據庫查找key在內存中的位置的方法redis中key的設置方法步驟redis中熱key問題該如何解決redis 解決key的亂碼問題,并清理詳解

  3. 本文相關:
  4. redis cluster集群主從切換的踩坑與填坑
  5. redis數據的兩種持久化方式對比
  6. redis配置文件redis.conf中文版(基于2.4)
  7. 為啥懶 redis 是更好的 redis
  8. redis實現分布式隊列淺析
  9. spring boot+redis實現消息發布與訂閱的代碼
  10. 大家都應該知道的redis過期鍵與過期策略
  11. redis 數據類型的詳解
  12. 用redis實現微博關注關系
  13. redis集合類型的常用命令小結
  14. 有沒有好的方法遍歷redis里面的所有key
  15. 請問有沒有好的方法遍歷redis里面的所有key。。?
  16. redistemplate 怎么獲取所有keys
  17. Redis 如何獲取記錄 的個數?? 現在知道 keys pat...
  18. Redis 有沒有什么命令可以查詢當前庫有多少個 key
  19. 如何讀取redis中的key值中的結果
  20. 如何批量刪除Redis下特定pattern的keys
  21. redis那個命令可以統計key的數量?
  22. redis keys 管道命令 刪key會卡庫嗎
  23. 有沒有好的方法遍歷redis里面的所有key
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁redisredis批量刪除key的方法redis如何優雅的刪除特定前綴keypython獲取redis所有key以及內容的方法python操作redis之設置key的過期時間實例代碼redis數據庫查找key在內存中的位置的方法redis中key的設置方法步驟redis中熱key問題該如何解決redis 解決key的亂碼問題,并清理詳解redis cluster集群主從切換的踩坑與填坑redis數據的兩種持久化方式對比redis配置文件redis.conf中文版(基于2.4)為啥懶 redis 是更好的 redisredis實現分布式隊列淺析spring boot+redis實現消息發布與訂閱的代碼大家都應該知道的redis過期鍵與過期策略redis 數據類型的詳解用redis實現微博關注關系redis集合類型的常用命令小結超強、超詳細redis數據庫入門教程redis常用命令、常見錯誤、配置技redis操作命令總結redis中5種數據結構的使用場景介64位windows下安裝redis教程redis中使用redis-dump導出、導入redis中統計各種數據大小的方法redis 密碼設置和查看密碼的方法redis常用命令小結讓redis在你的系統中發揮更大作用分布式爬蟲處理redis里的數據操作步驟redis未授權訪問配合ssh key文件利用詳解redis 對比 memcached 并在 centos 下進行springsession+redis實現集群會話共享的方redis使用bloom-filter過濾器實現推薦去重redis中使用java腳本實現分布式鎖redis中一些最常見的面試問題總結動態添加redis密碼認證的方法編譯安裝redisd的方法示例詳解利用redis如何實現自動補全功能
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载