list類型的應用場景 —— Redis實戰經驗


  

  list類型是簡單的字符串列表,按照插入順序排序。每個列表最多可以存儲 232 - 1 個元素(40多億) ,list類型主要有以下應用場景。。

  1. 消息隊列

  list類型的lpop和rpush(或者反過來,lpush和rpop)能實現隊列的功能,故而可以用Redis的list類型實現簡單的點對點的消息隊列。不過我不推薦在實戰中這么使用,因為現在已經有Kafka、NSQ、RabbitMQ等成熟的消息隊列了,它們的功能已經很完善了,除非是為了更深入地理解消息隊列,不然我覺得沒必要去重復造輪子。

  2. 排行榜

  list類型的lrange命令可以分頁查看隊列中的數據。可將每隔一段時間計算一次的排行榜存儲在list類型中,如京東每日的手機銷量排行、學校每次月考學生的成績排名、斗魚年終盛典主播排名等,下圖是酷狗音樂“K歌擂台賽”的昨日打擂金曲排行榜,每日計算一次,存儲在list類型中,接口訪問時,通過page和size分頁獲取打擂金曲。(打個小廣告,酷狗音樂“K歌擂台賽”每天都能產生一批優質翻唱作品,對普通人優質歌聲有興趣的朋友不妨來聽聽)。

    

  但是,並不是所有的排行榜都能用list類型實現,只有定時計算的排行榜才適合使用list類型存儲,與定時計算的排行榜相對應的是實時計算的排行榜,list類型不能支持實時計算的排行榜,之后在介紹有序集合sorted set的應用場景時會詳細介紹實時計算的排行榜的實現。

  3. 最新列表

  list類型的lpush命令和lrange命令能實現最新列表的功能,每次通過lpush命令往列表里插入新的元素,然后通過lrange命令讀取最新的元素列表,如朋友圈的點贊列表、評論列表。

  但是,並不是所有的最新列表都能用list類型實現,因為對於頻繁更新的列表,list類型的分頁可能導致列表元素重復或漏掉,舉個例子,當前列表里由表頭到表尾依次有(E,D,C,B,A)五個元素,每頁獲取3個元素,用戶第一次獲取到(E,D,C)三個元素,然后表頭新增了一個元素F,列表變成了(F,E,D,C,B,A),此時用戶取第二頁拿到(C,B,A),元素C重復了。只有不需要分頁(比如每次都只取列表的前5個元素)或者更新頻率低(比如每天凌晨更新一次)的列表才適合用list類型實現。對於需要分頁並且會頻繁更新的列表,需用使用有序集合sorted set類型實現。另外,需要通過時間范圍查找的最新列表,list類型也實現不了,也需要通過有序集合sorted set類型實現,如以成交時間范圍作為條件來查詢的訂單列表。之后在介紹有序集合sorted set類型的應用場景時會詳細介紹sorted set類型如何實現最新列表。

 

  那么問題來了,對於排行榜和最新列表兩種應用場景,list類型能做到的sorted set類型都能做到,list類型做不到的sorted set類型也能做到,那為什么還要使用list類型去實現排行榜或最新列表呢,直接用sorted set類型不是更好嗎?原因是sorted set類型占用的內存容量是list類型的數倍之多(之后會在容量章節詳細介紹),對於列表數量不多的情況,可以用sorted set類型來實現,比如上文中舉例的打擂金曲排行榜,每天全國只有一份,兩種數據類型的內存容量差距可以忽略不計,但是如果要實現某首歌曲的翻唱作品地區排行榜,數百萬的歌曲,300多個地區,會產生數量龐大的榜單,或者數量更加龐大的朋友圈點贊列表,就需要慎重地考慮容量的問題了。

 

  list類型的常用命令可參考http://www.runoob.com/redis/redis-lists.html

 

  加入list類型的應用場景后的思維導圖如下。

   

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM