Redis:内存满了的解决方案
1,增加內(nèi)存;
2,使用內(nèi)存淘汰策略。(LRU)
3,Redis集群。
?
重點(diǎn)介紹下23;
第2點(diǎn):
我們知道,redis設(shè)置配置文件的maxmemory參數(shù),可以控制其最大可用內(nèi)存大小(字節(jié))。
那么當(dāng)所需內(nèi)存,超過maxmemory怎么辦?
這個(gè)時(shí)候就該配置文件中的maxmemory-policy出場了。
其默認(rèn)值是noeviction。
下面我將列出當(dāng)可用內(nèi)存不足時(shí),刪除redis鍵具有的淘汰規(guī)則。
?
| 規(guī)則名稱 | 規(guī)則說明 |
| volatile-lru | 使用LRU算法刪除一個(gè)鍵(只對(duì)設(shè)置了生存時(shí)間的鍵),最少使用的 |
| allkeys-lru | 使用LRU算法刪除一個(gè)鍵,最少使用的 |
| volatile-random | 隨機(jī)刪除一個(gè)鍵(只對(duì)設(shè)置了生存時(shí)間的鍵) |
| allkeys-random | 隨機(jī)刪除一個(gè)鍵 |
| volatile-ttl | 刪除生存時(shí)間最近的一個(gè)鍵 |
| noeviction | 不刪除鍵,只返回錯(cuò)誤 |
LRU算法,least RecentlyUsed,最近最少使用算法。也就是說默認(rèn)刪除最近最少使用的鍵。
作為內(nèi)存數(shù)據(jù)庫,出于對(duì)性能和內(nèi)存消耗的考慮,Redis 的淘汰算法實(shí)際實(shí)現(xiàn)上并非針對(duì)所有 key,而是抽樣一小部分并且從中選出被淘汰的 key。
使用 Redis 緩存數(shù)據(jù)時(shí),為了提高緩存命中率,需要保證緩存數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)??梢詫?nèi)存最大使用量設(shè)置為熱點(diǎn)數(shù)據(jù)占用的內(nèi)存量,然后啟用 allkeys-lru 淘汰策略,將最近最少使用的數(shù)據(jù)淘汰。
Redis 4.0 引入了 volatile-lfu 和 allkeys-lfu 淘汰策略,LFU 策略通過統(tǒng)計(jì)訪問頻率,將訪問頻率最少的鍵值對(duì)淘汰。
?
但是一定要注意一點(diǎn)!redis中并不會(huì)準(zhǔn)確的刪除所有鍵中最近最少使用的鍵,而是隨機(jī)抽取3個(gè)鍵,刪除這三個(gè)鍵中最近最少使用的鍵。
那么3這個(gè)數(shù)字也是可以設(shè)置的,對(duì)應(yīng)位置是配置文件中的maxmeory-samples.
?第3點(diǎn):
3.集群怎么做
Redis僅支持單實(shí)例,內(nèi)存一般最多10~20GB。對(duì)于內(nèi)存動(dòng)輒100~200GB的系統(tǒng),就需要通過集群來支持了。
Redis集群有三種方式:客戶端分片、代理分片、RedisCluster(在之后一篇文章詳細(xì)說一下。)
· 客戶端分片
通過業(yè)務(wù)代碼自己實(shí)現(xiàn)路由
優(yōu)勢:可以自己控制分片算法、性能比代理的好
劣勢:維護(hù)成本高、擴(kuò)容/縮容等運(yùn)維操作都需要自己研發(fā)
· 代理分片(redis中間件)
代理程序接收到來自業(yè)務(wù)程序的數(shù)據(jù)請(qǐng)求,根據(jù)路由規(guī)則,將這些請(qǐng)求分發(fā)給正確的Redis實(shí)例并返回給業(yè)務(wù)程序。使用類似Twemproxy、Codis等中間件實(shí)現(xiàn)。
優(yōu)勢:運(yùn)維方便、程序不用關(guān)心如何鏈接Redis實(shí)例
劣勢:會(huì)帶來性能消耗(大概20%)、無法平滑擴(kuò)容/縮容,需要執(zhí)行腳本遷移數(shù)據(jù),不方便(Codis在Twemproxy基礎(chǔ)上優(yōu)化并實(shí)現(xiàn)了預(yù)分片來達(dá)到Auto Rebalance)。
·Redis Cluster
優(yōu)勢:官方集群解決方案、無中心節(jié)點(diǎn),和客戶端直連,性能較好
劣勢:方案太重、無法平滑擴(kuò)容/縮容,需要執(zhí)行相應(yīng)的腳本,不方便、太新,沒有相應(yīng)成熟的解決案例
總結(jié)
以上是生活随笔為你收集整理的Redis:内存满了的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis持久化:AOF和RDB
- 下一篇: Redis集群:sharding策略