Redis 面試知識點筆記(三)從海量數據裏查詢某一固定前綴的key

問:從海量數據裏查詢某一固定前綴的key有哪些方法?linux

  1. 使用keys pattern

      keys指令一次性返回全部匹配的key,若是鍵的數量過大,服務器會卡頓,對內存消耗和redis服務器都是隱患,對線上業務也有影響。redis

            keys k1*花了86svim

            ps: linux bash 生成批量測試數據        bash

for((i=1;i<=20000000;i++)); do echo "set k$i v$i">> /tmp/redisTest.txt ;done;

            而後用vim去掉行尾的^M符號服務器

vim /tmp/redisTest.txt
:set fileformat=dos #設置文件格式,經過這句話去掉每行結尾的^M符號
::wq

            最後經過redis的pipeline管道 傳入文件的指令批量灌數據測試

cat /tmp/redisTest.txt | /redis-5.0/src/redis-cli -h 127.0.0.1 -p 6379 --pipe

 

  1. 使用SCAN

            scan cursor [MATCH pattern][COUNT count]3d

  • 基於遊標的迭代器,須要基於上一次的遊標(遊標是隨機的,可能比上一次的更小)延續以前的迭代過程
  • 以0做爲遊標開始一次新的迭代,直到命令返回遊標0完成一次完整的遍歷
  • 不保證每次執行都返回某個給定數量的元素(甚至返回一個數據,只要遊標不爲0 就繼續迭代),支持模糊查詢
  • 一次返回的數量不可控,只能是大機率符合count參數

示例:第一次,scan 0 match k1* count 10 (服務器是不卡頓的)code

第二次,scan 11534336 match k18 count 10orm

能夠在程序裏寫個循環 一直到遊標爲0 結束,每次將取到的值放到hashset裏面,也達到了去重的效果。blog

由於scan是分批次調用的,整體上時間要比keys要長,可是服務器並不會卡頓。

相關文章
相關標籤/搜索