IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

如何在Redis里按模式删除数据

火丁笔记 2014-04-13 22:38:27 累计浏览 2,555 次
本机暂存

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

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

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

shell> /path/to/redis-cli keys foo:* | xargs /path/to/redis-cli del

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

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

<?php

$redis = new Redis();
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);

$match = 'foo:*';
$count = 10000;

while ($keys = $redis->scan($it, $match, $count)) {
    $redis->del($keys);
}

?>

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

shell> watch -d -n 1 '/path/to/redis-cli info | grep memory'

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

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. redis源代码分析 - persistence (累计阅读 32,228)
  2. Java开发岗位面试题归类汇总 (累计阅读 22,155)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  4. Redis消息队列的若干实现方式 (累计阅读 12,085)
  5. Linux Used内存到底哪里去了? (累计阅读 11,866)
  6. 基于Redis构建系统的经验和教训 (累计阅读 10,521)
  7. Linux操作系统的内存使用方法详细解析 (累计阅读 10,148)
  8. 几个内存相关面试题(c/c++) (累计阅读 9,443)
  9. 浅谈redis数据库的键值设计 (累计阅读 9,354)
  10. 【2014年版】异地购房提取北京公积金 (累计阅读 9,148)