05日0300-改进URS关系缓存重建命令支持指定用户处理.md 4.3 KB

改进URS关系缓存重建命令支持指定用户处理

任务时间

  • 开始时间:2025年07月05日 03:00:04 CST
  • 完成时间:2025年07月05日 03:30:00 CST

任务背景

用户反馈URS推荐系统中的缓存生成存在逻辑bug,缓存不应该基于缓存生成,要从关系表中读取数据。同时需要改进UrsRebuildRelationCacheCommand命令,支持指定用户处理功能。

问题分析

  1. 缓存生成逻辑错误:原逻辑中存在基于现有缓存生成新缓存的问题,导致循环依赖
  2. 路径链不完整:用户44578有多级推荐关系,但缓存只生成了部分级别
  3. 缺少指定用户处理功能:命令只能全量重建,无法针对特定用户操作

解决方案

1. 新增指定用户处理功能

UrsRebuildRelationCacheCommand中添加以下参数:

  • --user= : 指定单个URS用户ID
  • --users= : 指定多个URS用户ID(逗号分隔)
  • --clear : 清除指定用户的缓存

2. 修复缓存生成逻辑

  • 移除generateIndirectRelationsFromExistingCache方法
  • 修改generateIndirectRelationsFromUrsChain方法,完全基于URS推荐关系表生成缓存
  • 修复路径链构建逻辑,确保完整的路径链传递

3. 完善命令功能

  • 添加用户ID验证
  • 改进错误处理和用户反馈
  • 添加进度条显示
  • 更新命令帮助和使用示例

实现细节

命令参数扩展

protected $signature = 'urs:rebuild-relation-cache 
                        {--batch-size=100 : 批处理大小}
                        {--check : 仅检查完整性,不重建}
                        {--fix : 修复发现的问题}
                        {--user= : 指定URS用户ID,仅处理该用户}
                        {--users= : 指定多个URS用户ID,用逗号分隔}
                        {--clear : 清除指定用户的缓存(需配合--user或--users使用)}';

逻辑修复

  1. 移除错误的缓存依赖逻辑

    // 原错误逻辑(已删除)
    $upperRelations = UrsUserRelationCache::where('urs_user_id', $ursReferrerId)->get();
       
    // 修复后的逻辑
    $this->generateIndirectRelationsFromUrsChain($ursUserId, $farmUserId, $ursReferrerId, 1);
    
  2. 修复路径链构建

    // 构建完整的路径链
    $newUrsPath = empty($currentUrsPath) ? (string)$upperUrsReferrerId : $currentUrsPath . ',' . $upperUrsReferrerId;
    $newFarmPath = empty($currentFarmPath) ? $upperFarmPart : $currentFarmPath . ',' . $upperFarmPart;
    

测试验证

测试用例:用户44578

推荐关系链:44578 -> 44572 -> 10387 -> 10002 -> 1

修复前:只有1级缓存

Depth 1: related_urs_id=44572, path=44572

修复后:完整的4级缓存

Depth 1: related_urs_id=44572, urs_path=44572, farm_path=40124
Depth 2: related_urs_id=10387, urs_path=44572,10387, farm_path=40124,39172
Depth 3: related_urs_id=10002, urs_path=44572,10387,10002, farm_path=40124,39172,39186
Depth 4: related_urs_id=1, urs_path=44572,10387,10002,1, farm_path=40124,39172,39186,0

命令测试

# 指定单个用户
php artisan urs:rebuild-relation-cache --user=44578

# 指定多个用户
php artisan urs:rebuild-relation-cache --users=44578,10387

# 清除指定用户缓存
php artisan urs:rebuild-relation-cache --user=44578 --clear

# 无效用户ID处理
php artisan urs:rebuild-relation-cache --user=999999
# 输出:所有指定的用户ID都无效

代码变更

  • 修改文件:app/Module/UrsPromotion/Commands/UrsRebuildRelationCacheCommand.php
  • 修改文件:app/Module/UrsPromotion/Logics/UrsRelationCacheLogic.php
  • 新增方法:handleSpecificUsers(), getSpecifiedUserIds(), validateUserIds(), clearSpecificUsersCache(), rebuildSpecificUsersCache()
  • 删除方法:generateIndirectRelationsFromExistingCache(), buildCombinedFarmPath(), buildCombinedUrsPath(), buildFarmUserPath(), buildUrsPath()

总结

  1. 成功修复了缓存生成的逻辑bug,改为完全基于URS推荐关系表生成
  2. 新增了指定用户处理功能,提高了命令的灵活性
  3. 修复了路径链构建问题,确保缓存数据的完整性和正确性
  4. 完善了错误处理和用户体验

该改进解决了用户反馈的核心问题,提升了URS推荐系统缓存的可靠性和维护效率。