mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
ringa_lee
以 @ybak 的答案為基礎,我說一個比較簡單實用的方案。
限定 Redis 佔用的內存,Redis 會根據自身資料淘汰策略,載入熱資料到記憶體。 所以,計算一下 20W 資料大約佔用的內存,然後設定一下 Redis 內存限制即可。
問題是什麼數據?
比如使用者資料。資料庫有2000w條。 活躍用戶:redis sortSet裡 放兩天內(為方便取一天內活躍用戶)登入過的用戶,登入一次ZADD一次,如set已存在則覆蓋其分數(登入時間)。鍵:login:users,值:分數 時間戳記、value userid。設定一個週期任務,例如每天03:00:00點刪除sort set中前一天3點前的資料(保證set不無序成長、留近一天內活躍用戶)。
取時,拿到目前時間戳記(int 10位),再減1天就可依分數範圍取過去24h活躍用戶。
看你的提問,應該只是把Redis當緩存來用.提供一種簡單實現緩存失效的思路: LRU(最近少用的淘汰)即redis的緩存每命中一次,就給命中的緩存增加一定ttl(過期時間)(根據具體情況來設定, 例如10分鐘).一段時間後, 熱數據的ttl都會較大, 不會自動失效, 而冷數據基本上過了設定的ttl就馬上失效了.
redis 記憶體資料集大小上升到一定大小的時候,會施行資料淘汰策略。
redis 提供 6種資料淘汰策略:
volatile-lru:從已設定過期時間的資料集中挑選最近最少使用的資料淘汰volatile-ttlvolatile-randomallkeys-lruallkeys-randomno-enviction
以 @ybak 的答案為基礎,我說一個比較簡單實用的方案。
限定 Redis 佔用的內存,Redis 會根據自身資料淘汰策略,載入熱資料到記憶體。
所以,計算一下 20W 資料大約佔用的內存,然後設定一下 Redis 內存限制即可。
問題是什麼數據?
比如使用者資料。資料庫有2000w條。
活躍用戶:
redis sortSet裡 放兩天內(為方便取一天內活躍用戶)登入過的用戶,登入一次ZADD一次,如set已存在則覆蓋其分數(登入時間)。鍵:login:users,值:分數 時間戳記、value userid。設定一個週期任務,例如每天03:00:00點刪除sort set中前一天3點前的資料(保證set不無序成長、留近一天內活躍用戶)。
取時,拿到目前時間戳記(int 10位),再減1天就可依分數範圍取過去24h活躍用戶。
看你的提問,應該只是把Redis當緩存來用.
提供一種簡單實現緩存失效的思路: LRU(最近少用的淘汰)
即redis的緩存每命中一次,就給命中的緩存增加一定ttl(過期時間)(根據具體情況來設定, 例如10分鐘).
一段時間後, 熱數據的ttl都會較大, 不會自動失效, 而冷數據基本上過了設定的ttl就馬上失效了.
redis 記憶體資料集大小上升到一定大小的時候,會施行資料淘汰策略。
redis 提供 6種資料淘汰策略:
volatile-lru:從已設定過期時間的資料集中挑選最近最少使用的資料淘汰
allkeys-lru🎜allkeys-random🎜no-enviction🎜-envictionvolatile-ttl
volatile-random
allkeys-lru
allkeys-random
no-enviction