redis高级-内存淘汰策略
目錄
一、redis緩存過(guò)期淘汰策略
1.redis默認(rèn)內(nèi)存
2.修改redis內(nèi)存
3.查看redis內(nèi)存情況
二、redis內(nèi)存超出了設(shè)置的最大值會(huì)怎么樣
1.設(shè)置1個(gè)字節(jié)之后再賦值,會(huì)爆OOM
三、內(nèi)存淘汰策略
1.一個(gè)鍵過(guò)期了,是怎么刪除的
2.內(nèi)存淘汰策略
3.修改內(nèi)存淘汰策略
lru算法
一、redis緩存過(guò)期淘汰策略
1.redis默認(rèn)內(nèi)存
?? ?如果不設(shè)置最大內(nèi)存大小或者設(shè)置最大內(nèi)存大小為0,在64位操作系統(tǒng)下不限制內(nèi)存大小,在32位操作系統(tǒng)下最多使用3GB內(nèi)存。
? ? 一般推薦redis設(shè)置內(nèi)存為最大物理內(nèi)存的四分之三。
2.修改redis內(nèi)存
①修改配置文件
②通過(guò)命令
3.查看redis內(nèi)存情況
二、redis內(nèi)存超出了設(shè)置的最大值會(huì)怎么樣
1.設(shè)置1個(gè)字節(jié)之后再賦值,會(huì)爆OOM
三、內(nèi)存淘汰策略
出廠默認(rèn):noeviction-報(bào)錯(cuò)OOM
1.一個(gè)鍵過(guò)期了,是怎么刪除的
①定時(shí)刪除(對(duì)CPU不友好,用處理器性能換取存儲(chǔ)空間)
②惰性刪除(對(duì)內(nèi)存不友好)
③定期刪除(隨機(jī)抽查,也會(huì)有漏網(wǎng)之魚(yú),會(huì)有一直沒(méi)抽取到的)
2.內(nèi)存淘汰策略
lru:刪除最近最少使用的
lfu:刪除最少頻繁使用的的。
一般用第二個(gè),allkeys-lru
3.修改內(nèi)存淘汰策略
①配置文件
②命令
lru算法
是什么:
? ? LRU是Least?Recently?Used的縮寫(xiě),即最近最少使用,是一種常用的頁(yè)面置換算法,選擇最近最久未使用的數(shù)據(jù)予以淘汰。
1.面試題示例
LRU算法核心是哈希鏈表
使用LinkedHashMap實(shí)現(xiàn)LRU算法
package 作業(yè); import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Set;/*LRU是Least Recently Used 近期最少使用算法。 *通過(guò)HashLiekedMap實(shí)現(xiàn)LRU的算法的關(guān)鍵是,如果map里面的元素個(gè)數(shù)大于了緩存最大容量,則刪除鏈表頭元素 *//*public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) *LRU參數(shù)參數(shù): *initialCapacity - 初始容量。 *loadFactor - 加載因子(需要是按該因子擴(kuò)充容量)。 *accessOrder - 排序模式( true) - 對(duì)于訪問(wèn)順序(get一個(gè)元素后,這個(gè)元素被加到最后,使用了LRU 最近最少被使用的調(diào)度算法),對(duì)于插入順序,則為 false,可以不斷加入元素。 *//*相關(guān)思路介紹:* 當(dāng)有一個(gè)新的元素加入到鏈表里面時(shí),程序會(huì)調(diào)用LinkedHahMap類(lèi)中Entry的addEntry方法,*而該方法又會(huì) 會(huì)調(diào)用removeEldestEntry方法,這里就是實(shí)現(xiàn)LRU元素過(guò)期機(jī)制的地方,* 默認(rèn)的情況下removeEldestEntry方法只返回false,表示可以一直表鏈表里面增加元素,在這個(gè)里 *修改一下就好了。**/ /* 測(cè)試數(shù)據(jù): 5 11 4 7 0 7 1 0 1 2 1 2 6 */import java.util.*; public class LRULinkedHashMap<K,V> extends LinkedHashMap<K,V>{ private int capacity; //初始內(nèi)存容量LRULinkedHashMap(int capacity){ //構(gòu)造方法,傳入一個(gè)參數(shù)super(16,0.75f,true); //調(diào)用LinkedHashMap,傳入?yún)?shù) ,true是按照訪問(wèn)順序,false是按照插入順序排 this.capacity=capacity; //傳遞指定的最大內(nèi)存容量}@Overridepublic boolean removeEldestEntry(Map.Entry<K, V> eldest){ //,每加入一個(gè)元素,就判斷是size是否超過(guò)了已定的容量System.out.println("此時(shí)的size大小="+size());if((size()>capacity)){System.out.println("超出已定的內(nèi)存容量,把鏈表頂端元素移除:"+eldest.getValue());}return size()>capacity; }public static void main(String[] args) throws Exception{Scanner cin = new Scanner(System.in);System.out.println("請(qǐng)輸入總共內(nèi)存頁(yè)面數(shù): ");int n = cin.nextInt();Map<Integer,Integer> map=new LRULinkedHashMap<Integer, Integer>(n);System.out.println("請(qǐng)輸入按順序輸入要訪問(wèn)內(nèi)存的總共頁(yè)面數(shù): ");int y = cin.nextInt();System.out.println("請(qǐng)輸入按順序輸入訪問(wèn)內(nèi)存的頁(yè)面序列: ");for(int i=1;i<=y;i++){int x = cin.nextInt();map.put(x, x); }System.out.println("此時(shí)內(nèi)存中包含的頁(yè)面數(shù)是有:");//用for-each語(yǔ)句,遍歷此時(shí)內(nèi)存中的頁(yè)面并輸出for(java.util.Map.Entry<Integer, Integer> entry: map.entrySet()){System.out.println(entry.getValue());}} }總結(jié)
以上是生活随笔為你收集整理的redis高级-内存淘汰策略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux查看分析性能以及io的一些命令
- 下一篇: 什么是Promise?前端开发人员会使用