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

如何统计Redis中各种数据的大小

火丁笔记 2015-03-26 13:32:09 累计浏览 2,780 次
本机暂存

   如果 MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间;不过如果 Redis 内存比较大的话,我们就不太容易查出是哪些(种)键占用的空间了。

   有一些工具能够提供必要的帮助,比如 redis-rdb-tools 可以直接分析 RDB 文件来生成报告,可惜它不能百分百实现我的需求,而我也不想在它的基础上二次开发。实际上开发一个专用工具非常简单,利用 SCANDEBUG 等命令,没多少行代码就能实现:

<?php

$patterns = array(
    'foo:.+',
    'bar:.+',
    '.+',
);

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

$result = array_fill_keys($patterns, 0);

while ($keys = $redis->scan($it, $match = '*', $count = 1000)) {
    foreach ($keys as $key) {
        foreach ($patterns as $pattern) {
            if (preg_match("/^{$pattern}$/", $key)) {
                if ($v = $redis->debug($key)) {
                    $result[$pattern] += $v['serializedlength'];
                }

                break;
            }
        }
    }
}

var_dump($result);

?>

   当然,前提是你需要提前总结出可能的键模式,简单但不严谨的方法是 MONITOR

shell> /path/to/redis-cli monitor |
       awk -F '"' '$2 ~ "ADD|SET|STORE|PUSH" {print $4}'

   此外,需要注意的是:因为 DEBUG 返回的 serializedlength 是序列化后的长度,所以最终计算的值小于实际内存占用,但考虑到相对大小依然是有参考意义的。

同分类推荐文章

  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. Mysql监控指南 (累计阅读 21,350)
  4. hbase运维 (累计阅读 14,921)
  5. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  6. Redis消息队列的若干实现方式 (累计阅读 12,085)
  7. Linux Used内存到底哪里去了? (累计阅读 11,865)
  8. 基于Redis构建系统的经验和教训 (累计阅读 10,519)
  9. Linux操作系统的内存使用方法详细解析 (累计阅读 10,148)
  10. 几个内存相关面试题(c/c++) (累计阅读 9,442)