亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

利用redis實現排行榜的小秘訣

2020-10-28 21:30:47
字體:
來源:轉載
供稿:網友

前言

排行榜作為互聯網應用中幾乎必不可少的一個元素,其能夠勾起人類自身對比的欲望,從而來增加商品的銷量。

對于排行榜的需求,redis有一個數據結構非常適合做這件事,那就是有序集合(sorted set)。

在日常一些簡單的活動開發中,我經常會碰到需要對用戶的分值等進行排行,此時一般會選擇redis的有序集合對用戶的分數進行存儲,但是不同的場景排行榜的方式也略有不同,以下根據自己日常的開發進行了一下歸納總結

Redis 有序集合(sorted set)

首先簡單介紹下什么是有序集合。

Redis 的Sorted Set 是 String 類型的有序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。

每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

有序集合的成員是唯一的,但分數(score)卻可以重復。

集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。

應用場景

場景一:用戶得分越高,排行越前面

這是一種最簡單基本的應用場景,使用的命令和基本操作如下:

ZADD:添加or更新成員分數

命令參數:ZADD key score member [[score member] [score member] ...]

將一個或多個 member 元素及其 score 值加入到有序集 key 當中。

如果某個 member 已經是有序集的成員,那么更新這個 member 的 score 值,并通過重新插入這個 member 元素,來保證該 member 在正確的位置上。

score 值可以是整數值或雙精度浮點數。

如果 key 不存在,則創建一個空的有序集并執行 ZADD 操作。

當 key 存在但不是有序集類型時,返回一個錯誤。

示例:

// 假設用戶A(user1)當前游戲的分數為50,則ZADD user_rank 50 user1 // 添加用戶B(user2)當前游戲的分數為60、用戶C(user3)當前游戲的分數為70,則可批量操作ZADD user_rank 60 user2 70 user3 // 同時添加user2、user3 兩個用戶的分數,分別為 2、3

ZREVRANK:獲取成員當前的排名

命令參數:ZREVRANK key member

返回有序集 key 中成員 member 的排名。其中有序集成員按 score 值遞減(從大到小)排序。

排名以 0 為底,也就是說, score 值最大的成員排名為 0 。

示例:

// 獲取用戶A當前的排名ZREVRANK user_rank user1 // user1 當前排名為第三,則輸出 2

ZSCORE:獲取用戶排名

命令參數:ZSCORE key member

返回有序集 key 中,成員 member 的 score 值。

如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil 。

示例:

// 獲取用戶A當前的排名ZSCORE user_rank user1 // user1 當前分數為50,則輸出 "50" #注意返回值是字符串

場景二:用戶游戲中花費的時間最短,排行越前面

這也算一種最簡單基本的應用場景,使用的命令和基本操作和場景一差不多,除了獲取排名的命令不一樣之外:

ZRANK:獲取成員當前的排名

命令參數:ZRANK key member

返回有序集 key 中成員 member 的排名。其中有序集成員按 score 值遞增(從小到大)順序排列。

排名以 0 為底,也就是說, score 值最小的成員排名為 0 。

如何處理以上兩個場景中用戶分數相同的情況

如果兩個用戶score相同,redis如何排序呢

在score相同的情況下,redis使用字典排序

那什么是字典排序呢?相信下圖就可以解答到這個疑問

在score相同的情況下,redis使用字典排序,而所謂的字典排序其實就是“ABCDEFG”、"123456..."這樣的排序,在首字母相同的情況下,redis會再比較后面的字母,還是按照字典排序

場景一:用戶得分越高,排行越前面,如果分數相同情況下,先達成該分數的用戶排前面

此場景下,我們需要更改用戶的分數構成,具體思路如下:

  • 分數相同,用戶完成游戲的時間戳也加入到score值的構成中
  • 先達成該分數的用戶排前面,即游戲所得分數相同的情況下,時間戳越小,越排前
  • 如果我們簡單地把score結構由:分數+''+時間戳 拼湊,因為分數越大越靠前,而時間戳越小則越靠前,這樣兩部分的判斷規則是相反的,無法簡單把兩者合成一起成為用戶的score
  • 但是我們可以逆向思維,可以用同一個足夠大的數MAX減去時間戳,時間戳越小,則得到的差值越大,這樣我們就可以把score的結構改為:分數+''+(MAX-時間戳),這樣就能滿足我們的需求了
  • 如果使用整數作為score,有一點需要注意的是,js中最大的整數為:

Math.pow(2, 53) - 1 // 9007199254740991 ,16位數

時間戳已經占用了13位數了,因此留給我們保存用戶的真正分數的只剩下3位數了

所以最好使用雙精度浮點數類型作為score

因此,最好的score結構為:分數+'.'+時間戳,變為浮點數

場景二:用戶完成游戲時間最短,排行越前面,如果完成游戲時間相同情況下,先達到該記錄的用戶排前面

此場景下,我們也需要更改用戶的score構成,具體思路如下:

  • 完成游戲時間相同,用戶完成游戲的時間戳也加入到score值的構成中
  • 游戲時間相同,先達到該記錄用戶排前面,即游戲所得分數相同的情況下,時間戳越小,越排前
  • 游戲時間越小越靠前,而時間戳越小也越靠前,這樣兩部分的判斷規則是一致的,我們可以把兩者合一起拼湊成score:分數+'.'+時間戳 即可
  • 則用戶score越小,用戶排名越前

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲永久在线观看| 欧美日韩一区二区三区| 欧美黄色小视频| 久久精品久久久久久| 亚洲精品电影在线观看| 国产一区二区三区中文| 国产欧美精品日韩| 中文字幕av一区中文字幕天堂| 日韩精品免费在线播放| 91久久精品国产91性色| 亚洲精品美女在线观看| 日韩成人久久久| 黑人巨大精品欧美一区免费视频| 国产精品视频地址| www.久久撸.com| 国产专区精品视频| 久久久久久久999| 国产在线精品播放| 在线观看精品国产视频| 成人精品一区二区三区| 亚洲精品97久久| 日韩中文字幕在线观看| 亚洲精品国产suv| 国产91|九色| 欧美精品videosex牲欧美| 日韩免费av一区二区| 久久久久久久久中文字幕| 亚洲国产天堂久久综合网| 国产精品久久久久久av福利| 成人中文字幕+乱码+中文字幕| 欧美黑人性视频| www.99久久热国产日韩欧美.com| 亚洲电影第1页| 国产日韩欧美电影在线观看| 亚洲成人精品久久| 色综合视频一区中文字幕| 日韩成人在线免费观看| 成人免费直播live| 亚洲欧洲国产伦综合| 亚洲亚裔videos黑人hd| 色婷婷成人综合| 欧美日韩国产中文精品字幕自在自线| 亚洲人成毛片在线播放| 欧美激情一二三| 久久久国产视频| 91精品成人久久| 日韩大陆欧美高清视频区| 狠狠色狠狠色综合日日小说| 91亚洲精品视频| 久久久最新网址| 国产精品久久久久久亚洲调教| 国产精品偷伦免费视频观看的| 91禁外国网站| 亚洲一级免费视频| 欧美日韩国产精品专区| 日韩精品亚洲精品| 一区二区三区视频在线| 久久理论片午夜琪琪电影网| 欧美影院成年免费版| 日韩av在线网站| 中文字幕在线成人| 色偷偷噜噜噜亚洲男人| 国产精品6699| 亚洲人在线视频| 久久久久久久久综合| 欧美极品少妇与黑人| 亚洲女性裸体视频| 亚洲最大中文字幕| 日韩视频第一页| 欧美日韩一区二区精品| 久久久久女教师免费一区| 亚洲级视频在线观看免费1级| 欧美不卡视频一区发布| 亚洲欧美日韩中文视频| 亚洲最新av在线| 海角国产乱辈乱精品视频| 国产91精品不卡视频| 亚洲一区二区精品| 国产精品美女免费看| 中文字幕欧美亚洲| 日韩中文有码在线视频| 国产性色av一区二区| 成人免费自拍视频| 色系列之999| 日韩欧美在线网址| 永久免费看mv网站入口亚洲| www国产亚洲精品久久网站| 亚洲国产精品成人va在线观看| 久久成人在线视频| 亚洲新声在线观看| 国产精品日韩在线播放| 日韩在线观看免费网站| 亚洲女性裸体视频| 国产精品免费久久久久影院| 日韩中文字幕在线视频| 国产精品老女人视频| 亚洲免费人成在线视频观看| 日韩精品免费在线观看| 91免费国产网站| 国产一区二区三区在线视频| 91精品综合久久久久久五月天| 日韩av中文在线| 国产亚洲成精品久久| 国产伦精品一区二区三区精品视频| 欧美日韩国内自拍| 色妞在线综合亚洲欧美| 成人观看高清在线观看免费| 亚洲天天在线日亚洲洲精| 91地址最新发布| 欧美激情视频免费观看| 欧美午夜无遮挡| 成人久久一区二区| 精品国内自产拍在线观看| 国产一区二区日韩精品欧美精品| 91精品啪在线观看麻豆免费| 国产精品成人在线| 中文字幕精品在线| 国产精品jizz在线观看麻豆| 国产欧美精品在线| 57pao国产精品一区| 欧美老女人性视频| 一区二区三区回区在观看免费视频| 欧美福利视频在线| 久久97精品久久久久久久不卡| 欧美性猛交丰臀xxxxx网站| 不卡在线观看电视剧完整版| 亚洲aⅴ男人的天堂在线观看| 日韩一区二区欧美| 日韩欧美高清视频| 久久久精品一区二区三区| 欧美日韩国产一区二区三区| 国产精品久久久久久久7电影| 亚洲天堂男人天堂女人天堂| 91免费人成网站在线观看18| 美女999久久久精品视频| 国产精品男女猛烈高潮激情| 91超碰caoporn97人人| 久久久精品一区二区| 国产精品吹潮在线观看| 国产亚洲精品久久久久动| 精品毛片网大全| 91精品国产乱码久久久久久久久| 亚洲激情视频在线播放| 欧美日韩一区二区在线| 亚洲国产精品久久久久| 日韩电影在线观看中文字幕| 国产欧美日韩91| 在线视频欧美日韩| 黑丝美女久久久| 欧美精品www| 久久福利视频导航| 精品视频在线播放色网色视频| 欧美日韩一区二区免费在线观看| 国产国语videosex另类| 亚洲欧美国产制服动漫| 国产一区二区三区视频在线观看| 久久免费高清视频| 91视频免费网站| 欧美精品福利视频| 91精品视频观看| 亚洲综合在线中文字幕| 欧美色欧美亚洲高清在线视频| 久久久久一本一区二区青青蜜月| 久久精品久久久久|