This commit is contained in:
aozhiwei 2020-01-13 10:23:44 +08:00
parent 27975d1ae4
commit 0e548b4f07
6 changed files with 32 additions and 65 deletions

2
third_party/f7 vendored

@ -1 +1 @@
Subproject commit 8b29369ca65d5d474a78085c3e5f93be6be9376a Subproject commit 07f321e38325d429b404331b027fc9da25587469

2
third_party/q7 vendored

@ -1 +1 @@
Subproject commit b4ea03b447e075ecfeefa1b22d0a0497ad80c0eb Subproject commit 4af43d56490d566c38021d9687975dae17d9e7ad

View File

@ -19,19 +19,10 @@ import functools
CONFIG_DIR = '../config' if f7.isOnlineEnv() else '/var/data/conf_test/game2003api_rankserver/config' CONFIG_DIR = '../config' if f7.isOnlineEnv() else '/var/data/conf_test/game2003api_rankserver/config'
def take_pass(elem): def _take_pass(elem):
return elem[3] return elem[3]
def take_coin_num(elem): def _getRedis():
return elem[4]
def safeDiv(a, b):
if b == 0:
return 0
else:
return a / b
def getRedis():
redis_conf = json.loads(open(CONFIG_DIR + '/rankserver.redis.cluster.json', 'r').read()) redis_conf = json.loads(open(CONFIG_DIR + '/rankserver.redis.cluster.json', 'r').read())
for conf in redis_conf: for conf in redis_conf:
r = redis.Redis(host = conf['host'], r = redis.Redis(host = conf['host'],
@ -46,7 +37,7 @@ def getRedisConf():
return redis_conf; return redis_conf;
#数据去重 #数据去重
def delRepeatData(row, data_list): def _delRepeatData(row, data_list):
temp_list = [] temp_list = []
for data in data_list: for data in data_list:
if data[0] == row[0]: if data[0] == row[0]:
@ -55,21 +46,21 @@ def delRepeatData(row, data_list):
data_list.remove(temp_data) data_list.remove(temp_data)
#刷新通关数据 #刷新通关数据
def refreshData(row, pass_list): def _refreshData(row, pass_list):
pass_list.append((row[0], row[1].decode('utf-8'), row[2], row[3], row[4])) pass_list.append((row[0], row[1].decode('utf-8'), row[2], row[3], row[4]))
pass_list.sort(key=take_pass, reverse=True) pass_list.sort(key=_take_pass, reverse=True)
if (len(pass_list) > 50): if (len(pass_list) > 50):
del pass_list[50:] del pass_list[50:]
#更新排行榜 #更新排行榜
def updateRank(r, channel, pass_list): def _updateRank(r, channel, pass_list):
pass_list.sort(key=take_pass, reverse=True) pass_list.sort(key=_take_pass, reverse=True)
pass_rank = [] pass_rank = []
for pass_index in range(min(50, len(pass_list))): for pass_index in range(min(50, len(pass_list))):
pass_rank.append(pass_list[pass_index]) pass_rank.append(pass_list[pass_index])
r.set("game2003api:pass_rank_" + channel, json.dumps(pass_rank)) r.set("game2003api:pass_rank_" + channel, json.dumps(pass_rank))
def internalDayReadMysqlData(): def dayReadMysqlData():
mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read()) mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read())
rank_hash = {} rank_hash = {}
for conf in mysql_conf: for conf in mysql_conf:
@ -93,25 +84,25 @@ def internalDayReadMysqlData():
channel = f7.getChannelByAccountId(row[0]) channel = f7.getChannelByAccountId(row[0])
if channel not in rank_hash: if channel not in rank_hash:
rank_hash[channel] = [] rank_hash[channel] = []
refreshData(row, rank_hash[channel]) _refreshData(row, rank_hash[channel])
last_idx = max(row[5], last_idx) last_idx = max(row[5], last_idx)
time.sleep(0.001); time.sleep(0.001);
if not has_data: if not has_data:
break break
r = getRedis() r = _getRedis()
for channel in rank_hash: for channel in rank_hash:
updateRank(r, channel, rank_hash[channel]) _updateRank(r, channel, rank_hash[channel])
#每日定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示 #每日定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示
def dayReadMysqlData(rushtime): def _dayReadMysqlData(rushtime):
internalDayReadMysqlData() dayReadMysqlData()
f7.timer.callAt(q7.getDaySeconds(time.time(), 1) + rushtime, f7.timer.callAt(q7.getDaySeconds(time.time(), 1) + rushtime,
lambda : dayReadMysqlData(rushtime)) lambda : _dayReadMysqlData(rushtime))
#每5分钟读取mysql里发生改变过的数据更新排行榜 #每5分钟读取mysql里发生改变过的数据更新排行榜
def readMysqlData(rushtime): def _readMysqlData(rushtime):
mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read()) mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read())
r = getRedis() r = _getRedis()
rank_hash = {} rank_hash = {}
for conf in mysql_conf: for conf in mysql_conf:
conn = pymysql.connect(host = conf['host'], conn = pymysql.connect(host = conf['host'],
@ -135,8 +126,8 @@ def readMysqlData(rushtime):
rank_list = r.get('game2003api:pass_rank_' + channel) rank_list = r.get('game2003api:pass_rank_' + channel)
rank_hash[channel] = [] if not rank_list else json.loads(rank_list) rank_hash[channel] = [] if not rank_list else json.loads(rank_list)
#更新通关榜 #更新通关榜
delRepeatData(row, rank_hash[channel]) _delRepeatData(row, rank_hash[channel])
refreshData(row, rank_hash[channel]) _refreshData(row, rank_hash[channel])
temp_idx = int(row[5]) temp_idx = int(row[5])
if (temp_idx > last_idx) : if (temp_idx > last_idx) :
last_idx = int(row[5]) last_idx = int(row[5])
@ -145,10 +136,10 @@ def readMysqlData(rushtime):
break break
for channel in rank_hash: for channel in rank_hash:
updateRank(r, channel, rank_hash[channel]) _updateRank(r, channel, rank_hash[channel])
f7.timer.callLater(rushtime, f7.timer.callLater(rushtime,
lambda : readMysqlData(rushtime) lambda : _readMysqlData(rushtime)
) )
if __name__ == "__main__": if __name__ == "__main__":
@ -157,15 +148,13 @@ if __name__ == "__main__":
conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read()) conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read())
app = make_app()
app.listen(conf['listen_port'])
conf['rushtime'] = 300 conf['rushtime'] = 300
f7.timer.callLater(conf['rushtime'], f7.timer.callLater(conf['rushtime'],
lambda : readMysqlData(conf['rushtime'])) lambda : _readMysqlData(conf['rushtime']))
conf['day_rushtime'] = 5 * 3600 conf['day_rushtime'] = 5 * 3600
f7.timer.callAt(q7.getDaySeconds(time.time(), 1) + conf['day_rushtime'], f7.timer.callAt(q7.getDaySeconds(time.time(), 1) + conf['day_rushtime'],
lambda : dayReadMysqlData(conf['day_rushtime'])) lambda : _dayReadMysqlData(conf['day_rushtime']))
f7.app.listen(conf['listen_port']) f7.app.listen(conf['listen_port'])
f7.app.start() f7.app.start()

View File

@ -9,20 +9,15 @@ import f7
import pymysql import pymysql
import hashlib import hashlib
import json import json
import urllib.request
import base64
import tornado.ioloop
import tornado.web
import time import time
import datetime import datetime
import redis import redis
import os import os
import functools
import game2003rank import game2003rank
def _updateRank_cmd(debug_info): def _updateRank_cmd(debug_info):
game2003rank.internalDayReadMysqlData() game2003rank.dayReadMysqlData()
def _clearRank_cmd(debug_info): def _clearRank_cmd(debug_info):
for conf in game2003rank.getRedisConf(): for conf in game2003rank.getRedisConf():
@ -31,10 +26,9 @@ def _clearRank_cmd(debug_info):
password = conf['passwd'], password = conf['passwd'],
charset = 'utf8' charset = 'utf8'
) )
pass_list = []
scan_keys = f7.scanRedisKey(r, "game2003api:pass_rank_*") scan_keys = f7.scanRedisKey(r, "game2003api:pass_rank_*")
for key in scan_keys : for key in scan_keys :
r.set(key, json.dumps(pass_list)) r.delete(key)
def processCmdLine(cmd): def processCmdLine(cmd):
cmd_hash = { cmd_hash = {
@ -63,6 +57,8 @@ if __name__ == "__main__":
if len(sys.argv) <= 1: if len(sys.argv) <= 1:
pass pass
else: else:
q7.xPrint('pid:' + str(os.getpid()))
f7.app.init('/data/logs/game2003_rankserver_cmd/logs') f7.app.init('/data/logs/game2003_rankserver_cmd/logs')
f7.udplog.info('game2003_rankserver_cmd start pid:' + str(os.getpid())) f7.udplog.info('game2003_rankserver_cmd start pid:' + str(os.getpid()))
processCmdLine(sys.argv[1]) processCmdLine(sys.argv[1])
f7.app.start()

View File

@ -44,8 +44,6 @@ class RankController{
$user_list = array(); $user_list = array();
$pass_list = array(); $pass_list = array();
$pass_rank = 0; $pass_rank = 0;
$coin_list = array();
$coin_rank = 0;
$myname = ''; $myname = '';
$myavatar_url = ''; $myavatar_url = '';
//个人信息 //个人信息
@ -83,7 +81,9 @@ class RankController{
//通关榜 //通关榜
$r = $this->getRedis(); $r = $this->getRedis();
$pass_rank_db = $r->get("game2003api:pass_rank"); $channel = phpcommon\extractChannel($account_id);
$pass_rank_db = $r->get("game2003api:pass_rank_" . $channel);
error_log(json_decode($pass_rank_db));
$pass_db = json_decode($pass_rank_db); $pass_db = json_decode($pass_rank_db);
$pass_list = $this->getRank($account_id, $pass_db, $myname, $myavatar_url); $pass_list = $this->getRank($account_id, $pass_db, $myname, $myavatar_url);
$i = 0; $i = 0;
@ -98,30 +98,12 @@ class RankController{
} }
$i++; $i++;
} }
//财富榜
$coin_rank_db = $r->get("game2003api:coin_rank");
$coin_db = urldecode($coin_rank_db);
$i = 0;
foreach ($coin_db as $coin) {
$name = '';
$avatar_url = '';
if ($i > 49) {
break;
}
if ($coin_db[$i][0] == $account_id) {
$coin_rank = $i + 1;
}
$i++;
}
$coin_list = $this->getRank($account_id, $coin_db, $myname, $myavatar_url);
echo json_encode(array( echo json_encode(array(
'errcode' => 0, 'errcode' => 0,
'errmsg' => "", 'errmsg' => "",
'user_list' => $user_list, 'user_list' => $user_list,
'pass_rank' => $pass_rank, 'pass_rank' => $pass_rank,
'pass_list' => $pass_list, 'pass_list' => $pass_list,
'coin_rank' => $coin_rank,
'coin_list' => $coin_list,
)); ));
} }

View File

@ -22,7 +22,7 @@ class RoleController{
$avatar_url = $_REQUEST['avatar_url']; $avatar_url = $_REQUEST['avatar_url'];
//登录校验() //登录校验()
$login = loginVerify($account_id, $_REQUEST['session_id']); $login = loginVerify($account_id, $_REQUEST['session_id']);
if (!$login) { if (!$login) {
phpcommon\sendError(ERR_USER_BASE + 1, 'session无效'); phpcommon\sendError(ERR_USER_BASE + 1, 'session无效');
return; return;
} }