婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用Redis實現實時排行榜功能

使用Redis實現實時排行榜功能

熱門標簽:十堰營銷電銷機器人哪家便宜 貴州電銷卡外呼系統 鄭州人工智能電銷機器人系統 北京400電話辦理收費標準 超呼電話機器人 魔獸2青云地圖標注 宿遷便宜外呼系統平臺 山東外呼銷售系統招商 日本中國地圖標注

游戲中存在各種各樣的排行榜,比如玩家的等級排名、分數排名等。玩家在排行榜中的名次是其實力的象征,位于榜單前列的玩家在虛擬世界中擁有無尚榮耀,所以名次也就成了核心玩家的追求目標。

一個典型的游戲排行榜包括以下常見功能:

1. 能夠記錄每個玩家的分數;

2. 能夠對玩家的分數進行更新;

3. 能夠查詢每個玩家的分數和名次;

4. 能夠按名次查詢排名前N名的玩家;

5. 能夠查詢排在指定玩家前后M名的玩家。

更進一步,上面的操作都需要在短時間內實時完成,這樣才能最大程度發揮排行榜的效用。

由于一個玩家名次上升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-cli > redis 127.0.0.1:6379>

如果要使用最新版本,需要到Redis官網([http://redis.io](http://redis.io/))下載最新的代碼自行編譯,步驟略。

## 2\. ZSet的常用命令

有序集合首先是集合,其成員(member)具有唯一性,其次,每個成員關聯了一個分數(score),使得成員可以按照分數排序。關于有序集合的介紹見[http://redis.io/topics/data-types#sorted-sets](http://redis.io/topics/data-types#sorted-sets),其命令見[http://redis.io/commands#sorted_set](http://redis.io/commands#sorted_set)。

下面介紹幾個能用于排行榜的命令。

假設lb為排行榜名稱,user1、user2等為玩家唯一標識。

##### 1) zadd——設置玩家分數

命令格式:***zadd 排行榜名稱 分數 玩家標識*** 時間復雜度:O(log(N))

下面設置了4個玩家的分數,如果玩家分數已經存在,則會覆蓋之前的分數。

> redis 127.0.0.1:6379> zadd lb 89 user1
> (integer) 1
> redis 127.0.0.1:6379> zadd lb 95 user2
> (integer) 1
> redis 127.0.0.1:6379> zadd lb 95 user3
> (integer) 1
> redis 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
> 1) “user3”
> 2) “95”
> 3) “user2”
> 4) “95”
> 5) “user4”
> 6) “90”
> 7) “user1”
> 8) “89”

下面為查詢前三名玩家分數。

> redis 127.0.0.1:6379> zrevrange lb 0 2 withscores
> 1) “user3”
> 2) “95”
> 3) “user2”
> 4) “95”
> 5) “user4”
> 6) “90”

##### 4) zrevrank——查看玩家的排名

命令格式:***zrevrank 排行榜名稱 玩家標識*** 時間復雜度:O(log(N))

與zrevrange類似,zrevrank是以分數由高到低的排序返回玩家排名(實際返回的是以0開始的索引),對應的zrank則是以分數由低到高的排序返回排名。

下面是查詢玩家user3和user4的排名。

> redis 127.0.0.1:6379> zrevrank lb user3
> (integer) 0
> redis 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
> 1) “user4”
> 2) “96”
> 3) “user3”
> 4) “95”
> 5) “user2”
> 6) “95”
> 7) “user1”
> 8) “89”

##### 6) zrem——移除某個玩家

命令格式:***zrem 排行榜名稱 玩家標識*** 時間復雜度:O(log(N))

下面移除玩家user4。

> redis 127.0.0.1:6379> zrem lb user4
> (integer) 1
> redis 127.0.0.1:6379> zrevrange lb 0 -1 withscores
> 1) “user3”
> 2) “95”
> 3) “user2”
> 4) “95”
> 5) “user1”
> 6) “89”

##### 7) del——刪除排行榜

命令格式:***del 排行榜名稱***

排行榜對象在我們首次調用zadd或zincrby時被創建,當我們要刪除它時,調用redis通用的命令del即可。

> redis 127.0.0.1:6379> del lb
> (integer) 1
> redis 127.0.0.1:6379> get lb
> (nil)

## 3\. 相同分數問題

免費的方案總有那么一些不完美。從前面的例子我們可以看到,user2和user3具有相同的分數,但在按分數逆序排序時,user3排在了user2前面。而在實際應用場景中,我們更希望看到user2排在user3前面,因為user2比user3先加入排行榜,也就是說user2先到達該分數。

但Redis在遇到分數相同時是按照集合成員自身的字典順序來排序,這里即是按照”user2″和”user3″這兩個字符串進行排序,以逆序排序的話user3自然排到了前面。

要解決這個問題,我們可以考慮在分數中加入時間戳,計算公式為:

> 帶時間戳的分數 = 實際分數*10000000000 + (9999999999 – timestamp)

timestamp我們采用系統提供的time()函數,也就是1970年1月1日以來的秒數,我們采用32位的時間戳(這能堅持到2038年),由于32位時間戳是10位十進制整數(最大值4294967295),所以我們讓時間戳占據低10位(十進制整數),實際分數則擴大10^10倍,然后把兩部分相加的結果作為zset的分數。考慮到要按時間倒序排列,所以時間戳這部分需要顛倒一下,這便是用9999999999減去時間戳的原因。當我們要讀取玩家實際分數時,只需去掉后10位即可。

初步看起來這個方案還不錯,但這里面有兩個問題。

第一個問題是小問題,采用秒為時間戳可能區分度還不夠,如果同一秒出現兩個分數相同的仍然會出現前面的問題,當然我們可以選擇精度更高的時間戳,但在實際場景中,同一秒誰排前面已經無關緊要。

第二個問題是大問題,因為Redis的分數類型采用的是double,64位雙精度浮點數只有52位有效數字,它能精確表達的整數范圍為-2^53到2^53,最高只能表示16位十進制整數(最大值為9007199254740992,其實連16位也不能完整表示)。這就是說,如果前面時間戳占了10位的話,分數就只剩下6位了,這對于某些排行榜分數來說是不夠用的。我們可以考慮縮減時間戳位數,比如從2015年1月1日開始計時,但這仍然增加不了幾位。或者減少區分度,以分鐘、小時來作為時間戳單位。

如果Redis的分數類型為int64,我們就沒有上面的煩惱。說到這里,其實Redis真應該再額外提供一個int64類型的ZSet,但目前只能是幻想,除非自己改其源碼。

既然Redis也不能完美解決排行榜問題,那最終是不是有必要自己實現一個專門的排行榜數據結構呢?畢竟實際應用中的排行榜有很多可以優化的地方,比玩家呈金字塔分布,越是低分段玩家數量越多,同一分數擁有大量玩家,玩家增加一分都可能超越很多玩家,這就為優化提供了可能。

到此這篇關于使用Redis實現實時排行榜功能的文章就介紹到這了,更多相關Redis實時排行榜內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Java簡單使用redis-zset實現排行榜
  • redis實現排行榜的簡單方法
  • 利用redis實現排行榜的小秘訣
  • 利用Redis的有序集合實現排行榜功能實例代碼
  • 使用Redis實現用戶積分排行榜的教程

標簽:朝陽 吉安 北京 大慶 江蘇 楊凌 果洛 臺州

巨人網絡通訊聲明:本文標題《使用Redis實現實時排行榜功能》,本文關鍵詞  使用,Redis,實現,實時,排行榜,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Redis實現實時排行榜功能》相關的同類信息!
  • 本頁收集關于使用Redis實現實時排行榜功能的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美一区二区三区免费大片| 精品久久久网站| 久久成人18免费观看| jlzzjlzz欧美大全| 日韩午夜电影av| 一区二区三区免费| 久热成人在线视频| 91麻豆高清视频| 国产日韩欧美高清在线| 亚洲一区二区在线观看视频| 丝袜美腿亚洲色图| 色香蕉久久蜜桃| 一区二区三区高清不卡| 国产99久久久国产精品| 国产三级精品视频| 国产sm精品调教视频网站| 国产无遮挡一区二区三区毛片日本| 麻豆国产一区二区| 国产精品视频免费看| 欧美怡红院视频| 国产乱子伦一区二区三区国色天香| wwwwww.欧美系列| 一本大道久久a久久综合婷婷| 亚洲欧美乱综合| 欧美日本在线视频| 国产不卡视频一区二区三区| 成人午夜在线免费| 久久电影国产免费久久电影| 在线视频综合导航| 欧美成人vps| 日韩成人免费在线| 欧美日韩www| 久久综合九色综合97婷婷女人| 精品国产髙清在线看国产毛片| 伊人婷婷欧美激情| 久久国产精品一区二区| 一本色道久久综合亚洲91| 欧美日韩精品二区第二页| 美女诱惑一区二区| 午夜精品免费在线| 午夜精品在线视频一区| 欧美视频精品在线| 91亚洲资源网| 国产精品18久久久久久久网站| 国产精品免费视频一区| 久久综合九色综合欧美98 | 婷婷亚洲久悠悠色悠在线播放| 国产精品超碰97尤物18| 日本一区二区在线不卡| 精品视频123区在线观看| 久久66热偷产精品| 久久亚洲私人国产精品va媚药| 99视频精品全部免费在线| 免费高清在线一区| 日韩成人精品在线| 一区二区三国产精华液| 久久99久久99| 国产精品一区二区在线观看网站| 不卡视频一二三| 日韩亚洲欧美中文三级| 中文字幕在线观看不卡视频| 18成人在线视频| 欧美影院一区二区三区| 久久亚洲精精品中文字幕早川悠里 | 欧美一区二区三区播放老司机| 91片黄在线观看| 欧美成人vps| 亚洲综合在线免费观看| 天天综合色天天| 一本大道久久a久久综合| 日韩一区二区免费视频| 国产精品亚洲成人| 亚洲精品一区二区三区精华液 | 亚洲视频一区在线| 亚洲成人先锋电影| 欧美日韩亚洲不卡| 亚洲国产精品99久久久久久久久| 天堂一区二区在线免费观看| 91蜜桃网址入口| 久色婷婷小香蕉久久| 91久久精品一区二区| 日韩一区在线播放| 国产很黄免费观看久久| 91精品国产aⅴ一区二区| 亚洲色图丝袜美腿| 国产又粗又猛又爽又黄91精品| 色综合 综合色| 亚洲欧洲日韩av| 国产综合色在线视频区| 欧美视频一区二| 亚洲乱码国产乱码精品精98午夜| 精品影院一区二区久久久| 91精品国产福利| 蜜桃一区二区三区在线观看| 日韩一级二级三级| 蜜桃一区二区三区四区| 日韩视频一区二区| 国产在线国偷精品免费看| 日韩精品一区二区三区中文不卡| 日本不卡一二三| 日韩欧美第一区| 99热精品国产| 亚洲国产aⅴ成人精品无吗| 欧美一级片在线看| 国产成人精品1024| 男人的j进女人的j一区| 国产精品九色蝌蚪自拍| 欧美日韩精品系列| 精品在线亚洲视频| 亚洲精品国产视频| 欧美男男青年gay1069videost| 五月天视频一区| 亚洲欧美视频在线观看视频| 日韩欧美不卡一区| 欧美午夜片在线观看| 久久精品国产**网站演员| 国产精品久久久一区麻豆最新章节| 91精品国产91久久久久久最新毛片 | 欧美一区二区三区视频在线| 9色porny自拍视频一区二区| 午夜精品久久久久久不卡8050| 久久久久久久性| 欧美精品一区二区三区蜜臀| 欧美性大战久久久久久久蜜臀| 成人免费视频视频| gogogo免费视频观看亚洲一| 国产一区二区剧情av在线| 久久99精品一区二区三区三区| 国模冰冰炮一区二区| www.欧美色图| 欧美中文字幕一区| 日韩精品一区二| 亚洲欧美一区二区三区孕妇| 亚洲综合视频网| 国产传媒一区在线| 色噜噜狠狠成人网p站| 99久久久无码国产精品| 欧美视频在线观看一区二区| 欧美精品aⅴ在线视频| 久久无码av三级| 亚洲亚洲人成综合网络| 国模娜娜一区二区三区| 在线视频一区二区三| 国产亚洲精品bt天堂精选| 一区二区三区四区激情| 日韩电影一二三区| 91一区一区三区| 久久午夜免费电影| 毛片av一区二区| 欧美日韩视频在线一区二区| 国产精品拍天天在线| 久久99热狠狠色一区二区| 欧美午夜视频网站| 中文字幕日韩欧美一区二区三区| 日韩精品一区第一页| 在线观看免费视频综合| 亚洲天堂2014| 成av人片一区二区| 国产精品乱码一区二区三区软件 | 色8久久精品久久久久久蜜| 精品久久国产字幕高潮| 亚洲成人自拍一区| 欧美人妇做爰xxxⅹ性高电影| 亚洲精品视频一区二区| 欧美中文字幕不卡| 日韩在线a电影| 久久影院午夜片一区| 国产乱国产乱300精品| 久久精品视频一区二区三区| 国产夫妻精品视频| 国产欧美日韩精品一区| 在线影视一区二区三区| 天天色综合成人网| 国产精品久久久久影院| 欧美色偷偷大香| 麻豆精品一区二区| 日韩美女久久久| 日韩欧美成人一区| 91传媒视频在线播放| 美女视频黄 久久| 亚洲一区视频在线| 亚洲国产精品ⅴa在线观看| 欧美日韩国产天堂| 99免费精品在线| 国产精品一二三四| 青青草国产成人av片免费| 99久久伊人精品| 91精品国产综合久久久蜜臀图片| 国产精品色一区二区三区| 亚洲精品视频在线| 99久久国产综合色|国产精品| 日本丶国产丶欧美色综合| 奇米精品一区二区三区在线观看一| 亚洲尤物在线视频观看| 国产精品欧美经典| 亚州成人在线电影| 欧美午夜电影一区| 成人在线综合网| 日韩欧美国产一区在线观看| 国内精品伊人久久久久影院对白|