mySQL里有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據?
1.限定 Redis 占用的內存,Redis 會根據自身數據淘汰策略,加載熱數據到內存。
所以,計算一下 20W 數據大約占用的內存,然后設置一下 Redis 內存限制即可。
2.問題是什么數據?
比如用戶數據。數據庫有2000w條。
活躍用戶:
redis sortSet里 放兩天內(為方便取一天內活躍用戶)登錄過的用戶,登錄一次ZADD一次,如set已存在則覆蓋其分數(登錄時間)。鍵:login:users,值:分數 時間戳、value userid。設置一個周期任務,比如每天03:00:00點刪除sort set中前一天3點前的數據(保證set不無序增長、留近一天內活躍用戶)。
取時,拿到當前時間戳(int 10位),再減1天就可按分數范圍取過去24h活躍用戶。
3.看你的提問,應該只是把Redis當緩存來用.
提供一種簡單實現緩存失效的思路: LRU(最近少用的淘汰)
即redis的緩存每命中一次,就給命中的緩存增加一定ttl(過期時間)(根據具體情況來設定, 比如10分鍾).
一段時間后, 熱數據的ttl都會較大, 不會自動失效, 而冷數據基本上過了設定的ttl就馬上失效了.
4.
redis 內存數據集大小上升到一定大小的時候,會施行數據淘汰策略。
redis 提供 6種數據淘汰策略:
redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略:
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據