关系缓存创建时机.md 7.0 KB

URS推广模块关系缓存创建时机详解

1. 概述

URS推广模块的关系缓存系统现已支持20代推荐关系的预计算和存储。本文档详细说明关系缓存的创建时机、触发条件和维护机制。

2. 关系缓存创建时机

2.1 自动创建时机

2.1.1 推荐关系建立时

触发位置: UrsReferralService::createReferral() 触发条件: 新用户建立推荐关系时 创建范围: 为新用户创建完整的20代上级关系缓存

// 在推荐关系创建成功后自动触发
DB::commit();

// 生成关系缓存
$relationCacheLogic = new UrsRelationCacheLogic();
$relationCacheLogic->generateUserRelationCache($ursUserId);

创建逻辑:

  1. 创建与直接推荐人的1级关系缓存
  2. 获取推荐人的所有上级关系(最多19级)
  3. 为每个上级创建间接关系缓存(2-20级)
  4. 确保总深度不超过20代

2.1.2 用户进入农场时

触发位置: UrsUserMappingService::createMapping() 触发条件: URS用户首次进入农场建立映射关系时 更新范围: 更新相关缓存记录中的农场用户ID字段

// 用户进入农场后更新缓存中的农场用户ID
$relationCacheLogic = new UrsRelationCacheLogic();
$relationCacheLogic->updateFarmUserIdInCache($ursUserId, $farmUserId);

2.2 手动创建时机

2.2.1 命令行重建

# 重建所有用户的关系缓存
php artisan urs:rebuild-relation-cache

# 检查缓存完整性
php artisan urs:rebuild-relation-cache --check

# 修复缓存问题
php artisan urs:rebuild-relation-cache --fix

2.2.2 后台管理界面

  • 访问路径: /admin/urs-promotion/user-relation-cache
  • 功能: 重建缓存、检查完整性、查看缓存数据

2.2.3 测试工具

# 为特定用户生成缓存
php artisan urs:test-relation-cache generate --user-id=10016

# 批量生成缓存
php artisan urs:test-relation-cache batch --users=10016,10015,10014

3. 20代关系缓存详解

3.1 层级定义

  • 第1代: 直推关系 (level=1, depth=1)
  • 第2-20代: 间推关系 (level=2, depth=2-20)

3.2 缓存数据结构

-- 示例:用户A的20代关系缓存
user_id | related_user_id | urs_user_id | urs_related_user_id | level | depth | path | urs_path
--------|-----------------|-------------|---------------------|-------|-------|------|----------
2001    | 2002           | 1001        | 1002                | 1     | 1     | 2002 | 1002
2001    | 2003           | 1001        | 1003                | 2     | 2     | 2002,2003 | 1002,1003
2001    | 2004           | 1001        | 1004                | 2     | 3     | 2002,2003,2004 | 1002,1003,1004
...     | ...            | ...         | ...                 | 2     | 20    | 2002,...,2021 | 1002,...,1021

3.3 性能优化

  • 查询复杂度: O(1) - 单次查询获取所有上级
  • 存储空间: 每个用户最多20条缓存记录
  • 更新效率: 增量更新,只影响相关用户

4. 缓存生成算法

4.1 核心算法

public function generateUserRelationCache(int $ursUserId): bool
{
    // 1. 清除现有缓存
    $this->clearUserRelationCache($ursUserId);
    
    // 2. 获取直接推荐人
    $referral = UrsUserReferral::where('urs_user_id', $ursUserId)->first();
    if (!$referral) return true;
    
    // 3. 创建1级关系缓存
    $this->createDirectRelationCache($ursUserId, $referral);
    
    // 4. 获取推荐人的所有上级(最多19级)
    $upperRelations = UrsUserRelationCache::where('urs_user_id', $ursReferrerId)
        ->where('depth', '<', 20)
        ->get();
    
    // 5. 创建2-20级间接关系缓存
    foreach ($upperRelations as $upperRelation) {
        $newDepth = $upperRelation->depth + 1;
        if ($newDepth <= 20) {
            $this->createIndirectRelationCache($ursUserId, $upperRelation, $newDepth);
        }
    }
    
    return true;
}

4.2 深度限制机制

  • 最大深度: 20代
  • 深度检查: 每次创建缓存时检查深度限制
  • 路径记录: 完整记录从当前用户到顶级推荐人的路径

5. 缓存维护策略

5.1 自动维护

  • 推荐关系变更: 自动重新生成相关缓存
  • 用户状态变更: 自动更新缓存中的状态字段
  • 数据一致性: 定期检查和修复不一致的缓存

5.2 完整性检查

// 检查项目
- 缺失缓存的用户数量
- 孤立缓存记录数量
- 循环推荐关系数量
- 深度超限的缓存记录

5.3 故障恢复

  • 缓存损坏: 自动重建损坏的缓存
  • 查询失败: 降级到递归查询
  • 数据不一致: 提供修复工具

6. 使用场景

6.1 收益分发

// 优化后的收益分发查询
$relations = UrsUserRelationCache::where('user_id', $userId)
    ->where('depth', '<=', 20)
    ->orderBy('depth')
    ->get();

foreach ($relations as $relation) {
    // 为每一级推荐人分发收益
    $this->distributeProfit($relation->related_user_id, $relation->depth);
}

6.2 团队统计

// 快速统计团队规模
$teamStats = UrsUserRelationCache::where('related_user_id', $userId)
    ->selectRaw('depth, count(*) as count')
    ->groupBy('depth')
    ->get();

6.3 关系查询

// 查询用户的所有下级(按代数分组)
$downlines = UrsUserRelationCache::where('related_user_id', $userId)
    ->where('depth', '<=', 20)
    ->get()
    ->groupBy('depth');

7. 监控和告警

7.1 性能监控

  • 缓存命中率: 监控从缓存查询的成功率
  • 查询响应时间: 监控关系查询的性能
  • 缓存生成时间: 监控缓存生成的耗时

7.2 数据监控

  • 缓存完整性: 定期检查缓存数据的完整性
  • 深度分布: 监控各代数的用户分布情况
  • 存储使用: 监控缓存表的存储空间使用

7.3 告警机制

  • 缓存缺失: 当缓存缺失率超过阈值时告警
  • 深度异常: 当出现超过20代的关系时告警
  • 性能下降: 当查询性能下降时告警

8. 最佳实践

8.1 缓存生成

  • 批量处理: 使用批量生成提高效率
  • 增量更新: 只更新变更的部分
  • 错误处理: 妥善处理生成过程中的异常

8.2 查询优化

  • 索引使用: 合理使用数据库索引
  • 查询限制: 适当限制查询的深度范围
  • 结果缓存: 对频繁查询的结果进行缓存

8.3 维护管理

  • 定期检查: 定期执行完整性检查
  • 及时修复: 发现问题及时修复
  • 备份恢复: 定期备份重要的缓存数据

9. 注意事项

9.1 数据一致性

  • 确保缓存数据与推荐关系表保持一致
  • 推荐关系变更时及时更新缓存
  • 定期执行完整性检查和修复

9.2 性能考虑

  • 20代关系会增加存储空间需求
  • 缓存生成时间会随着代数增加而延长
  • 需要合理平衡存储空间和查询性能

9.3 业务逻辑

  • 确保20代关系符合业务规则
  • 避免过深的推荐关系影响系统性能
  • 合理设置收益分发的代数限制