>  기사  >  데이터 베이스  >  Redis를 사용하여 순위 시스템 완성

Redis를 사용하여 순위 시스템 완성

齐天大圣
齐天大圣원래의
2020-05-14 09:41:471966검색

redis에는 매우 특별한 데이터 유형인 Ordered Set이 있습니다. 이전에 배운 집합의 개념은 집합의 모든 요소가 고유하고 순서가 없다는 것입니다. 그런데 어떻게 정렬된 집합이 여기에 나타나며, 정렬을 어떻게 달성합니까?

주문된 세트의 요소는 여전히 고유하지만 각 요소마다 소크레(점수)가 설정되고 이 점수를 통해 순서가 이루어집니다. 아래 그림과 같이

Redis를 사용하여 순위 시스템 완성

Ordered Set API

다음에서는 순위 지정 기능을 구현하기 위해 이러한 API의 사용법을 알아야 합니다.

zAdd

플레이어 이름 요소와 능력 값을 점수로 사용하여 플레이어의 2k 능력 값 순서 목록을 설정하려고 합니다.

커리의 슈팅 능력은 100, 제임스는 92, 하든은 96, 폴은 97

sadd는 한 번에 1개 이상의 요소를 추가할 수 있습니다

127.0.0.1:6379[1]> zadd 2kplayer:shoot 100 curry
(integer) 1
127.0.0.1:6379[1]> zadd 2kplayer:shoot 92 james 96 harden 97 paul
(integer) 3

zIncrBy

이번 달에는 하 연속 히트에 이어 그리고 높은 점수를 받은 2k는 슈팅 능력을 2점 높이기로 결정했습니다

127.0.0.1:6379[1]> zincrby 2kplayer:shoot 2 harden
"98"

zRange, zRevRange

이제 개인 능력치 상위 3위 선수가 누구인지 알고 싶습니다.

127.0.0.1:6379[1]> zrange 2kplayer:shoot 0 2 withscores
1) "james"
2) "92"
3) "paul"
4) "97"
5) "harden"
6) "98"

redis는 기본적으로 양수 순서를 사용하며 점수는 작은 것부터 큰 것 순으로 정렬됩니다. 그래서 우리는 zRevRange

127.0.0.1:6379[1]> zrevrange 2kplayer:shoot 0 2 withscores
1) "curry"
2) "100"
3) "harden"
4) "98"
5) "paul"
6) "97"

zUnionStore

를 사용해야 합니다. 2k 능력치에는 여러 측면이 있으며 슈팅은 그 중 하나일 뿐이며 속도, 레이업 등은 모두 능력치의 일부입니다.

127.0.0.1:6379[1]> zadd 2kplayer:speed 99 james 90 paul 90 curry 93 harden 
(integer) 4

이때, 플레이어의 종합 능력치를 알고 싶다면 각 항목의 점수를 합산해야 합니다

127.0.0.1:6379[1]> zunionstore 2kplayer 2 2kplayer:shoot 2kplayer:speed
(integer) 4
127.0.0.1:6379[1]> zrange 2kplayer 0 -1 withscores
1) "paul"
2) "187"
3) "curry"
4) "190"
5) "harden"
6) "191"
7) "james"
8) "191"

순위 시스템을 구현하세요

시나리오는 다음과 같습니다. 수요 시스템, 매일 그것을 보는 사람들이 많이 있습니다. 시스템에는 가장 많이 본 동영상을 표시하는 목록 기능이 있습니다. 오늘의 목록, 3일 목록, 주간 순위, 월간 목록으로 구분됩니다.

아이디어: 먼저 일별 영상 조회수를 세고, 그다음 오늘의 목록, 3일 목록 등을 세어보세요.

동영상 조회수를 계산하는 의사 코드는 다음과 같습니다.

// 观看视频
function view ($videoId)
{
    $key = 'video:view:'.date('Y-m-d');  
      
    if (!$redis->exists($key)) {
        $redis->zIncrBy($key, 1, $videoId);
        $redis->expire($key, 86400 * 30);
    }
    
    $redis->zIncrBy($key, 1, $videoId);
}

오늘의 가장 더운 날

오늘의 가장 더운 날 한 가지 주의할 점은 새로운 하루가 막 시작되면 데이터가 비어 있거나 거의 없을 수 있다는 것입니다. 따라서 오늘의 데이터와 어제의 데이터를 결합할 수 있지만 오늘의 데이터에 더 높은 가중치를 부여할 수 있습니다.

오늘날 가장 많이 사용되는 함수 구현 의사 코드는 다음과 같습니다.

function todayHot ()
{
    $tokeyKey = 'video:view:'.date('Y_m_d');
    $yesKey = 'video:view:'. date('Y_m_d', time() - 86400);
    $keyUnion = "view:rank:today";
    
    $redis->zUnionStore($keyUnion, [$tokeyKey, $yesKey], [10, 1]);
    // 取前100名
    return $redis->zRevRange($keyUnion, 0, 99);
}

3일 목록

function threeHot ()
{
    $keyUnion = 'view:rank:three';
    $unionKeys = [];
    
    for ($i=0; $i < 3; $i++) {
        $unionKeys[] = &#39;video:view:&#39;.date(&#39;Y_m_d&#39;, time() - 86400 *$i);
    }
    
    $redis->zUnionStore($keyUnion, $unionKeys);
    return $redis->zRevRange($keyUnion, 0, 99, true);
}

주간 목록, 월간 목록 등은 3일 목록과 동일하므로 코드는 다음과 같습니다. 게시되지 않습니다.

위 내용은 Redis를 사용하여 순위 시스템 완성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.