This commit is contained in:
aozhiwei 2020-01-10 15:10:38 +08:00
parent 645165bb32
commit 22c65d605f
5 changed files with 40 additions and 73 deletions

6
.gitmodules vendored
View File

@ -1,3 +1,9 @@
[submodule "third_party/phpcommon"] [submodule "third_party/phpcommon"]
path = third_party/phpcommon path = third_party/phpcommon
url = git@git.kingsome.cn:server_common/phpcommon.git url = git@git.kingsome.cn:server_common/phpcommon.git
[submodule "third_party/q7"]
path = third_party/q7
url = git@git.kingsome.cn:server_common/q7.git
[submodule "third_party/f7"]
path = third_party/f7
url = git@git.kingsome.cn:server_common/f7.git

1
third_party/f7 vendored Submodule

@ -0,0 +1 @@
Subproject commit 8b29369ca65d5d474a78085c3e5f93be6be9376a

1
third_party/q7 vendored Submodule

@ -0,0 +1 @@
Subproject commit b4ea03b447e075ecfeefa1b22d0a0497ad80c0eb

View File

@ -1,31 +1,23 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#!/usr/bin/python #!/usr/bin/python
import sys
sys.path.append('../local_packages')
import q7
import f7
import pymysql import pymysql
import hashlib import hashlib
import json import json
import urllib.request import urllib.request
import base64 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 functools
CONFIG_DIR = '' CONFIG_DIR = '../config' if f7.isOnlineEnv() else '/var/data/conf_test/game2003api_rankserver/config'
def IsOnlineEnv():
return os.getenv("SERVER_ENV");
if (IsOnlineEnv()):
CONFIG_DIR = '/var/data/conf_test/game2003api_rankserver/config'
else:
CONFIG_DIR = '../config'
def info(msg):
print(str(datetime.datetime.now()) + '[INFO] ' + msg)
def take_pass(elem): def take_pass(elem):
return elem[3] return elem[3]
@ -39,15 +31,8 @@ def safeDiv(a, b):
else: else:
return a / b return a / b
#获取channel
def getChannel(a):
str_list = a.split('_')
if len(str_list) < 3:
return 0
return str_list[0]
def getRedis(): def getRedis():
redis_conf = json.loadsmysql_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'],
port = conf['port'], port = conf['port'],
@ -60,11 +45,6 @@ def getRedisConf():
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())
return redis_conf; return redis_conf;
def getDaySeconds(time_val, incdays):
time_zone = 8
dayseconds = int((time_val + time_zone * 3600)/3600/24 + incdays) * 3600 * 24 - 3600 * time_zone;
return dayseconds
#数据去重 #数据去重
def delRepeatData(row, data_list): def delRepeatData(row, data_list):
temp_list = [] temp_list = []
@ -110,7 +90,7 @@ def internalDayReadMysqlData():
for row in cursor: for row in cursor:
has_data = True has_data = True
#更新通关榜 #更新通关榜
channel = getChannel(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])
@ -125,9 +105,8 @@ def internalDayReadMysqlData():
#每日定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示 #每日定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示
def dayReadMysqlData(rushtime): def dayReadMysqlData(rushtime):
internalDayReadMysqlData() internalDayReadMysqlData()
tornado.ioloop.IOLoop.current().call_at(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):
@ -151,7 +130,7 @@ def readMysqlData(rushtime):
has_data = False has_data = False
for row in cursor: for row in cursor:
has_data = True has_data = True
channel = getChannel(row[0]) channel = f7.getChannelByAccountId(row[0])
if channel not in rank_hash: if channel not in rank_hash:
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)
@ -168,37 +147,25 @@ def readMysqlData(rushtime):
for channel in rank_hash: for channel in rank_hash:
updateRank(r, channel, rank_hash[channel]) updateRank(r, channel, rank_hash[channel])
tornado.ioloop.IOLoop.current().call_later(rushtime, f7.timer.callLater(rushtime,
lambda : readMysqlData(rushtime) lambda : readMysqlData(rushtime)
) )
class SelfCheckingHandler(tornado.web.RequestHandler):
def get(self):
self.write(json.dumps({
'errcode': 0,
'errmsg': '',
'healthy': 1,
'max_rundelay': 10
}))
def make_app():
return tornado.web.Application([
(r"/webapp/index[\.]php", SelfCheckingHandler),
])
if __name__ == "__main__": if __name__ == "__main__":
f7.app.init('/data/logs/game2003_rankserver/logs')
f7.udplog.info('rankserver start pid:' + str(os.getpid()))
conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read()) conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read())
app = make_app() app = make_app()
app.listen(conf['listen_port']) app.listen(conf['listen_port'])
conf['rushtime'] = 5 conf['rushtime'] = 300
tornado.ioloop.IOLoop.current().call_later(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
tornado.ioloop.IOLoop.current().call_at(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']))
)
tornado.ioloop.IOLoop.current().start() f7.app.listen(conf['listen_port'])
f7.app.start()

View File

@ -2,6 +2,10 @@
#!/usr/bin/python #!/usr/bin/python
import sys import sys
sys.path.append('../local_packages')
import q7
import f7
import pymysql import pymysql
import hashlib import hashlib
import json import json
@ -17,20 +21,6 @@ import functools
import game2003rank import game2003rank
def scanRedisKey(conn, pattern):
result = {}
cursor, keys = conn.scan(0, pattern, 1000)
while cursor != 0 or len(keys) > 0:
for key in keys:
if key in result:
result[key] += result[key]
else:
result[key] = 0
keys = []
if cursor != 0:
cursor, keys = conn.scan(cursor, pattern, 1000)
return result
def _updateRank_cmd(debug_info): def _updateRank_cmd(debug_info):
game2003rank.internalDayReadMysqlData() game2003rank.internalDayReadMysqlData()
@ -42,7 +32,7 @@ def _clearRank_cmd(debug_info):
charset = 'utf8' charset = 'utf8'
) )
pass_list = [] pass_list = []
scan_keys = 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.set(key, json.dumps(pass_list))
@ -73,4 +63,6 @@ if __name__ == "__main__":
if len(sys.argv) <= 1: if len(sys.argv) <= 1:
pass pass
else: else:
f7.app.init('/data/logs/game2003_rankserver_cmd/logs')
f7.udplog.info('game2003_rankserver_cmd start pid:' + str(os.getpid()))
processCmdLine(sys.argv[1]) processCmdLine(sys.argv[1])