Redis 로 웨 이 보 관심 관계 실현

관계 가 발생 하 는 네 가지 관계 상 태 를 주목 하 다.
관심
팬쌍방 향 관심(상호 분말)괜찮다
수요 분석
웨 이 보 에 서 는 모든 사용자 가 하나의 관심 리스트,하나의 팬 리스트 를 가지 고 있다.사용 자 는 자신의 관심,팬 리스트,다른 사람의 관심,팬 리스트 를 볼 수 있다.또한 목록 에 있 는 모든 사람과 현재 뷰 어의 관심 상 태 를 보 여 줍 니 다.상태의 가능성 은 위 에서 말 한 네 가지 관계 상태 다.
문 제 는 두 가지 상황 으로 나 누 어 볼 수 있다.
1.자신의 관심,팬 리스트 보기
2.다른 사람의 관심,팬 리스트 보기
자신의 관심,팬 리스트 보기:
이런 상황 은 상대 적 으로 간단 하 다.예 를 들 어 자신의 관심 리스트 를 보면 리스트 에 있 는 사람과 자신의 관계 상 태 는'무관'과'팬'일 수 없다.'관심'과'쌍방 향 관심'일 수 밖 에 없다.마찬가지 로 팬 리스트 도 두 가지 상태 다.
다른 사람의 관심,팬 리스트 보기:
이것 은 가장 복잡 한 상황 이다.만약 다른 사람의 관심 목록 을 본다 면 목록 에 있 는 사람과 자신 은 상술 한 네 가지 관계 상 태 를 가 질 수 있다.
집합 한 그림 으로 분석 하 다.

위의 그림 과 같다.왼쪽 원 은 사용자 의 관심 목록 을 표시 하고 오른쪽 원 은 팬 목록 을 표시 하 며 아래 원 은 볼 목록(집합)을 표시 합 니 다.각각 follow,fans,find 로 이 세 개의 집합 을 표시 합 니 다.
자신의 목록 을 볼 때,사실은 find 집합 은 위 집합 중의 어떤 부분 집합 임 을 나타 낸다.예 를 들 어 자신의 팬 을 살 펴 보면 find 는 팬 들 의 부분 집합 이 고 자신의 관심 사 를 살 펴 보면 find 는 follow 의 부분 집합 임 을 나타 낸다.
다른 사람의 목록 을 볼 때 그림 에 세 개의 집합 이 생 겼 다.집합 중인 사용 자 를 조회 하려 면 당신 의 팬 일 수도 있 고,집합 에 관심 을 가 질 수도 있 고,없 을 수도 있 습 니 다.즉,모든 관계 상태 일 수 있 습 니 다.문 제 는 근본적으로 모든 사용자 와 현재 사용자 의 관계 상 태 를 계산 하 는 것 입 니 다.네 가지 관계 상 태 를 풀 라 고 요구 하면 우 리 는 반드시 그림 아래 부분의 세 개의 작은 교 집합 을 요구 할 것 이다.
4.567917.조회 할 집합 과 나의 상호 분말 교 집합
  • 조회 할 집합 과 나의 관심 이 교차 합 니 다
  • 4.567917.조회 할 집 은 나의 팬 과 교차한다.4.567918.
    이 세 개의 작은 교차 집합 에 없 는 사용 자 는 무관 한 상태의 사용자 이다.
    만약 우리 가 다음 과 같은 이름 을 사용한다 면:
    관심 집합
    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; 
     } 
    
    레 디 스 로 웨 이 보 의 관심 관 계 를 어떻게 실현 하 는 지 는 여기까지 소개 하 겠 습 니 다.여러분 의 교류 와 토론 을 환영 합 니 다.

    좋은 웹페이지 즐겨찾기