author:pako
email:[email protected]
最近專案有很多功能要做類似排行榜的功能,當然其實用python來做不難,不過因為排行榜的資料是要做持久化存在資料庫裡的,如果每次用sql 去查詢在做排序 當資料量多起來後會效能很差,而且畢竟還要自己去寫相應的操作特別是要查詢乙個資料前後名次的資料會很繁瑣。
當然我寫這篇文章就是因為發現了乙個好用的工具,它就是redis自帶的set型別。
我就不詳細解釋set是什麼能做什麼了,直接上**更能幫助大家理解,有興趣的可以自己去redis的官網看詳細的set型別所支援的操作。
1)使用zadd 方法往test 這個set型別裡插入了五條資料
key score
one 78
two 987
three 45
four 93
five 100
redis 127.0.0.1:6379> zadd test 78 "one"
(integer) 1
redis 127.0.0.1:6379> zadd test 987 "two"
(integer) 1
redis 127.0.0.1:6379> zadd test 45 "three"
(integer) 1
redis 127.0.0.1:6379> zadd test 93 "four"
(integer) 1
redis 127.0.0.1:6379> zadd test 100 "five"
(integer) 1
key 就是我們用來顯示的人名
score 就是我們排行榜用來排序的分數
2)按分數倒序獲取名次的排序結果
更陣列一樣 從0開始 -1表示倒數第幾
redis 127.0.0.1:6379> zrevrange test 0 -1
1) "two"
2) "five"
3) "four"
4) "one"
5) "three"
如果你用的是python的redis庫 那麼返回的就是乙個list物件
3)查詢某人的分數
redis 127.0.0.1:6379> zscore test one
"78"
4)查詢某人的名次(分數倒序)
redis 127.0.0.1:6379> zrevrank test one
(integer) 3
3的意思是第四名
5)更新沒人的分數同樣適用zadd
redis 127.0.0.1:6379> zadd test 99 one
(integer) 0
redis 127.0.0.1:6379> zscore test one
"99"
6)刪除某人資料
redis 127.0.0.1:6379> zrem test one
(integer) 1
因為redis是帶有持久化存數功能,並且它資料是在記憶體中操作,所以效能上沒有什麼問題,基本更排行榜有關的操作 zset這個資料型別都能滿足你需求了,沒必要自己在造輪子了。
redis zset做排行榜
直播運營活動中經常會有這樣的需求,根據使用者送禮情況做排名。這個排行榜具有以下特點 使用者每次請求會返回使用者的排名 送禮金額越多粉絲排名越靠前 相同金額送禮越早越靠前 排行榜會隨著粉絲送禮變化而不斷變化 表結構 create table user id int 10 not null commen...
mysql製作排行榜 mysql實現排行榜
博主新人一枚,大家可以提出自己的寶貴意見。下來我們進入正題。大家首先要了解介面的場景,再就是排行榜的規則,我們這裡說的中國式排行榜。排行榜總結了一下分為3種 中國式排行 非中國式排行1 非中國式排行2 1 1 1 2 2 2 2 2 3 3 4 4 3 5 5 4 5 6 5 7 7 select ...
奧運排行榜
每年奧運會各大 都會公布乙個排行榜,但是細心的讀者發現,不同國家的排行榜略有不同。比如中國金牌總數列第一的時候,中國 就公布 金牌榜 而美國的獎牌總數第一,於是美國 就公布 獎牌榜 如果人口少的國家公布乙個 國民人均獎牌榜 說不定非洲的國家會成為榜魁 現在就請你寫乙個程式,對每個前來諮詢的國家按照對...