设为首页 收藏本站
查看: 1275|回复: 0

[经验分享] Ranking和等级玩家搜索

[复制链接]

尚未签到

发表于 2016-12-21 09:49:59 | 显示全部楼层 |阅读模式
  基于redis的sorted set实现排名(Ranking)和等级玩家搜索功能。

testcase1()有方法的调用样例:

#-*- coding: utf-8 -*
import redis
import random
# 调试开关
_DEBUG = False
# 删除缓冲
BUF_SIZE = 128
def _import_func(func_name):
components = func_name.split('.')
if len(components) == 1:
return globals()[func_name]
mod = __import__(components[0])
for comp in components[1:]:
mod = getattr(mod, comp)
return mod

class Ranking:
_instances = {}
def __init__(self, id, redis_inst, conf, eval_rank_cb):
self.label = id
self.redis = redis_inst
self.conf  = conf
self.eval_rank_cb = eval_rank_cb
@classmethod
def instance(cls, label):
return cls._instances[label]
@classmethod
def init(cls, configs, callback=None):
label = configs['label']
instance = None
if cls._instances.has_key(label):
instance = cls._instances[label]
if instance is None:
conf = cls.parse_config(configs)
if conf is not None:
instance = cls(conf['label'], \
conf['redis'], \
conf, \
conf['eval_rank_cb'])
cls._instances[label] = instance
return instance

def add(self, uid, **attrs):
name, value = self.eval_rank_cb(**attrs)
if name is not None:
self.do_add(name, uid, value)
else:
pass
def do_add(self, rank, id, value):
if _DEBUG:
print "[DEBUG] Ranking.do_add: rank:", rank, " id:", id, " value", value
rank_len = self.conf['rank_len']
rc = self.redis.zadd(rank, value, id)
len = self.redis.zcount(rank, '-inf', '+inf')
if (len - BUF_SIZE) > rank_len:
self.redis.zremrangebyrank(rank, 0, (len - rank_len))
if _DEBUG:
len = self.redis.zcount(rank, '-inf', '+inf')
print "[DEBUG] Ranking.do_add: do remove due to too long, now len =", len
def get(self, rank, len, end=-1):
start = end - len
return self.redis.zrange(rank, start, end, withscores=True)
@classmethod
def parse_config(cls, configs):
conf = {}
conf['label'] = ''
conf['redis_server'] = ''
conf['redis_port'] = -1
conf['redis_db'] = ''
conf['rank_len'] = 1000
if configs.has_key('redis_server'):
conf['label'] = configs['label']
if configs.has_key('redis_server'):
conf['redis_server'] = configs['redis_server']
if configs.has_key('redis_port'):
conf['redis_port'] = int(configs['redis_port'])
if configs.has_key('redis_db'):
conf['redis_db'] = configs['redis_db']
if configs.has_key('rank_size'):
conf['rank_len'] = int(configs['rank_size'])
if configs.has_key('eval_rank_func'):
conf['eval_rank_cb'] = _import_func(configs['eval_rank_func'])
try:
conf['redis'] = redis.StrictRedis(host=conf['redis_server'], \
port=conf['redis_port'], \
db=conf['redis_db'], \
socket_timeout=3)
except Exception,e:
print "Ranking.parse_config.Error:", e
return None
return conf
# 回调接口
# 返回值格式 (rank_name, score)
def testcase1_eval(**kwargs):
# 为每个等级建立一个rank,rank的依据是当前时间
# 实现:搜索指定顶级的玩家列表功能
import time
lv = kwargs['level']
return ('Lv%03d'%lv, time.time())
def testcase1_eval2(**kwargs):
# 建立等级的rank,玩家根据级别大小排列。
lv = kwargs['level']
return ('Level', lv)
def testcase1():
fifo_configs = {
'label' : 'Fifo',
'redis_server': '127.0.0.1',
'redis_port': 6379,
'redis_db': 0,
'rank_len': 20,
'eval_rank_func': 'testcase1_eval',
}
level_configs = {
'label' : 'Level',
'redis_server': '127.0.0.1',
'redis_port': 6379,
'redis_db': 0,
'rank_len': 20,
'eval_rank_func': 'testcase1_eval2',
}
Ranking.init(fifo_configs)
Ranking.init(level_configs)
level_instance = Ranking.instance('Level')
fifo_instance = Ranking.instance('Fifo')
for i in xrange(10000):
uid = "uid%d" % i
level = random.randint(1, 40)
fifo_instance.add(uid, level=level)    # 添加rank数据
level_instance.add(uid, level=level)   # 添加rank数据
data = level_instance.get("Level", 20)     # 获取等级最高的玩家列表(20条)
print "Level:", data
data = fifo_instance.get("Lv007", 20)      # 获取等级为7级的玩家列表(20条)
print "Level:", data
if __name__ == '__main__':
testcase1()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-317239-1-1.html 上篇帖子: Cakephp + Predis使用文档 下篇帖子: Predis的一些操作汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表