一、場景:
資料庫中有2000w資料,而redis中只有100w資料,如何保證redis中存放的都是熱點資料?
二、方案
限定redis占用的記憶體,redis會根據自身資料淘汰策略,留下熱資料到記憶體。所以可以計算100w資料大約占用的記憶體,
然後設定一下redis記憶體限制即可,並將淘汰策略設定為allkeys-lru或者volatile-lru.
設定redis最大占用記憶體:
開啟redis配置檔案,設定maxmemory引數,maxmemory是bytes位元組型別哦!
maxmemory 268435456
設定過期策略:
maxmemory-policy volatile-lru
三、原理
當redis使用的記憶體超過設定的最大記憶體時,會觸發redis的key淘汰機制,在redis3.0中的6中淘汰策略如下:
noeviction :不刪除策略。當達到最大記憶體限制時,如果需要使用更多記憶體,則直接返回錯誤資訊(redis預設淘汰策略)
allkeys-lru:在所有key中優先刪除最近最少使用(less recently used,lru)的key。
allkeys-random:在所有key中隨機刪除一部分key
volatile-lru: 在設定了超時時間(expire)的key中優先刪除最近最少使用的key
volatile-random:在設定了超時時間的key中隨機刪除一部分key
volatile-ttl: 在設定了超時時間的key中優先刪除剩餘時間(time to live,ttl)的key
四、應用
redis用作快取
提供一種簡單實現快取失效的思路: lru(最近少用的淘汰)
即redis的快取每命中一次,就給命中的快取增加一定ttl(過期時間)(根據具體情況來設定, 比如10分鐘).
一段時間後, 熱資料的ttl都會較大, 不會自動失效, 而冷資料基本上過了設定的ttl就馬上失效了.
過去24h活躍使用者
比如使用者資料。資料庫有2000w條。使用 redis sortset裡 放兩天內(為方便取一天內活躍使用者)登入過的使用者,登入一次zadd一次,如set已存在則覆蓋其分數(登入時間)。鍵:login:users,值:分數 時間戳、value userid。設定乙個週期任務,比如每天03:00:00點刪除sort set中前一天3點前的資料(保證set不無序增長、留近一天內活躍使用者)。
取時,拿到當前時間戳(int 10位),再減1天就可按分數範圍取過去24h活躍使用者。
如何保證Redis中的資料都是熱點資料
redis 提供 6 種資料淘汰策略 1.volatile lru 從已設定過期時間的資料集 server.db i expires 中挑選最近最少使用的資料淘汰 常用 2.volatile ttl 從已設定過期時間的資料集 server.db i expires 中挑選將要過期的資料淘汰 3.vo...
如何保證Redis中存的都是熱點資料?
具體的可以看之前的這篇部落格,考的就是redis的逐出演算法。達到最大記憶體後的,對被挑選出來的資料進行刪除的策略 影響資料逐出的相關配置 檢測易失資料 可能會過期的資料集server.db i expires volatile lru 挑選最近最少使用的資料淘汰 volatile lfu 挑選最近...
redis階段總結 php中redis的使用
今天是五一節了,學了一段時間的redis。由於專案進度原因,一直拖到現在今天做個收尾總結。安裝 wget 4.tar.gz cd phpredis 2.2 7 進入 phpredis 目錄 usr local php bin phpize php安裝後的路徑 configure with php c...