一、場景:
數據庫中有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活躍用戶。