HelloGitHub icon indicating copy to clipboard operation
HelloGitHub copied to clipboard

【自荐项目】RDB: go 语言实现的 Redis RDB 文件解析和生成工具

Open HDT3213 opened this issue 2 years ago • 1 comments

推荐项目

  • 类别:Go
  • 项目标题:go 语言实现的 Redis RDB 文件解析和生成工具
  • 项目描述:可用于 RDB 文件的编解码。支持 RDB 转 JSON、RDB 转 AOF、寻找 Big Key、生成 RDB 文件及绘制内存火焰图等功能。可用于对生产环境 Redis 内存使用情况进行分析优化,或者为需要读写 RDB 格式的各类项目提供支持。
  • 亮点:

    • 生产环境中很多时候并不是少量的 Big Key 占据了大部分内存,而是数量巨大的小键值对消耗了最多内存。rdb 工具支持绘制内存火焰图,用以直观展现各业务模块的内存使用量,帮助优化缓存策略以节约内存资源。
    • 支持生成 RDB 文件
    • 提供编解码 API 可以自定义用途
    • 支持 RDB Version 9, 目前广泛使用的 redis-rdb-tools 仅支持到 RDB Version 8
    • 直接下载单个二进制文件即可使用
    • 附带详尽的 RDB 文件格式说明文档
  • 示例代码:(可选)

使用解码器 API 自定义用途

rdbFile, err := os.Open("dump.rdb")
if err != nil {
	panic("open dump.rdb failed")
}
defer func() {
	_ = rdbFile.Close()
}()
decoder := parser.NewDecoder(rdbFile)
err = decoder.Parse(func(o parser.RedisObject) bool {
	switch o.GetType() {
	case parser.StringType:
		str := o.(*parser.StringObject)
		println(str.Key, str.Value)
	case parser.ListType:
		list := o.(*parser.ListObject)
		println(list.Key, list.Values)
	case parser.HashType:
		hash := o.(*parser.HashObject)
		println(hash.Key, hash.Hash)
	case parser.ZSetType:
		zset := o.(*parser.ZSetObject)
		println(zset.Key, zset.Entries)
	}
	// return true to continue, return false to stop the iteration
	return true
})
if err != nil {
	panic(err)
}
  • 截图:

很多企业要求使用 Redis key 采用类似于 业务模块:业务逻辑含义:{id} 的命名规范,所以我们可以使用分隔符将 key 拆分成多层并将拥有相同前缀的 key 聚合在一起。

最后我们将聚合的结果以火焰图的方式呈现可以直观地看出哪类键值对消耗内存过多,进而优化缓存和逐出策略节约内存开销。

在上图示例中,Comment:* 模式的键值对消耗了 8.463% 内存.

  • 后续更新计划:
    1. 支持并行解析
    2. 支持最新的 RDB Version 10

HDT3213 avatar May 28 '22 14:05 HDT3213

已支持 RDB Version 10 解析

HDT3213 avatar Oct 02 '22 09:10 HDT3213

rdb 10有报错呢。

tanjiaxi avatar Jan 17 '24 00:01 tanjiaxi

rdb 10有报错呢。

@tanjiaxi 去我的库里提 issue 吧,麻烦提供一下复现方法

HDT3213 avatar Jan 17 '24 01:01 HDT3213