Redis 로 웨 이 보 관심 관계 실현
6342 단어 Redis마이크로 블 로그 관심
관심
팬쌍방 향 관심(상호 분말)괜찮다
수요 분석
웨 이 보 에 서 는 모든 사용자 가 하나의 관심 리스트,하나의 팬 리스트 를 가지 고 있다.사용 자 는 자신의 관심,팬 리스트,다른 사람의 관심,팬 리스트 를 볼 수 있다.또한 목록 에 있 는 모든 사람과 현재 뷰 어의 관심 상 태 를 보 여 줍 니 다.상태의 가능성 은 위 에서 말 한 네 가지 관계 상태 다.
문 제 는 두 가지 상황 으로 나 누 어 볼 수 있다.
1.자신의 관심,팬 리스트 보기
2.다른 사람의 관심,팬 리스트 보기
자신의 관심,팬 리스트 보기:
이런 상황 은 상대 적 으로 간단 하 다.예 를 들 어 자신의 관심 리스트 를 보면 리스트 에 있 는 사람과 자신의 관계 상 태 는'무관'과'팬'일 수 없다.'관심'과'쌍방 향 관심'일 수 밖 에 없다.마찬가지 로 팬 리스트 도 두 가지 상태 다.
다른 사람의 관심,팬 리스트 보기:
이것 은 가장 복잡 한 상황 이다.만약 다른 사람의 관심 목록 을 본다 면 목록 에 있 는 사람과 자신 은 상술 한 네 가지 관계 상 태 를 가 질 수 있다.
집합 한 그림 으로 분석 하 다.
위의 그림 과 같다.왼쪽 원 은 사용자 의 관심 목록 을 표시 하고 오른쪽 원 은 팬 목록 을 표시 하 며 아래 원 은 볼 목록(집합)을 표시 합 니 다.각각 follow,fans,find 로 이 세 개의 집합 을 표시 합 니 다.
자신의 목록 을 볼 때,사실은 find 집합 은 위 집합 중의 어떤 부분 집합 임 을 나타 낸다.예 를 들 어 자신의 팬 을 살 펴 보면 find 는 팬 들 의 부분 집합 이 고 자신의 관심 사 를 살 펴 보면 find 는 follow 의 부분 집합 임 을 나타 낸다.
다른 사람의 목록 을 볼 때 그림 에 세 개의 집합 이 생 겼 다.집합 중인 사용 자 를 조회 하려 면 당신 의 팬 일 수도 있 고,집합 에 관심 을 가 질 수도 있 고,없 을 수도 있 습 니 다.즉,모든 관계 상태 일 수 있 습 니 다.문 제 는 근본적으로 모든 사용자 와 현재 사용자 의 관계 상 태 를 계산 하 는 것 입 니 다.네 가지 관계 상 태 를 풀 라 고 요구 하면 우 리 는 반드시 그림 아래 부분의 세 개의 작은 교 집합 을 요구 할 것 이다.
4.567917.조회 할 집합 과 나의 상호 분말 교 집합
이 세 개의 작은 교차 집합 에 없 는 사용 자 는 무관 한 상태의 사용자 이다.
만약 우리 가 다음 과 같은 이름 을 사용한다 면:
관심 집합
follow:userID 팬 집합 fans:userID
상호 분말 집합(임시)
fofa:userID 가 조회 할 집합(임시)find:userID
조회 할 집합 과 나의 관심 집합(임시)
find_inter_follow:userID 가 조회 할 집합 과 나의 팬 교 집합(임시)findinter_fans:userID
조회 할 집합 과 나의 팬 교 집합(임시)
find_inter_fofa:userID
find 중 다른 것 은 관심 이 없습니다.
Sorted Set 저장 관 계 를 사용 합 니 다.
score 는 관심 을 가 지 는 시간 을 저장 하고 사용자 마다 두 개의 집합 을 저장 합 니 다.follow:userID 저장 사용자 의 관심,fans:userID 저장 사용자 의 팬.그래서 우 리 는 이러한 상태의 집합 을 구하 기 위해 함 수 를 설계 할 수 있다.
함수 반환:
"findSet" => $findSet, //
"fofaSet" => $fofaSet, //
"findInterFollowSet" => $findInterFollowSet, //
"findInterFansSet" => $findInterFansSet //
상기 네 개의 집합 을 구하 면 관계 상태 판단 을 할 수 있 고,먼저 상호 팬 여 부 를 판단 하고,상호 팬 이 아니라면 내 가 주목 하 는 것 인지,아니면 내 팬 인지 아 닌 지 를 판단 할 수 있다.다 아니면 상관 없어.이렇게 하면 상 태 를 구 할 수 있다.
/*
* userID: id
* targetUserID: id
* findType:
* findStart:
* findEnd:
*/
function getChunkSets($redis, $userID, $targetUserID, $findType, $findStart, $findEnd) {
$fansKey = "fans:" . $userID;
$followKey = "follow:" . $userID;
$findKey = "find:" . $userID;
$targetKey = $findType. ":" . $targetUserID;
$fofaKey = "find_inter_fofa:" . $userID;
$findInterFollowKey = "find_inter_follow:" . $userID;
$findInterFansKey = "find_inter_fans:" . $userID;
//
$findSet = $redis->zRevRange($targetKey, $findStart, $findEnd, TRUE);
//
$findInterFollowSet = array();
//
$findInterFansSet = array();
//
$redis->del($findKey);
$redis->del($fofaKey);
$redis->del($findInterFollowKey);
$redis->del($findInterFansKey);
//
foreach ($findSet as $uid => $score) {
$redis->zAdd($findKey, $score, $uid);
}
//
if ($userID != $targetUserID) { //
$redis->zInter($fofaKey, array($findKey, $fansKey, $followKey));
/*
* ,
* 1:
* 2:
*/
$redis->zInter($findInterFollowKey, array($findKey, $followKey));
$redis->zInter($findInterFansKey, array($findKey, $fansKey));
$findInterFollowSet = $redis->zRevRange($findInterFollowKey, 0, -1);
$findInterFansSet = $redis->zRevRange($findInterFansKey, 0, -1);
} else {
if ($findType == "fans") { //
$redis->zInter($fofaKey, array($findKey, $followKey));
} else if ($findType == "follow") { //
$redis->zInter($fofaKey, array($findKey, $fansKey));
}
}
//
$fofaSet = $redis->zRevRange($fofaKey, 0, -1);
return array(
"findSet" => $findSet, //
"fofaSet" => $fofaSet, //
"findInterFollowSet" => $findInterFollowSet, //
"findInterFansSet" => $findInterFansSet //
);
}
이상 의 함 수 는 이미 필요 한 집합 을 구 한 다음 에 관계 상태 판단 이다.
/*
* isSelf:
* findType: 1: , 2:
* userInfoArr:
*/
function getUserInfoList($isSelf, $findType, $userInfoArr, $findSet, $fofaSet, $interFansSet, $interFollowSet) {
$userInfoList = array();
foreach($findSet as $userID => $favoTime) {
if(!in_array($userID, array_keys($userInfoArr))) continue;
$userInfo = new UserInfo($userInfoArr[$userID]);
$userInfo = $userInfo->format();
if(in_array($userID, $fofaSet)){
$userInfo['favoFlag'] = 3; //
} else {
if($isSelf) {
$userInfo['favoFlag'] = $findType;
} else {
if(in_array($userID, $interFansSet)) {
$userInfo['favoFlag'] = 2; //
} else if(in_array($userID, $interFollowSet)) {
$userInfo['favoFlag'] = 1; //
} else{
$userInfo['favoFlag'] = 0; //
}
}
}
$userInfo['favoTime'] = $favoTime;
array_push($userInfoList, $userInfo);
}
return $userInfoList;
}
레 디 스 로 웨 이 보 의 관심 관 계 를 어떻게 실현 하 는 지 는 여기까지 소개 하 겠 습 니 다.여러분 의 교류 와 토론 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
그래프 구조를 무상으로 취급할 수 없는 것은 싫기 때문에, redisgraph를 WSL2에 극치고 설치해 보았습니다.제목은 만우절이므로. 그렇다, 역시, 앞으로는 그래프 구조 데이터베이스라고 생각했다. 생각한 것은 몇 년 전인가. 전부터 Neo4j는 시험하고 있지만, 영업 분들로부터 상용 라이센스가 높다고 가르쳐 주었으므로, 전전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.