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要长,可是服务器并不会卡顿。

相关文章
相关标签/搜索