目次
1. MongoDB データベースを使用する理由
このプロジェクトに含まれるサークル(動的)機能は、ユーザーが友達のサークルにいいねやコメントをすることで、ユーザーの数が増え続けるにつれて、コメント、いいね、コレクションなどの情報も増加し続けます。これらの情報を読んで、書き込みを減らします、つまり、読み取りを増やして書き込みを減らします;コメント/いいねなどのデータが多いか少ないかは問題ではなく、影響はなく、データの価値は低いです; フォローアップには、近くの人を表示する機能も含まれ、地理的な場所の関連データも含まれます。
したがって、上記に基づいて、このプロジェクトには大量のデータの処理が含まれ、読み取りが多く、書き込みが少なく、保存されたデータの価値が低く、地理的な場所に関連するデータなども含める必要があります。そうでない場合現時点で mysql または redis を使用するのは適切ではありませんが、MongoDB データベースを使用する膨大な量のデータを効率的に処理することはできません。
2.運命は親友
要件: 最高の運命値に従って親友を照会し、関連情報を返す
一連の考え
ステップ 1: トークン インターセプターを介してトークンを解析し、ユーザー ID を取得します。
@Service
public class TanhuaService {
@DubboReference
private RecommendUserApi recommendUserApi ;
@DubboReference
private UserInfoApi userInfoApi ;
//查询今日佳友数据
public TodayBest todayBest() {
//1、获取用户id
Long userId = UserHeader.getUserId();
//2、调用API查询
RecommendUser recommendUser = recommendUserApi.queryWithMaxScore(userId);
if (recommendUser == null){
//没有好友,直接推荐一个用户为1的好友
recommendUser = new RecommendUser();
recommendUser.setUserId(1l);
recommendUser.setScore(99d);
}
//3、将RecommendUser转化为TodayBest对象
//查询出指定的用户对象
UserInfo userInfo = userInfoApi.getById(recommendUser.getUserId());
//数据封装
TodayBest vo = TodayBest.init(userInfo,recommendUser);
//4、返回
return vo ;
}
ステップ 2: ユーザー ID に従って推奨フレンド テーブルをクエリし、取得した推奨フレンド リストを宿命値に従って逆順に並べ替え、運命値が最も高いデータを今日のベスト フレンド レコメンデーションとして取得します。
注: MongoDB データベースを使用してデータを操作します
@DubboService
public class RecommendUserApiImpl implements RecommendUserApi {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 根据用户id查询最佳好友
* @param toUserId
* @return
*/
@Override
public RecommendUser queryWithMaxScore(Long toUserId) {
//根据toUserId查询,根据评分score排序,获取第一条
//构建Criteria
Criteria criteria = Criteria.where("toUserId").is(toUserId);
//构建Query对象
Query query = new Query(criteria);
//排序:分数降序,分页第一条
query.with(Sort.by("score").descending()).limit(1);
// Query query = Query.query(criteria).with(Sort.by(Sort.Order.desc("score"))).limit(1);
RecommendUser one = mongoTemplate.findOne(query, RecommendUser.class);
//调用mongoTemplate查询
return one ;
}
}
ステップ 3: 最近の友達情報を処理し、友達のユーザー ID を取得し、その ID をユーザー テーブルに渡してユーザー情報を確認する
ステップ 4: カプセル化クラスを定義し、2 つのテーブルの関連情報を組み合わせて割り当て、それを返します。
TodayBest Information Encapsulation — ベスト フレンド クラス
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodayBest implements Serializable {
private Long id ; //用户id
private String avatar ; //头像
private String nickname ; //昵称
private String gender ; //性别
private Integer age ; //年龄
private String[] tags ; //标签
private Long fateValue ; //缘分值
/**
* 在vo对象中补充一个方法,封装转化过程
* 将用户信息和推荐信息合并赋值
* 由UserInfo转化为TodayBest
*/
public static TodayBest init(UserInfo userInfo , RecommendUser recommendUser){
TodayBest vo = new TodayBest();
BeanUtils.copyProperties(userInfo,vo);
//标签分割设置
if (userInfo.getTags() != null){
vo.setTags(userInfo.getTags().split(","));
}
//获取缘分值并设置
long value = recommendUser.getScore().longValue();
vo.setFateValue(value);
return vo ;
}
}
注:ユーザー情報は Mysql データベースに保存され、友人情報は MongoDB データベースに保存されます. 相互データを使用する必要がある場合は、Dubbo を使用してリモート呼び出しを行います.