前言
游戲中存在各種各樣的排行榜,比如玩家的等級排名、分數排名等。玩家在排行榜中的名次是其實力的象征,位于榜單前列的玩家在虛擬世界中擁有無尚榮耀,所以名次也就成了核心玩家的追求目標。
一個典型的游戲排行榜包括以下常見功能:
更進一步,上面的操作都需要在短時間內實時完成,這樣才能最大程度發揮排行榜的效用。
由于一個玩家名次上升x位將會引起x+1位玩家的名次發生變化(包括該玩家),如果采用傳統數據庫(比如MySQL)來實現排行榜,當玩家人數較多時,將會導致對數據庫的頻繁修改,性能得不到滿足,所以我們只能另想它法。
Redis作為NoSQL中的一員,近年來得到廣泛應用。與Memcached相比,Redis擁有更多的數據類型和操作接口,具有更大的適用范圍,其中的有序集合(sorted set,也稱為zset)就非常適合于排行榜的構建。下面簡要總結一下。
1. Redis的安裝
Ubuntu下安裝Redis非常簡單,執行如下命令即可:
$ sudo apt-get install redis-server
安裝完畢,運行命令行客戶端redis-cli就可以訪問本地redis服務器。
$ redis-cliredis 127.0.0.1:6379>
如果要使用最新版本,需要到Redis官網(redis.io)下載最新的代碼自行編譯,步驟略。
2. ZSet的常用命令
有序集合首先是集合,其成員(member)具有唯一性,其次,每個成員關聯了一個分數(score),使得成員可以按照分數排序。關于有序集合的介紹見redis.io/topics/data…,其命令見redis.io/commands#so…。
下面介紹幾個能用于排行榜的命令。
假設lb為排行榜名稱,user1、user2等為玩家唯一標識。
1) zadd――設置玩家分數
命令格式:zadd 排行榜名稱 分數 玩家標識 時間復雜度:O(log(N))
下面設置了4個玩家的分數,如果玩家分數已經存在,則會覆蓋之前的分數。
redis 127.0.0.1:6379> zadd lb 89 user1(integer) 1redis 127.0.0.1:6379> zadd lb 95 user2(integer) 1redis 127.0.0.1:6379> zadd lb 95 user3(integer) 1redis 127.0.0.1:6379> zadd lb 90 user4(integer) 1
2) zscore――查看玩家分數
命令格式:zscore 排行榜名稱 玩家標識 時間復雜度:O(1)
下面是查看user2這個玩家在lb排行榜中的分數。
redis 127.0.0.1:6379> zscore lb user2“95”
3) zrevrange――按名次查看排行榜
命令格式:zrevrange 排行榜名稱 起始位置 結束位置 [withscores] 時間復雜度:O(log(N)+M)
由于排行榜一般是按照分數由高到低排序的,所以我們使用zrevrange,而命令zrange是按照分數由低到高排序。
起始位置和結束位置都是以0開始的索引,且都包含在內。如果結束位置為-1則查看范圍為整個排行榜。
帶上withscores則會返回玩家分數。
下面為查看所有玩家分數。
redis 127.0.0.1:6379> zrevrange lb 0 -1 withscores“user3”“95”“user2”“95”“user4”“90”“user1”“89”
下面為查詢前三名玩家分數。
redis 127.0.0.1:6379> zrevrange lb 0 2 withscores“user3”“95”“user2”“95”“user4”“90”
4) zrevrank――查看玩家的排名
命令格式:zrevrank 排行榜名稱 玩家標識 時間復雜度:O(log(N))
與zrevrange類似,zrevrank是以分數由高到低的排序返回玩家排名(實際返回的是以0開始的索引),對應的zrank則是以分數由低到高的排序返回排名。
下面是查詢玩家user3和user4的排名。
redis 127.0.0.1:6379> zrevrank lb user3(integer) 0redis 127.0.0.1:6379> zrevrank lb user1(integer) 3
5) zincrby――增減玩家分數
命令格式:zincrby 排行榜名稱 分數增量 玩家標識 時間復雜度:O(log(N))
有的排行榜是在變更時重新設置玩家的分數,而還有的排行榜則是以增量方式修改玩家分數,增量可正可負。如果執行zincrby時玩家尚不在排行榜中,則認為其原始分數為0,相當于執行zdd。
下面將user4的分數增加6,使其名次上升到第一位。
redis 127.0.0.1:6379> zincrby lb 6 user4“96”redis 127.0.0.1:6379> zrevrange lb 0 -1 withscores“user4”“96”“user3”“95”“user2”“95”“user1”“89”
6) zrem――移除某個玩家
命令格式:zrem 排行榜名稱 玩家標識 時間復雜度:O(log(N))
下面移除玩家user4。
redis 127.0.0.1:6379> zrem lb user4(integer) 1redis 127.0.0.1:6379> zrevrange lb 0 -1 withscores“user3”“95”“user2”“95”“user1”“89”
7) del――刪除排行榜
命令格式:del 排行榜名稱
排行榜對象在我們首次調用zadd或zincrby時被創建,當我們要刪除它時,調用redis通用的命令del即可。
redis 127.0.0.1:6379> del lb(integer) 1redis 127.0.0.1:6379> get lb(nil)
3. 相同分數問題
免費的方案總有那么一些不完美。從前面的例子我們可以看到,user2和user3具有相同的分數,但在按分數逆序排序時,user3排在了user2前面。而在實際應用場景中,我們更希望看到user2排在user3前面,因為user2比user3先加入排行榜,也就是說user2先到達該分數。
但Redis在遇到分數相同時是按照集合成員自身的字典順序來排序,這里即是按照”user2″和”user3″這兩個字符串進行排序,以逆序排序的話user3自然排到了前面。
要解決這個問題,我們可以考慮在分數中加入時間戳,計算公式為:
帶時間戳的分數 = 實際分數*10000000000 + (9999999999 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
777国产偷窥盗摄精品视频| 中文字幕国产亚洲| 欧美有码在线观看视频| 日韩在线视频免费观看| 久久久视频免费观看| 色综合久久中文字幕综合网小说| 国产精品网红福利| 色综合亚洲精品激情狠狠| 国产精品伦子伦免费视频| 狠狠综合久久av一区二区小说| 26uuu国产精品视频| 欧美中文字幕在线播放| 日韩精品一区二区三区第95| 亚洲一区二区中文字幕| 亚洲国内精品视频| 隔壁老王国产在线精品| 成人精品一区二区三区| 亚洲**2019国产| 国产精品麻豆va在线播放| 国产午夜精品久久久| 久久综合国产精品台湾中文娱乐网| 亚洲精品av在线| 国产丝袜精品视频| 国产精品大片wwwwww| 97国产真实伦对白精彩视频8| 中国人与牲禽动交精品| 性色av一区二区三区| 日韩欧美中文字幕在线播放| 国内精品久久久久影院优| www.日韩免费| 2019亚洲日韩新视频| 国产人妖伪娘一区91| 国产精品久久久久久av福利| 国产精品视频自拍| 中文国产成人精品久久一| 国产精品一区专区欧美日韩| 国产成人亚洲综合91精品| 久久躁日日躁aaaaxxxx| 日韩欧美国产骚| 中文字幕无线精品亚洲乱码一区| 国内揄拍国内精品少妇国语| 91久久精品国产| 午夜精品久久久久久久99热| 国产精品91视频| 国产香蕉97碰碰久久人人| 成人久久一区二区| 欧美国产精品人人做人人爱| 亚洲区bt下载| 久久久亚洲影院| 91精品国产色综合| 国产一区欧美二区三区| 久久久人成影片一区二区三区观看| 国产精品欧美日韩久久| 亚洲图中文字幕| 久久综合色影院| 欧美日韩高清区| 欧美日韩精品在线视频| 国产精品精品视频一区二区三区| 国产成人精品免费视频| 亚洲影视九九影院在线观看| 欧美一级黑人aaaaaaa做受| www.久久色.com| 亚洲成av人乱码色午夜| 国外成人在线播放| 91av在线免费观看视频| 在线视频日韩精品| 伦理中文字幕亚洲| 亚洲欧洲激情在线| 亚洲激情自拍图| 日韩av在线精品| 91精品在线观| 国语自产精品视频在线看| 欧美国产日本在线| 日韩国产精品一区| 九九热99久久久国产盗摄| 国内揄拍国内精品| 粗暴蹂躏中文一区二区三区| 日本在线观看天堂男亚洲| 日韩欧美在线观看| 神马久久久久久| 午夜精品一区二区三区在线| 91精品国产高清久久久久久久久| 亚洲电影在线观看| 国产精自产拍久久久久久蜜| 欧美日韩中文在线| 影音先锋欧美在线资源| 2019最新中文字幕| 午夜精品一区二区三区在线视频| 中文字幕精品网| 午夜精品国产精品大乳美女| 欧美日韩亚洲系列| 日韩一区二区福利| 欧美性猛交xxxx免费看| 97超碰国产精品女人人人爽| 久久久久久国产精品久久| 北条麻妃久久精品| 欧美最顶级丰满的aⅴ艳星| 国产精品高潮呻吟视频| 色哟哟入口国产精品| 久久这里只有精品99| 欧美日韩国产区| 欧美大荫蒂xxx| 国产精品日韩欧美| 亚洲有声小说3d| 亚洲第一天堂无码专区| 日韩av日韩在线观看| 欧美日韩激情网| 日韩国产精品视频| 日韩视频在线免费观看| 亚洲精品久久久久久久久久久久久| 亚洲天堂视频在线观看| 亚洲国产精久久久久久久| 国产精品久久精品| 亚洲精品有码在线| 精品国产一区二区三区久久久| 91精品视频观看| 亚洲va国产va天堂va久久| 精品久久香蕉国产线看观看gif| 欧美黄色三级网站| 午夜精品久久久久久久久久久久久| 亚洲成年人影院在线| 最近2019中文字幕大全第二页| 久久久久九九九九| 亚洲韩国日本中文字幕| 亚洲丝袜在线视频| 久久亚洲精品一区二区| 日韩一区二区av| 亚洲电影天堂av| 欧美国产精品va在线观看| 国产偷国产偷亚洲清高网站| 亚洲人在线观看| 国产亚洲视频中文字幕视频| 亚洲一区中文字幕| 日日骚av一区| 色噜噜狠狠狠综合曰曰曰| 国产一区二区三区视频免费| 亚洲女人被黑人巨大进入al| 日韩精品在线观看一区| 国产成人精品在线视频| 51色欧美片视频在线观看| 国产成人精品电影| 最近2019中文字幕大全第二页| 精品丝袜一区二区三区| 一本一道久久a久久精品逆3p| 在线观看视频99| 国产成人av在线播放| 在线看日韩欧美| 欧美国产日韩免费| 欧美日韩国产在线播放| 亚洲精品成人久久久| 91精品国产91久久久久久最新| 亚洲欧美国产另类| 亚洲国产另类久久精品| 国产精品久久久久久av下载红粉| 精品色蜜蜜精品视频在线观看| 亚洲国产精品成人av| 777777777亚洲妇女| 亚洲深夜福利在线| 九九热精品视频| 亚洲视频在线观看免费| 久久久久国产精品免费网站| 欧美日韩亚洲91| 亚洲天堂成人在线视频| 久久久久久久影院|