PHP에서 Redis가 지원하는 순위표 정보
PHP에서 Redis가 지원하는 순위표본문
PHP에서 Redis가 지원하는 순위표.
https://github.com/agoragames/php-leaderboard
class Leaderboard { | |
const VERSION = '1.0.0'; | |
const DEFAULT_PAGE_SIZE = 25; | |
const DEFAULT_HOST = 'localhost'; | |
const DEFAULT_PORT = 6379; | |
private $_leaderboard_name; | |
private $_redis_connection; | |
private $_page_size; | |
public function __construct($name, $host = Leaderboard::DEFAULT_HOST, $port = Leaderboard::DEFAULT_PORT, $pageSize = Leaderboard::DEFAULT_PAGE_SIZE) { | |
$this->_leaderboard_name = $name; | |
$this->_redis_connection = new Redis(); | |
$this->_redis_connection->connect($host, $port); | |
if ($pageSize < 1) { | |
$pageSize = Leaderboard::DEFAULT_PAGE_SIZE; | |
} | |
$this->_page_size = $pageSize; | |
} | |
public function getLeaderboardName() { | |
return $this->_leaderboard_name; | |
} | |
public function setPageSize($pageSize) { | |
if ($pageSize < 1) { | |
$pageSize = Leaderboard::DEFAULT_PAGE_SIZE; | |
} | |
$this->_page_size = $pageSize; | |
} | |
public function close() { | |
return $this->_redis_connection->close(); | |
} | |
public function addMember($member, $score) { | |
return $this->addMemberTo($this->_leaderboard_name, $member, $score); | |
} | |
public function addMemberTo($leaderboardName, $member, $score) { | |
return $this->_redis_connection->zAdd($leaderboardName, $score, $member); | |
} | |
public function removeMember($member) { | |
return $this->removeMemberFrom($this->_leaderboard_name, $member); | |
} | |
public function removeMemberFrom($leaderboardName, $member) { | |
return $this->_redis_connection->zRem($leaderboardName, $member); | |
} | |
public function totalMembers() { | |
return $this->totalMembersIn($this->_leaderboard_name); | |
} | |
public function totalMembersIn($leaderboardName) { | |
return $this->_redis_connection->zCard($leaderboardName); | |
} | |
public function totalPages() { | |
return $this->totalPagesIn($this->_leaderboard_name); | |
} | |
public function totalPagesIn($leaderboardName) { | |
return ceil($this->totalMembersIn($leaderboardName) / $this->_page_size); | |
} | |
public function totalMembersInScoreRange($minScore, $maxScore) { | |
return $this->totalMembersInScoreRangeIn($this->_leaderboard_name, $minScore, $maxScore); | |
} | |
public function totalMembersInScoreRangeIn($leaderboardName, $minScore, $maxScore) { | |
return $this->_redis_connection->zCount($leaderboardName, $minScore, $maxScore); | |
} | |
public function changeScoreFor($member, $delta) { | |
return $this->changeScoreForIn($this->_leaderboard_name, $member, $delta); | |
} | |
public function changeScoreForIn($leaderboardName, $member, $delta) { | |
return $this->_redis_connection->zIncrBy($leaderboardName, $delta, $member); | |
} | |
public function rankFor($member, $useZeroIndexForRank = false) { | |
return $this->rankForIn($this->_leaderboard_name, $member, $useZeroIndexForRank); | |
} | |
public function rankForIn($leaderboardName, $member, $useZeroIndexForRank = false) { | |
$rank = $this->_redis_connection->zRevRank($leaderboardName, $member); | |
if ($useZeroIndexForRank == false) { | |
$rank += 1; | |
} | |
return $rank; | |
} | |
public function scoreFor($member) { | |
return $this->scoreForIn($this->_leaderboard_name, $member); | |
} | |
public function scoreForIn($leaderboardName, $member) { | |
return $this->_redis_connection->zScore($leaderboardName, $member); | |
} | |
public function checkMember($member) { | |
return $this->checkMemberIn($this->_leaderboard_name, $member); | |
} | |
public function checkMemberIn($leaderboardName, $member) { | |
return !($this->_redis_connection->zScore($leaderboardName, $member) == NULL); | |
} | |
public function scoreAndRankFor($member, $useZeroIndexForRank = false) { | |
return $this->scoreAndRankForIn($this->_leaderboard_name, $member, $useZeroIndexForRank); | |
} | |
public function scoreAndRankForIn($leaderboardName, $member, $useZeroIndexForRank = false) { | |
$memberData = array(); | |
$memberData['member'] = $member; | |
$memberData['score'] = $this->scoreForIn($leaderboardName, $member); | |
$memberData['rank'] = $this->rankForIn($leaderboardName, $member, $useZeroIndexForRank); | |
return $memberData; | |
} | |
public function removeMembersInScoreRange($minScore, $maxScore) { | |
return $this->removeMembersInScoreRangeIn($this->_leaderboard_name, $minScore, $maxScore); | |
} | |
public function removeMembersInScoreRangeIn($leaderboardName, $minScore, $maxScore) { | |
return $this->_redis_connection->zRemRangeByScore($leaderboardName, $minScore, $maxScore); | |
} | |
public function leaders($currentPage, $withScores = true, $withRank = true, $useZeroIndexForRank = false) { | |
return $this->leadersIn($this->_leaderboard_name, $currentPage, $withScores, $withRank, $useZeroIndexForRank); | |
} | |
public function leadersIn($leaderboardName, $currentPage, $withScores = true, $withRank = true, $useZeroIndexForRank = false) { | |
if ($currentPage < 1) { | |
$currentPage = 1; | |
} | |
if ($currentPage > $this->totalPagesIn($leaderboardName)) { | |
$currentPage = $this->totalPagesIn($leaderboardName); | |
} | |
$indexForRedis = $currentPage - 1; | |
$startingOffset = ($indexForRedis * $this->_page_size); | |
if ($startingOffset < 0) { | |
$startingOffset = 0; | |
} | |
$endingOffset = ($startingOffset + $this->_page_size) - 1; | |
$leaderData = $this->_redis_connection->zRevRange($leaderboardName, $startingOffset, $endingOffset, $withScores); | |
if (!is_null($leaderData)) { | |
return $this->massageLeaderData($leaderboardName, $leaderData, $withScores, $withRank, $useZeroIndexForRank); | |
} else { | |
return NULL; | |
} | |
} | |
public function aroundMe($member, $withScores = true, $withRank = true, $useZeroIndexForRank = false) { | |
return $this->aroundMeIn($this->_leaderboard_name, $member, $withScores, $withRank, $useZeroIndexForRank); | |
} | |
public function aroundMeIn($leaderboardName, $member, $withScores = true, $withRank = true, $useZeroIndexForRank = false) { | |
$reverseRankForMember = $this->_redis_connection->zRevRank($leaderboardName, $member); | |
$startingOffset = $reverseRankForMember - ($this->_page_size / 2); | |
if ($startingOffset < 0) { | |
$startingOffset = 0; | |
} | |
$endingOffset = ($startingOffset + $this->_page_size) - 1; | |
$leaderData = $this->_redis_connection->zRevRange($leaderboardName, $startingOffset, $endingOffset, $withScores); | |
if (!is_null($leaderData)) { | |
return $this->massageLeaderData($leaderboardName, $leaderData, $withScores, $withRank, $useZeroIndexForRank); | |
} else { | |
return NULL; | |
} | |
} | |
public function rankedInList($members, $withScores = true, $useZeroIndexForRank = false) { | |
return $this->rankedInListIn($this->_leaderboard_name, $members, $withScores, $useZeroIndexForRank); | |
} | |
public function rankedInListIn($leaderboardName, $members, $withScores = true, $useZeroIndexForRank = false) { | |
$leaderData = array(); | |
foreach ($members as $member) { | |
$memberData = array(); | |
$memberData['member'] = $member; | |
if ($withScores) { | |
$memberData['score'] = $this->scoreForIn($leaderboardName, $member); | |
} | |
$memberData['rank'] = $this->rankForIn($leaderboardName, $member, $useZeroIndexForRank); | |
array_push($leaderData, $memberData); | |
} | |
return $leaderData; | |
} | |
private function massageLeaderData($leaderboardName, $leaders, $withScores, $withRank, $useZeroIndexForRank) { | |
$memberAttribute = true; | |
$leaderData = array(); | |
$memberData = array(); | |
foreach ($leaders as $key => $value) { | |
$memberData['member'] = $key; | |
$memberData['score'] = $value; | |
if ($withRank) { | |
$memberData['rank'] = $this->rankForIn($leaderboardName, $key, $useZeroIndexForRank); | |
} | |
array_push($leaderData, $memberData); | |
$memberData = array(); | |
} | |
return $leaderData; | |
} | |
} |
그누보드강좌/영카트강좌 - 기초부터 적용까지 체계적인 영상강좌
By 웹학교
추천
0
0
댓글 0개