复述,如何删除1.2亿指定前缀的关键

  介绍

这篇文章主要为大家展示了“复述,如何删除1.2亿指定前缀的钥匙”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“复述,如何删除1.2亿指定前缀的关键”这篇文章吧。

  背景

  因为更换IDC的原因,我们需要迁移缓存到新的机房,开发同学提出老的缓存有1.2亿无效(未设置过期时间)的关键和正常在用的业务键,在迁移之前可以先指定前缀将关键删除。那么问题来了,如何快速删除1.2亿的关键呢?

  如何获取指定的关键

  大家都知道由于复述的单线程服务模式,命令,<强>键* 强,会阻塞正常的业务请求,所以肯定不行。

  在这里我们利用复述,提供的,,<强>扫描功能.SCAN命令是一个基于游标的迭代器(基于游标的迭代器):扫描命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为扫描命令的游标参数,以此来延续之前的迭代过程。

  当扫描命令的游标参数被设置为0时,服务器将开始一次新的迭代,而当服务器向用户返回值为0的游标时,表示迭代已结束。扫描的语法如下,

 SCAN  cursor  [MATCH 模式],[COUNT 计数]

  其中cousor是游标,匹配则支持正则匹配,我们正好可以利用此功能,比如匹配前缀为“dba_"的关键,数是每次获取多少个关键。

 redis  127.0.0.1:6379> scan  0
  1),“17”;
  2),,1),“关键:12“;
  ,,,2),“关键:8“;
  ,,,3),“关键:4“;
  ,,,4),“关键:14“;
  ,,,5),“关键:16“
  ,,,6),“关键:17“;
  ,,,7),“关键:15“
  ,,,8),“关键:10“;
  ,,,9),“关键:3“;
  ,,,10),“关键:7“;
  ,,,11),“关键:1“;
  redis  127.0.0.1:6379> scan  17
  1),“0”;
  2),1),“关键:5“;
  ,,2),“关键:18“;
  ,,3),“关键:0“;
  ,,4),“关键:2“;
  ,,5),“关键:19“;
  ,,6),“关键:13“;
  ,,7),“关键:6“;
  ,,8),“关键:9“;
  ,,9),“关键:11“

  在上面这个例子中,第一次迭代使用0作为游标,表示开始一次新的迭代第。二次迭代使用的是第一次迭代时返回的游标,也即是命令回复第一个元素的值——17岁。在第二次调用扫描命令时,命令返回了游标0,这表示迭代已经结束,整个数据集(集合)已经被完整遍历过了。

  从上面的示例可以看的到,扫描命令的回复是一个包含两个元素的数组,第一个数组元素是用于进行下一次迭代的新游标,而第二个数组元素则是一个数组,这个数组中包含了所有被迭代的元素。

  注意:<强>以0作为游标开始一次新的迭代,一直调用扫描命令,直到命令返回游标0,我们称这个过程为一次完整遍历(迭代)。,我们会在后面的代码实现中利用此特点。

  Python的复述,模块提供scan_iter迭代器来遍历键,其返回的结果迭代器对象。

<>之前拷贝[53]:,ret=r.scan_iter (& # 39; dba_ * & # 39;, 20)   [54]:拷贝,print  ret

  至此,我们解决了如何获取数据的问题,下面思考第二个问题。

  如何执行删除

  这个相对比较简单,复述,提供<强> DEL ,命令

 127.0.0.1:6379[2]祝辞,get “dba_7"
  “r06cVX9"
  127.0.0.1:6379[2]祝辞,get “dba_1"
  “ETX57PA"
  127.0.0.1:6379[2]祝辞,del “dba_7",“dba_1"
  (整数),2
  127.0.0.1:6379[2]在

  在redis-py中,提供了删除(关键)、删除(*键)的函数,其中参数*关键是多个值的列表。到这里,我们大致可以想到获取钥匙,然后批量删除

 (mytest) ?,, test  git:(主),? python  delete_key.py
  initial  keys 成功,use 时间:90.2497739792
  normal  ways 最终获得:68.685477972
  normal  ways  delete 数字:1000000,

  常规方式的删除10 w个关键耗时68.7秒,如果是1.2亿个关键要多少时间呢? 68 * 1000/3600=18.8小时。能不能更快呢?,

  如何提高执行速度

  复述本身是基于请求/响应协议的,客户端发送一个命令,等待复述应答,复述,在接收到命令,处理后应答。其中发送命令加上返回结果的时间称为(轮时间旅行)RRT -往返时间。如果客户端发送大量的命令给复述,那就是等待上一条命令应答后再执行再执行下一条命令,这中间不仅仅多了RTT,而且还频繁的调用系统IO,发送网络请求。

复述,如何删除1.2亿指定前缀的钥匙”>
  <h2 class=复述,如何删除1.2亿指定前缀的关键