|
|
@@ -0,0 +1,233 @@
|
|
|
+# URS推广模块关系缓存创建时机详解
|
|
|
+
|
|
|
+## 1. 概述
|
|
|
+
|
|
|
+URS推广模块的关系缓存系统现已支持20代推荐关系的预计算和存储。本文档详细说明关系缓存的创建时机、触发条件和维护机制。
|
|
|
+
|
|
|
+## 2. 关系缓存创建时机
|
|
|
+
|
|
|
+### 2.1 自动创建时机
|
|
|
+
|
|
|
+#### 2.1.1 推荐关系建立时
|
|
|
+**触发位置**: `UrsReferralService::createReferral()`
|
|
|
+**触发条件**: 新用户建立推荐关系时
|
|
|
+**创建范围**: 为新用户创建完整的20代上级关系缓存
|
|
|
+
|
|
|
+```php
|
|
|
+// 在推荐关系创建成功后自动触发
|
|
|
+DB::commit();
|
|
|
+
|
|
|
+// 生成关系缓存
|
|
|
+$relationCacheLogic = new UrsRelationCacheLogic();
|
|
|
+$relationCacheLogic->generateUserRelationCache($ursUserId);
|
|
|
+```
|
|
|
+
|
|
|
+**创建逻辑**:
|
|
|
+1. 创建与直接推荐人的1级关系缓存
|
|
|
+2. 获取推荐人的所有上级关系(最多19级)
|
|
|
+3. 为每个上级创建间接关系缓存(2-20级)
|
|
|
+4. 确保总深度不超过20代
|
|
|
+
|
|
|
+#### 2.1.2 用户进入农场时
|
|
|
+**触发位置**: `UrsUserMappingService::createMapping()`
|
|
|
+**触发条件**: URS用户首次进入农场建立映射关系时
|
|
|
+**更新范围**: 更新相关缓存记录中的农场用户ID字段
|
|
|
+
|
|
|
+```php
|
|
|
+// 用户进入农场后更新缓存中的农场用户ID
|
|
|
+$relationCacheLogic = new UrsRelationCacheLogic();
|
|
|
+$relationCacheLogic->updateFarmUserIdInCache($ursUserId, $farmUserId);
|
|
|
+```
|
|
|
+
|
|
|
+### 2.2 手动创建时机
|
|
|
+
|
|
|
+#### 2.2.1 命令行重建
|
|
|
+```bash
|
|
|
+# 重建所有用户的关系缓存
|
|
|
+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 测试工具
|
|
|
+```bash
|
|
|
+# 为特定用户生成缓存
|
|
|
+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 缓存数据结构
|
|
|
+```sql
|
|
|
+-- 示例:用户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 核心算法
|
|
|
+```php
|
|
|
+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 完整性检查
|
|
|
+```php
|
|
|
+// 检查项目
|
|
|
+- 缺失缓存的用户数量
|
|
|
+- 孤立缓存记录数量
|
|
|
+- 循环推荐关系数量
|
|
|
+- 深度超限的缓存记录
|
|
|
+```
|
|
|
+
|
|
|
+### 5.3 故障恢复
|
|
|
+- **缓存损坏**: 自动重建损坏的缓存
|
|
|
+- **查询失败**: 降级到递归查询
|
|
|
+- **数据不一致**: 提供修复工具
|
|
|
+
|
|
|
+## 6. 使用场景
|
|
|
+
|
|
|
+### 6.1 收益分发
|
|
|
+```php
|
|
|
+// 优化后的收益分发查询
|
|
|
+$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 团队统计
|
|
|
+```php
|
|
|
+// 快速统计团队规模
|
|
|
+$teamStats = UrsUserRelationCache::where('related_user_id', $userId)
|
|
|
+ ->selectRaw('depth, count(*) as count')
|
|
|
+ ->groupBy('depth')
|
|
|
+ ->get();
|
|
|
+```
|
|
|
+
|
|
|
+### 6.3 关系查询
|
|
|
+```php
|
|
|
+// 查询用户的所有下级(按代数分组)
|
|
|
+$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代关系符合业务规则
|
|
|
+- 避免过深的推荐关系影响系统性能
|
|
|
+- 合理设置收益分发的代数限制
|