三、如何使redis中存放的都是熱點數據?

一、場景:

數據庫中有2000w數據,而redis中只有100w數據,如何保證redis中存放的都是熱點數據?

二、方案

  1. 限定redis佔用的內存,redis會根據自身數據淘汰策略,留下熱數據到內存。所以可以計算100w數據大約佔用的內存,

  2. 然後設置一下redis內存限制即可,並將淘汰策略設置爲allkeys-lru或者volatile-lru.

  3. 設置redis最大佔用內存:

    打開redis配置文件,設置maxmemory參數,maxmemory是bytes字節類型哦!

     maxmemory 268435456
    

    設置過期策略:

     maxmemory-policy volatile-lru
    

三、原理

當redis使用的內存超過設置的最大內存時,會觸發redis的key淘汰機制,在redis3.0中的6中淘汰策略如下:

  1. noeviction :不刪除策略。當達到最大內存限制時,如果需要使用更多內存,則直接返回錯誤信息(redis默認淘汰策略)

  2. allkeys-lru:在所有key中優先刪除最近最少使用(less recently used,LRU)的key。

  3. allkeys-random:在所有key中隨機刪除一部分key

  4. volatile-lru: 在設置了超時時間(expire)的key中優先刪除最近最少使用的key

  5. volatile-random:在設置了超時時間的key中隨機刪除一部分key

  6. volatile-ttl: 在設置了超時時間的key中優先刪除剩餘時間(time to live,TTL)的key

四、應用

  1. redis用作緩存
    提供一種簡單實現緩存失效的思路: LRU(最近少用的淘汰)
    即redis的緩存每命中一次,就給命中的緩存增加一定ttl(過期時間)(根據具體情況來設定, 比如10分鐘).
    一段時間後, 熱數據的ttl都會較大, 不會自動失效, 而冷數據基本上過了設定的ttl就馬上失效了.
  2. 過去24h活躍用戶
    比如用戶數據。數據庫有2000w條。使用 redis sortSet裏 放兩天內(爲方便取一天內活躍用戶)登錄過的用戶,登錄一次ZADD一次,如set已存在則覆蓋其分數(登錄時間)。鍵:login:users,值:分數 時間戳、value userid。設置一個週期任務,比如每天03:00:00點刪除sort set中前一天3點前的數據(保證set不無序增長、留近一天內活躍用戶)。

取時,拿到當前時間戳(int 10位),再減1天就可按分數範圍取過去24h活躍用戶。

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