怎么在复述里按模式删除数据

  介绍

小编给大家分享一下怎么在复述里按模式删除数据,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

一台复述,服务器在很短的时间里消耗了几十个G的内存,最终因为交换而宕机,因为这台服务器的社会背景比较复杂,所以一时无法判断犯罪嫌疑人到底是谁。

最开始的直觉是认为肯定有人保存了大体积的数据,于是问题就变成了找出哪些键占用的空间比较大,DBA同事用了redis-rdb-tools等工具来分析数据文件。可惜的是虽然找到了一些大体积的键,但最终都排除了嫌疑,问题似乎陷入了僵局。

在被直觉带入死胡同之后,我们开始调整调查的角度:即便一个键本身占用的空间并不大,但是如果相同模式的键数量很多的话,那么合计起来一样会占用大量空间,于是问题就变成了找出哪些相同模式的键占用的空间比较大。这次我不想用什么工具,而是打算在测试服务器上一边删除可疑键一边查看内存变化情况:

 shell>,/路径//redis-cli  keys  foo: *, |, xargs /路径//redis-cli 德尔

悲催的是一运行这个命令服务器就挂了!因为数据太多了,所以键受不了。此时应该使用扫描,它有游标的概念,每次迭代只涉及很少的数据。

直接在命令行使用扫描有些麻烦,于是我用了PHP:

 & lt; ? PHP
  
  $ redis =, new 复述();
  复述→美元setOption(复述::OPT_SCAN,复述:SCAN_RETRY);
  
  时间=美元match  & # 39; foo: * & # 39;;
  时间=美元count  10000;
  
  while  (keys 美元;=,复述,美元→扫描(美元,,匹配,美元,美元计算)),{
  ,,,复述,→美元德尔($键);
  }
  
  ?祝辞

在删除的同时注意监控内存变化情况,就能确认问题了:

 shell>, watch  -d  -n  1, & # 39;/路径//redis-cli  info  |, grep 记忆# 39;

至于可疑键的获取,我是瞎蒙的,简单通过监控或者扫描获取采样数据即可,另外从此案例看,监控键总数的变化幅度是很重要的,从信息里能拿到它。

以上是“怎么在复述里按模式删除数据”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

怎么在复述里按模式删除数据