#redis #key #statistics #pattern #memory #keyspace

app redis-keyspace-stats

分析您的Redis键空间并返回其统计信息

9个不稳定版本

0.5.4 2023年4月21日
0.5.3 2023年4月21日
0.5.2 2022年9月30日
0.5.1 2021年7月6日
0.1.0 2020年12月8日

数据库接口中排名174

MIT许可证

43KB
800

redis-keyspace-stats

此程序分析您的Redis键空间并返回其统计信息。它具有一定的灵活性。通常,您会提供glob风格的模式,将键分组到不同的类别中。

此工具处于开发中,一些显然有用的功能尚未实现。

采样模式

  • ✅  随机采样
  • 🚧  随机采样匹配模式的键
  • ✅  扫描所有键
  • 🚧  扫描匹配模式的所有键

统计信息

  • ✅  内存:总大小,总估计大小,50/90/99分位数
  • ✅  TTL:有TTL的百分比,50/90/99分位数
  • ✅  数据类型分解

输出格式

  • ✅  到STDOUT的摘要美观打印表格
  • 🚧  摘要CSV/TSV
  • 🚧  摘要HTML
  • 🚧  原始数据CSV/TSV

Redis支持

  • ✅  通过TLS (rediss://连接字符串)
  • ✅  逻辑数据库,指定在连接字符串中 (redis://host:port/db)
  • 🚧  集群

⚠️ 警告

  • 这不是(尚未)生产级软件。使用风险自负。
  • Redis是单线程的,因此在忙碌的生产系统上运行时要小心。此工具以批处理形式向Redis发送命令(并在它们之间暂停),以减少其影响,但仍需谨慎。在运行更全面的分析之前,从默认的-n 100小样本量开始。
  • 小心使用--sample=all模式;-n选项将被忽略,并且所有键都将使用SCAN枚举
  • 此工具提取密钥,并在其输出中包含其中一些。虽然很少将敏感信息存储在Redis密钥中,但仍有必要注意。值永远不会被检索或包含在任何输出中。
  • 随着更多采样模式和其它功能的添加,CLI的标志/选项/组织等将发生变化

安装

目前,此工具没有发布二进制文件。

  1. 请确保已安装Rust,或通过rustup获取
  2. 运行cargo install redis-keyspace-stats来下载和编译二进制文件

使用示例

使用-h(或更详尽的--help)调用CLI将打印文档

$ redis-keyspace-stats -h
Usage: redis-keyspace-stats [OPTIONS] [PATTERNS]...

Arguments:
  [PATTERNS]...  Glob-style patterns to group keys together

Options:
      --sample <SAMPLE_MODE>             [default: random] [possible values: all, random]
  -n, --samples <N_SAMPLES>              Ignored when --sample=all is specified [default: 100]
      --batch-size <BATCH_SIZE>          [default: 100]
      --batch-sleep-ms <BATCH_SLEEP_MS>  [default: 100]
      --stats <STATS>                    [default: memory,ttl] [possible values: memory, ttl, type]
  -o, --out <OUTPUT_MODE>                [default: table] [possible values: table]
      --url <URL>                        [default: redis://127.0.0.1]
  -h, --help                             Print help
  -V, --version                          Print version

让我们获取一些快速内存+ TTL统计信息,采样50个密钥

$ redis-keyspace-stats --url $REDIS_URL -n 50
Sampled 50 of 128 keys in db0
┌─────────┬────────────────┬────────────────────┬────────────────────────┬─────────────────┐
 Pattern │ Keys           │ Example keys       │ Memory                 │ TTL             │
├─────────┼────────────────┼────────────────────┼────────────────────────┼─────────────────┤
 *       │ 50 counted     │ company:121#memes  │ 360.77 kB (sum)         54.00% have TTL │
         │ 128 est. total │ user:79#memes      │ 923.57 kB (est. total)  2m 47s (p50)    
         │                │ user:8#memes       │ 7.75 kB (p50)           3m 57s (p90)    
         │                │ user:92#friends    │ 11.9 kB (p90)           4m 13s (p99)    
         │                │ company:84#friends │ 12.87 kB (p99)         
└─────────┴────────────────┴────────────────────┴────────────────────────┴─────────────────┘

使用“示例密钥”列中显示的内容,让我们编写一些glob-style模式来对密钥进行分组

$ redis-keyspace-stats --url $REDIS_URL -n 50 'user:*#messages' 'user:?#*' 'company:*'
Sampled 50 of 128 keys in db0
┌─────────────────┬───────────────┬────────────────────┬────────────────────────┬──────────────────┐
 Pattern         │ Keys          │ Example keys       │ Memory                 │ TTL              │
├─────────────────┼───────────────┼────────────────────┼────────────────────────┼──────────────────┤
 user:*#messages │ 8 counted     │ user:27#messages   │ 30.27 kB (sum)          37.50% have TTL  │
                 │ 20 est. total │ user:34#messages   │ 77.5 kB (est. total)    1m 30s (p50)     
                 │               │ user:13#messages   │ 3.4 kB (p50)            3m 25s (p90)     
                 │               │ user:58#messages   │ 6.22 kB (p90)           3m 51s (p99)     
                 │               │ user:60#messages   │ 6.22 kB (p99)          
├─────────────────┼───────────────┼────────────────────┼────────────────────────┼──────────────────┤
 user:?#*        │ 2 counted     │ user:3#friends     │ 1.25 kB (sum)           100.00% have TTL │
                 │ 5 est. total  │ user:8#memes       │ 3.19 kB (est. total)    1m 52s (p50)     
                 │               │                    │ 624 B (p50)             2m 39s (p90)     
                 │               │                    │ 822.4 B (p90)           2m 50s (p99)     
                 │               │                    │ 867.04 B (p99)         
├─────────────────┼───────────────┼────────────────────┼────────────────────────┼──────────────────┤
 company:*       │ 24 counted    │ company:1#messages │ 162.13 kB (sum)         45.83% have TTL  │
                 │ 61 est. total │ company:75#memes   │ 415.05 kB (est. total)  2m 51s (p50)     
                 │               │ company:10#friends │ 7.24 kB (p50)           3m 58s (p90)     
                 │               │ company:69#memes   │ 11.85 kB (p90)          4m 2s (p99)      
                 │               │ company:6#memes    │ 12.64 kB (p99)         
├─────────────────┼───────────────┼────────────────────┼────────────────────────┼──────────────────┤
 *               │ 16 counted    │ user:123#memes     │ 149.02 kB (sum)         31.25% have TTL  │
                 │ 41 est. total │ user:71#friends    │ 381.5 kB (est. total)   2m 10s (p50)     
                 │               │ user:25#friends    │ 10.05 kB (p50)          2m 59s (p90)     
                 │               │ user:86#memes      │ 12.86 kB (p90)          3m 4s (p99)      
                 │               │ user:110#friends   │ 13.29 kB (p99)         
└─────────────────┴───────────────┴────────────────────┴────────────────────────┴──────────────────┘

请注意,第一个匹配密钥的模式将决定分组。

开发

本地测试

  • 通过环境变量设置一些虚假测试数据:RKS_SEED_FAKE_DATA=true cargo run -- --sample=all 'company:*'
  • 启动redis-cli二进制文件并运行monitor对调试很有用

发布

  1. Cargo.toml中提高version
  2. 运行cargo test
  3. 提交,为发布添加git标签,并推送
  4. 运行cargo publish

依赖关系

~15–26MB
~476K SLoC