RedisFullCheck 开发者指南:如何扩展与定制数据验证逻辑
RedisFullCheck 开发者指南:如何扩展与定制数据验证逻辑
【免费下载链接】RedisFullCheckredis-full-check is used to compare whether two redis have the same data. Support redis version from 2.x to 7.x (Don't support Redis Modules).项目地址: https://gitcode.com/gh_mirrors/re/RedisFullCheck
RedisFullCheck 是一款强大的 Redis 数据一致性校验工具,支持从 Redis 2.x 到 7.x 版本的数据比对。对于开发者来说,了解其架构和扩展机制至关重要。本文将详细介绍如何扩展和定制 RedisFullCheck 的数据验证逻辑,帮助您根据特定需求调整验证策略。😊
🔧 项目架构概览
RedisFullCheck 采用模块化设计,核心验证逻辑位于 src/full_check/checker/ 目录。项目的主要架构包括:
- 验证器接口-
IVerifier定义了统一的验证接口 - 验证器实现- 三种不同的验证策略
- 配置系统- 通过命令行参数控制验证行为
- 数据流管理- 多轮迭代的数据比对机制
RedisFullCheck 数据流架构示意图
🎯 验证器扩展机制
1. 验证器接口设计
在 src/full_check/checker/base.go 中,IVerifier接口定义了验证器的基本契约:
type IVerifier interface { VerifyOneGroupKeyInfo(keyInfo []*common.Key, conflictKey chan<- *common.Key, sourceClient *client.RedisClient, targetClient *client.RedisClient) }2. 现有验证器类型
RedisFullCheck 内置了三种验证器,对应不同的比对模式:
| 验证器类型 | 对应模式 | 功能描述 |
|---|---|---|
FullValueVerifier | 模式1 | 完整值比对,最精确但性能开销大 |
ValueOutlineVerifier | 模式2 | 仅比对值长度,性能与精度平衡 |
KeyOutlineVerifier | 模式3 | 仅比对键存在性,性能最优 |
3. 验证器选择逻辑
在 src/full_check/full_check/full_check.go 中,NewFullCheck函数根据CompareMode参数选择验证器:
switch checktype { case ValueLengthOutline: verifier = checker.NewValueOutlineVerifier(&fullcheck.stat, &fullcheck.FullCheckParameter) case KeyOutline: verifier = checker.NewKeyOutlineVerifier(&fullcheck.stat, &fullCheckParameter) case FullValue: verifier = checker.NewFullValueVerifier(&fullcheck.stat, &fullCheckParameter, false) case FullValueWithOutline: verifier = checker.NewFullValueVerifier(&fullcheck.stat, &fullCheckParameter, true) }🛠️ 如何自定义验证器
步骤1:创建新的验证器实现
创建一个新的 Go 文件,例如custom_verifier.go,实现IVerifier接口:
package checker import ( "full_check/common" "full_check/metric" "full_check/client" ) type CustomVerifier struct { VerifierBase // 添加自定义字段 CustomThreshold int64 } func NewCustomVerifier(stat *metric.Stat, param *FullCheckParameter, threshold int64) *CustomVerifier { return &CustomVerifier{ VerifierBase: VerifierBase{stat, param}, CustomThreshold: threshold, } } func (p *CustomVerifier) VerifyOneGroupKeyInfo(keyInfo []*common.Key, conflictKey chan<- *common.Key, sourceClient *client.RedisClient, targetClient *client.RedisClient) { // 实现自定义验证逻辑 // 1. 获取键类型和长度 // 2. 应用自定义验证规则 // 3. 检测冲突并发送到 channel }步骤2:扩展配置参数
在 src/full_check/configure/conf.go 中添加自定义参数:
var Opts struct { // ... 现有参数 ... CustomThreshold int64 `long:"customthreshold" default:"1000" description:"自定义验证阈值"` CustomMode int `long:"custommode" default:"5" description:"自定义验证模式"` }步骤3:集成到主流程
修改 src/full_check/full_check/full_check.go 中的NewFullCheck函数:
func NewFullCheck(f checker.FullCheckParameter, checktype CheckType) *FullCheck { var verifier checker.IVerifier // ... 现有逻辑 ... switch checktype { case 5: // 自定义模式 verifier = checker.NewCustomVerifier(&fullcheck.stat, &fullcheck.FullCheckParameter, conf.Opts.CustomThreshold) // ... 其他模式 ... } }🔍 验证器核心组件分析
1. 键类型系统
在 src/full_check/common/keytype.go 中定义了 Redis 键类型的枚举和映射:
type KeyType struct { Name string // 类型名称 Index KeyTypeIndex // 类型索引 FetchLenCommand string // 获取长度的命令 }2. 冲突类型定义
RedisFullCheck 支持多种冲突类型检测:
- 类型冲突- 源端和目标端键类型不一致
- 值冲突- 键值内容不一致
- 缺失冲突- 源端或目标端缺少键
- 长度冲突- 值长度不一致
3. 验证流程控制
验证器的核心工作流程:
- 获取键信息- 通过
FetchTypeAndLen方法 - TTL 重新检查- 通过
RecheckTTL方法 - 冲突检测- 应用特定验证规则
- 结果记录- 通过
IncrKeyStat和IncrFieldStat
📊 性能优化技巧
1. 批量处理优化
在 src/full_check/full_check/full_check.go 中,通过BatchCount参数控制批量大小:
BatchCount: batchCount, // 每批比较的键/字段数量 Parallel: parallel, // 并发 goroutine 数量2. 大键特殊处理
FullValueVerifier支持大键阈值配置:
if p.ignoreBigKey { // 如果启用忽略大键开关,则仅比较长度 if keyInfo[i].SourceAttr.ItemCount != keyInfo[i].TargetAttr.ItemCount { keyInfo[i].ConflictType = common.ValueConflict p.IncrKeyStat(keyInfo[i]) conflictKey <- keyInfo[i] } }3. 管道化操作
验证器使用 Redis 管道命令提高性能:
sourceKeyTypeStr, err := sourceClient.PipeTypeCommand(keyInfo) sourceKeyLen, err := sourceClient.PipeLenCommand(keyInfo)🧪 测试自定义验证器
1. 单元测试
为自定义验证器创建测试文件:
func TestCustomVerifier(t *testing.T) { // 模拟 Redis 客户端 // 创建测试数据 // 执行验证逻辑 // 验证结果 }2. 集成测试
使用真实的 Redis 实例进行端到端测试:
# 构建项目 ./build.sh # 运行自定义验证器 ./bin/redis-full-check -s source:6379 -t target:6379 -m 5 --customthreshold=50003. 性能基准测试
对比不同验证器的性能表现:
func BenchmarkCustomVerifier(b *testing.B) { for i := 0; i < b.N; i++ { // 执行验证逻辑 } }📈 监控与指标
1. 统计信息收集
验证器通过metric.Stat结构收集统计信息:
type Stat struct { Scan *Counter ConflictKey [EndKeyTypeIndex][EndConflict]*Counter ConflictField [EndKeyTypeIndex][EndConflict]*Counter }2. 指标输出
在 src/full_check/metric/metric.go 中定义指标格式:
type Metric struct { CompareTimes int Db int32 DbKeys int64 Process int64 OneCompareFinished bool AllFinished bool Timestamp int64 DateTime string }🔄 多轮验证机制
RedisFullCheck 采用迭代式验证策略:
- 第一轮- 比对所有键
- 后续轮次- 仅比对前一轮发现的差异
- 收敛过程- 差异逐渐减少直至稳定
这种机制在 src/full_check/full_check/full_check.go 的Start方法中实现。
🚀 最佳实践建议
1. 验证器选择策略
| 使用场景 | 推荐验证器 | 理由 |
|---|---|---|
| 数据迁移验证 | FullValueVerifier | 确保数据完全一致 |
| 日常巡检 | ValueOutlineVerifier | 平衡性能与准确性 |
| 快速健康检查 | KeyOutlineVerifier | 最快速度检测键缺失 |
| 自定义业务规则 | 自定义验证器 | 满足特定业务需求 |
2. 参数调优指南
- BatchCount- 根据网络延迟调整,默认 256
- Parallel- 根据 CPU 核心数调整,默认 5
- CompareTimes- 根据数据量调整,默认 3 轮
- Qps- 根据 Redis 性能调整,默认 15000
3. 扩展性考虑
设计自定义验证器时考虑:
- 向后兼容- 保持与现有接口的兼容性
- 配置驱动- 通过命令行参数控制行为
- 性能监控- 集成到现有的指标系统中
- 错误处理- 健壮的错误恢复机制
📝 总结
RedisFullCheck 提供了灵活的验证器扩展机制,开发者可以根据具体需求定制数据验证逻辑。通过理解项目的架构设计和接口规范,您可以轻松创建满足特定业务需求的验证器。无论是优化性能、添加新的验证规则,还是集成到现有的监控系统中,RedisFullCheck 都提供了完善的扩展点。
记住,良好的验证器设计应该遵循单一职责原则,保持代码简洁,并充分利用现有的基础设施。通过合理的扩展,RedisFullCheck 可以成为您 Redis 数据一致性保障的强大工具!🎯
关键文件路径参考:
- 验证器接口:src/full_check/checker/base.go
- 完整值验证器:src/full_check/checker/full_value_verifier.go
- 值轮廓验证器:src/full_check/checker/value_outline_verifier.go
- 键轮廓验证器:src/full_check/checker/key_outline_verifier.go
- 主配置:src/full_check/configure/conf.go
- 主逻辑:src/full_check/full_check/full_check.go
【免费下载链接】RedisFullCheckredis-full-check is used to compare whether two redis have the same data. Support redis version from 2.x to 7.x (Don't support Redis Modules).项目地址: https://gitcode.com/gh_mirrors/re/RedisFullCheck
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考