Created
February 6, 2015 04:37
-
-
Save yoki123/3111aef55e0230b12181 to your computer and use it in GitHub Desktop.
A simple pvp ranking with python,redis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import random | |
import redis | |
import time | |
class PvPRanking(object): | |
def __init__(self): | |
self._rs = redis.Redis() | |
self._zset_name = 'host:ranking' | |
def get_last_score(self): | |
person = self._rs.zrange(self._zset_name, -1, -1) | |
if len(person) == 0: | |
return 1 | |
score = self._rs.zscore(self._zset_name, person[0]) | |
return score | |
def add_player(self, pid): | |
is_old = self._rs.zscore(self._zset_name, pid) | |
if is_old: | |
raise Exception('player already exist') | |
score = self.get_last_score() | |
# new player score = last rank player score + 1 | |
self._rs.zadd(self._zset_name, pid, score + 1) | |
rank = self._rs.zrank(self._zset_name, pid) | |
return rank | |
def delete_player(self, pid): | |
return self._rs.zrem(self._zset_name, pid) | |
def exchange_rank(self, pid1, pid2): | |
with self._rs.pipeline() as pipe: | |
pipe.zscore(self._zset_name, pid1) | |
pipe.zscore(self._zset_name, pid2) | |
score1, score2 = pipe.execute() | |
with self._rs.pipeline() as pipe: | |
pipe.zadd(self._zset_name, pid1, score2) | |
pipe.zadd(self._zset_name, pid2, score1) | |
pipe.execute() | |
def ranking(self, start=0, end=100): | |
return self._rs.zrange(self._zset_name, start, end) | |
def get_rank(self, pid): | |
return self._rs.zrank(self._zset_name, pid) | |
def get_score(self, pid): | |
return self._rs.zscore(self._zset_name, pid) | |
if __name__ == '__main__': | |
p = PvPRanking() | |
p._rs.flushdb() | |
num_test = 1000 | |
base_num = 1000000 | |
t1 = time.clock() | |
for pid in xrange(base_num, base_num + num_test): | |
p.add_player(pid) | |
t2 = time.clock() | |
top100 = p.ranking() | |
t3 = time.clock() | |
p.get_rank(base_num + random.randint(0, num_test-1)) | |
t4 = time.clock() | |
print(top100) | |
print('init 1000: %f ms' % ((t2 - t1) * 1000)) | |
print('top 100: %f ms' % ((t3 - t2) * 1000)) | |
print('get single rank: %f ms' % ((t4 - t3) * 1000)) | |
pid1, pid2 = base_num + random.randint(0, num_test-1), base_num + random.randint(0, num_test-1) | |
print('before exchange rank: %d score=%s rank=%s' % (pid1, p.get_score(pid1), p.get_rank(pid1))) | |
print('before exchange rank: %d score=%s rank=%s' % (pid2, p.get_score(pid2), p.get_rank(pid2))) | |
p.exchange_rank(pid1, pid2) | |
print('after exchange rank: %d score=%s rank=%s' % (pid1, p.get_score(pid1), p.get_rank(pid1))) | |
print('after exchange rank: %d score=%s rank=%s' % (pid2, p.get_score(pid2), p.get_rank(pid2))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
test result on my pc ,