摘要:我們要維護一個公平的排行榜。舉個例子用戶分最后加分用戶分最后加分那么按照排行榜的規定來算,用戶要排在用戶之前。所以說,如果活動周期在天以內的話,那么我們就可以使用加活動結束時間作為數字來保證排行榜的順序正確。
嚴格的排行榜
一個嚴格的排行榜,必須要滿足每個人的排序都是有實際意義的,簡單來說就是即使兩個人的分數一樣,那么也要分出先后來。
活動周期在92天以內的話,那么我們就可以使用200w加活動結束時間作為數字A來保證排行榜的順序正確
在很大的活動中,比如獎項很大,第10名和第11名,可能獎金的額度相差了幾萬、幾千。這個時候我們在做處理的時候就要小心了。我們要維護一個公平的排行榜。為了滿足這樣一個排行榜,我們需要在score的后面添加一個時間戳相關的系數。舉個例子:
用戶a 100 分 14:00 最后加分 用戶b 100 分 14:20 最后加分 那么按照排行榜的規定來算,用戶a要排在用戶b之前。 但是我們在進行排行的時候,不能將時間直接加到分數后面,否則就排序反了,這個時候我們要用一個足夠大的數A來減去時間戳,并且要保證位數在整個活動期間不變。
首先我們要理解一個redis的排序,redis的zset中的score值為double類型,精度只有16位,事實上在存儲9999999999999999 16位整數的時候,會變為17位的10000000000000000,超過17位會變為科學計數法1e+17。
在活動中,我們要保證用戶的分數不能丟失,所以必須保證在16位以內,一個用戶最多的粉絲是5000w如果一個活動期間能保證所有的用戶給他刷分,那么可能是億級別的,但是實際上按照之前的活動量來看,最多能到千萬級別。
這個時候我們按照1億來算,長度要保證在9位,然后剩下的排重用的時間戳的精度,要保證在7位,也就是說我們要保證整個活動期間足夠大的數減去時間戳的開始時間和結束時間都是7位數。
首先保證數字A-結束時間為一個7位數 ,那么我們要給這個結束時間+1000000 (一百萬) 得到數字A,這樣能最低限度保證活動結束之前時間戳系數的位數不變為7位數。
然后我們要保證數字A-活動開始時間也是一個七位數,也就是說開始時間和結束時間之間的跨度只能是900w,一旦超過900w,那么數字A減去開始時間就會得到一個8位數。
但是100w是一個臨界點,我們100w和結束時間相加得到數字A,可能會因為活動結束時間的延長導致效果變成了為結束時間+99w 得到數字A,這個時候,活動最后結束的分數系數的位數就變為了6位,這簡直就是個災難。
所以我們將100w擴大為200w,這樣相應的就給活動的結束時間增加了(100w/3600/24 = 11)天的時間。但是得到的效果將 活動的跨度周期減小到了800w秒,也就是(8000000/86400=92)天。所以說,如果活動周期在92天以內的話,那么我們就可以使用200w加活動結束時間作為數字A來保證排行榜的順序正確。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25974.html
摘要:持久化到中反向代理的負載均衡基于的集群搭建如何實現從中訂閱消息轉發到客戶端的擴展是阻塞式,使用訂閱發布模式時,會導致整個進程進入阻塞。緩存是用于解決高并發場景下系統的性能及穩定性問題的銀彈。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序員 Salvatore Sanfilippo(昵稱:a...
摘要:前言實現一個排版榜,我們通常想到的就是的簡單粗暴就擼出來了。刪除直接使用的命令分數設計回到排行榜的實現,要利用結構來實現的話,重要的是如何設計分數。分析一下排行榜單的設計。實現如下如果排行榜的設計按兩個維度比如金幣數量和用時。 1 前言 實現一個排版榜,我們通常想到的就是mysql的order by 簡單粗暴就擼出來了。但是這樣真的優雅嗎? 數據庫是系統的瓶頸,這是眾所周知的。如果給你...
摘要:所以查閱官方文檔以及他人造好的輪子,總結了一些面試和學習中你必須掌握的問題。在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。 昨天寫了一篇自己搭建redis集群并在自己項目中使用的文章,今天早上看別人寫的面經發現redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結了一些redis面試和學習中你必須掌握的問題。...
閱讀 1438·2021-09-28 09:44
閱讀 2501·2021-09-28 09:36
閱讀 1144·2021-09-08 09:35
閱讀 1982·2019-08-29 13:50
閱讀 810·2019-08-29 13:29
閱讀 1130·2019-08-29 13:15
閱讀 1724·2019-08-29 13:00
閱讀 2988·2019-08-26 16:16