Skip to content

Commit f3b5e29

Browse files
feat:add big_key (#3210)
* feat:add big_key Co-authored-by: chejinge <[email protected]>
1 parent bc72424 commit f3b5e29

4 files changed

Lines changed: 1106 additions & 0 deletions

File tree

tools/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
add_subdirectory(./aof_to_pika)
22
add_subdirectory(./benchmark_client)
3+
add_subdirectory(./bigkey_analyzer)
34
add_subdirectory(./binlog_sender)
45
add_subdirectory(./manifest_generator)
56
add_subdirectory(./rdb_to_pika)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
set(WARNING_FLAGS "-W -Wextra -Wall -Wsign-compare \
2+
-Wno-unused-parameter -Wno-redundant-decls -Wwrite-strings \
3+
-Wpointer-arith -Wreorder -Wswitch -Wsign-promo \
4+
-Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers")
5+
6+
set(CXXFLAGS "${WARNING_FLAGS} -std=c++17 -g")
7+
8+
set(SRC_DIR .)
9+
aux_source_directory(${SRC_DIR} BASE_OBJS)
10+
11+
add_executable(bigkey_analyzer ${BASE_OBJS})
12+
13+
target_include_directories(bigkey_analyzer
14+
PRIVATE
15+
${PROJECT_SOURCE_DIR}
16+
${PROJECT_SOURCE_DIR}/src
17+
${PROJECT_SOURCE_DIR}/src/storage/include
18+
)
19+
20+
target_link_libraries(bigkey_analyzer
21+
storage
22+
pthread
23+
)
24+
25+
set_target_properties(bigkey_analyzer PROPERTIES
26+
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
27+
CMAKE_COMPILER_IS_GNUCXX TRUE
28+
COMPILE_FLAGS ${CXXFLAGS}
29+
)

tools/bigkey_analyzer/README.md

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# Big Key Analyzer
2+
3+
大key分析工具,用于分析PikiwiDB实例中的大key情况。本工具适用于unstable分支新的存储结构,支持多种目录结构:
4+
- 单实例 RocksDB
5+
- 多DB实例 (db/0, db/1, db/2...)
6+
- 直接分区目录 (0/, 1/, 2/...)
7+
- **新增**: dbN/M 三层嵌套结构 (db0/0, db0/1, db1/0...)
8+
9+
## 功能特点
10+
11+
- 支持分析各种数据类型(strings, hashes, lists, sets, zsets)的大key
12+
- 可以按大小过滤key
13+
- 可以限制输出结果数量(top N)
14+
- 支持按key前缀统计
15+
- 输出结果包含key类型、大小和过期时间(TTL)
16+
- 可以将结果输出到文件
17+
18+
## 编译
19+
20+
在PikiwiDB根目录下执行:
21+
22+
```bash
23+
mkdir -p build
24+
cd build
25+
cmake ..
26+
make bigkey_analyzer
27+
```
28+
29+
编译完成后,可执行文件会生成在build目录下。
30+
31+
## 使用方法
32+
33+
```
34+
Usage: bigkey_analyzer [OPTIONS] <db_path>
35+
Options:
36+
--min-size=SIZE Only show keys larger than SIZE bytes
37+
--top=N Only show top N largest keys
38+
--prefix-stat Show statistics by key prefix
39+
--prefix-delimiter=C Character used to delimit prefix (default: ':')
40+
--type=TYPE Only analyze specific type (strings|hashes|lists|sets|zsets|all)
41+
--output=FILE Write output to file instead of stdout
42+
--help Display this help message
43+
```
44+
45+
## 示例
46+
47+
1. 分析所有大key:
48+
49+
```bash
50+
# 单实例
51+
./bigkey_analyzer /path/to/pikiwidb/data
52+
53+
# 多DB实例(db/0, db/1, db/2...)
54+
./bigkey_analyzer /path/to/pikiwidb
55+
```
56+
57+
2. 只分析大于1MB的key:
58+
59+
```bash
60+
./bigkey_analyzer --min-size=1048576 /path/to/pikiwidb/data
61+
```
62+
63+
3. 只显示前10个最大的key:
64+
65+
```bash
66+
./bigkey_analyzer --top=10 /path/to/pikiwidb/data
67+
```
68+
69+
4. 只分析hash类型的key:
70+
71+
```bash
72+
./bigkey_analyzer --type=hashes /path/to/pikiwidb/data
73+
```
74+
75+
5. 分析并按前缀统计:
76+
77+
```bash
78+
./bigkey_analyzer --prefix-stat /path/to/pikiwidb/data
79+
```
80+
81+
6. 输出结果到文件:
82+
83+
```bash
84+
./bigkey_analyzer --output=result.txt /path/to/pikiwidb/data
85+
```
86+
87+
## 输出格式
88+
89+
工具输出包括三部分:
90+
91+
1. 大key列表 - 按大小降序排列
92+
2. 按前缀统计(如果使用--prefix-stat选项)
93+
3. 总结统计信息
94+
95+
示例输出:
96+
97+
```
98+
===== Big Key Analysis =====
99+
DB Partition Type Size Key TTL
100+
db0 1 hash 1048576 user:profile:1001 -1
101+
db0 2 zset 524288 ranking:global 3600
102+
db1 0 string 262144 config:settings -1
103+
...
104+
105+
===== Key Prefix Statistics =====
106+
Prefix Count Total Size Avg Size
107+
user 100 10485760 104857.6
108+
ranking 50 2621440 52428.8
109+
config 10 524288 52428.8
110+
...
111+
112+
===== Summary =====
113+
Total keys analyzed: 160
114+
Keys by type:
115+
hash: 50 keys, 25.0 MB total, 524288.0 bytes avg
116+
zset: 30 keys, 15.0 MB total, 524288.0 bytes avg
117+
string: 80 keys, 10.0 MB total, 131072.0 bytes avg
118+
```
119+
120+
## 注意事项
121+
122+
- 工具只读取数据库,不会进行任何写操作
123+
- 大key的大小包括key和value的总大小
124+
- 已过期的key不会被包含在分析结果中

0 commit comments

Comments
 (0)