wangwei01 1c22969a07 1
2019-07-26 18:30:38 +08:00

105 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
#!/usr/bin/python
import pymysql
import hashlib
import json
import urllib.request
import base64
import tornado.ioloop
import tornado.web
import time
import datetime
import redis
import os
CONFIG_DIR = ''
def IsOnlineEnv():
return os.getenv("SERVER_ENV");
if (IsOnlineEnv()):
CONFIG_DIR = '/var/data/conf_test/game2002api_rankserver/config'
else:
CONFIG_DIR = '../config'
#定时读取mysql里的数据生成排行榜写入redis后php读取redis返回客户端显示
def info(msg):
print(str(datetime.datetime.now()) + '[INFO] ' + msg)
def take_score(elem):
return elem[3]
def safeDiv(a, b):
if b == 0:
return 0
else:
return a / b
def getRedis():
redis_conf = json.loadsmysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.redis.cluster.json', 'r').read())
for conf in redis_conf:
r = redis.Redis(host = conf['host'],
port = conf['port'],
password = conf['passwd'],
charset = 'utf8'
)
return r;
def readMysqlData(rushtime):
mysql_conf = json.loads(open(CONFIG_DIR + '/rankserver.mysql.cluster.json', 'r').read())
array = []
for conf in mysql_conf:
conn = pymysql.connect(host = conf['host'],
port = conf['port'],
user = conf['user'],
passwd = conf['passwd'],
db = 'gamedb2002_' + str(conf['instance_id']),
charset = 'utf8'
)
cursor = conn.cursor()
cursor.execute('SELECT accountid, user_name, avatar_url, score FROM user;')
for row in cursor:
score = row[3]
array.append((row[0], row[1].decode('utf-8'), row[2], score))
r = getRedis()
array.sort(key=take_score, reverse=True)
score_rank = []
for score_index in range(min(50, len(array))):
score_rank.append(array[score_index])
r.set("game2002api: score_rank", json.dumps(score_rank))
tornado.ioloop.IOLoop.current().call_later(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__":
conf = json.loads(open(CONFIG_DIR + '/rankserver.json', 'r').read())
app = make_app()
app.listen(conf['listen_port'])
conf['rushtime'] = 300
tornado.ioloop.IOLoop.current().call_later(conf['rushtime'],
lambda : readMysqlData(conf['rushtime'])
)
tornado.ioloop.IOLoop.current().start()