zoukankan      html  css  js  c++  java
  • 排行榜设计方案总结

    • 方案:运用redis的sorted set 进行实时排序。

    • Sorted set简介: 实现用到了两个数据结构: hash table和skip list。 hash table 是用redis 中的dict来实现,保证了查询效率为 O(1),而skip list 主要是保证元素实时有序,
      insert和remove的操作都是 O(logn)的复杂度。

    • 常用命令:

      1. zadd(key, socre, member) 向名称为key的zset中添加元素member, score用于排序。若已存在,则根据新score更新元素顺序。
      2. zrem(key, member) 删除名称为key的zset中的元素member
      3. zrange(key, startRank, endRank) 返回名称为key的zset(元素已按score从小到大排序) 中index从startRank到endRank之间的所有元素。
      4. zrevrange(key, startRank,endRank) 跟 zrange相似,只是元素是按score从大到小排序。
      5. zrank(key, member) 返回名称为key的zset(元素已按从小到大排序)中member元素的排名(即index,从0开始)
      6. zrevrank(key, member) 跟 zrank相似,只是元素是按score从大到小排序。
      7. zscore(key, member) 返回名称为key的zeset中元素element的score
      8. zrangebyscore(key, min, max) 返回名称为可以的zset中 score >= min 并且 score<= max的所有元素。
    • 具体实现:

      1. score变更处调用 zadd()
      2. 取排行榜数据时,调用 zrange(key, startRank, endRank) 或者 zrevrange (key, startRank, endRank) 取决于排行榜是从小到大还是从大到小。
        返回数据结构是Set 其中Tuple的数据结构是:

        返回元素Tuple 的总个数为: endRank - startRank +1 
        若出现同score的人,先到达score这个分数的人排在前面。
      3. 取自己的排行情况。 调用 zscore 获取自己的分数。 调用zrank(或者zrevrank)获取自己的排名。
      4. 取我周围的排名。更具自己的排名,算出我的上一名或者下一名的排名,再通过 zrang(key, myrank, myrank+1)或者zrang(key, myrank, myrank-1) 取数据,
        注意我的排名是第一名或者最后一名的特殊情况。
      5. 给分数>=score的人发奖。 调用 zrangebyscore()获取所有符合条件的玩家。
  • 相关阅读:
    php获取真实ip地址原理及实现
    关于DateTime计算某个日期过后的多少天之后的日期
    关于get_include_path()和set_include_path()的问题
    LinQ In Action 学习第三章
    LinQ In Action 学习第二章
    LinQ in Action 学习第一章 例子。
    asp.net create windows application and setup service.
    JS alert()、confirm()、prompt()的区别
    php获取用户 地区 、ip地址
    购物车相关 js
  • 原文地址:https://www.cnblogs.com/happySmily/p/5670900.html
Copyright © 2011-2022 走看看