三 如何使redis中存放的都是熱點資料?

2021-10-06 00:26:00 字數 1283 閱讀 9397

一、場景:

資料庫中有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...