Redis熱數據存儲問題

月初面試,碰到了一個比較實際的問題:

在Mysql數據庫中,每天都會生成10w條數據,但是,由於內存限制,導致了Redis中只能存儲最多1W條的數據信息,如何確保這1w條數據是最熱門的數據?

個人解決方案:

  1. 數據存儲方案:

    既然熱門數據,那麼就需要有排序,使用redis中的zset數據類型是很自然的想法。數據中的某個唯一字段作爲zset中的value,而點擊次數作爲score,記爲click_zset。這樣就可選出最熱門的數據。而數據,則直接用HashMap存儲。

  2. 時效的問題:
    既然只能存1w條數據且需要是熱門數據,那麼,點擊次數是一方面,時效性也是一方面,如何保證?可以另起一個zset,數據的字段爲value,而每次點擊時更新當前時間戳爲其score,記爲time_zset這樣,就可以記錄時間。在後臺跑一個任務,間隔一定時間段刪除兩個zset中長時間沒有發生點擊事件的鍵,並刪除hash數據,爲產生的新數據騰出數據空間。

  3. 新數據產生怎麼辦?
    如果有空間,則保存到自己的hashmap,並將key存到兩個zset中。
    而沒有空間時,就應該在click_zset中取出點擊次數排在最前第1w位後面的鍵,刪除對應的hash數據。然後看這1w個score的值,然後把key放入兩個zset中即可。

  4. 點擊事件產生了怎麼辦?
    點擊事件發生時,讓其在click_zset中的score加1,然後看其在不在前1w個key中,如果在,首先要看該數據是否已經存在redis中,有的話就不用做什麼工作,沒有的話則需要取出第1W個點擊次數最大的key10000,然後刪除key10000所對應的數據,把當前key對應的數據取出存入redis中。

邏輯有點混亂,大致意思是這樣,請大家指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章