六 Redis記憶體

2021-10-14 04:47:18 字數 3802 閱讀 4178

六、redis記憶體

1、記憶體配置

(1)、記憶體設定

①、如果不設定記憶體大小或者設定記憶體大小為0,在64位作業系統下不限制記憶體大小,在32位作業系統下最多使用3gb記憶體。

②、redis一般推薦設定記憶體為最大物理記憶體的四分之三。

(2)、修改檔案配置

修改maxmemory大小,單位位元組

(3)、通過命令修改

#修改記憶體大小

config set maxmemory 1024 # 設定記憶體大小為1kb,成功返回ok

config get maxmemory # 獲取記憶體大小

info memory # 檢視記憶體使用情況

(4)、oom 

#修改記憶體大小

config set maxmemory 1 # 設定記憶體大小為1byte,成功返回ok

set k1 v1 # 新增k1,v1

(error) oom command not allowed when used memory > 'maxmemory' # 報錯:提示oom,記憶體不夠

2、淘汰策略(1)、過期鍵刪除策略①、定時刪除②、惰性刪除

資料到了過期時間,不作處理,等下次訪問該資料時,如果未過期,返回資料;發現已過期,則刪除,返回不存在。如果乙個鍵已過期,而這個鍵又儲存在redis中,那麼它所占用的記憶體就不會釋放。對記憶體不友好,用儲存空間獲取cpu效能(拿空間換時間)。

③、定期刪除

定期刪除策略是以上兩種策略的折中,就是每隔一段時間執行一次刪除過期鍵操作,並通過限制刪除操作執行的時長和頻率來減少刪除操作對cpu的影響。

該策略難點是如果執行的時間太長,或者執行太頻繁,定期刪除策略就會退化成定時刪除。如果執行太少,或者執行時間太短就會退化成惰性刪除策略。所以執行時間和執行頻率需要合理設定。

(2)、快取淘汰策略

針對過期鍵刪除策略的弊端,redis提供了快取淘汰策略,當redis快取達到maxmemory時,會觸發快取淘汰策略。

lru演算法:least recently used 最近最少使用。lfu演算法:least frequently uesd 最少使用頻率。

①、noeviction:不會驅逐任何key,redis預設的淘汰策略,記憶體滿後報oom。

②、allkeys-lru:對所有key使用lru(least recently used)演算法進行刪除。

③、volatile-lru:對所有設定了過期時間的key使用lru演算法進行刪除。

④、allkeys-random:對所有key隨機刪除。

⑤、volatile-random:對所有設定了過期時間的key隨機刪除。

⑥、volatile-ttl:刪除馬上要過期的key。

⑦、allkeys-lfu:對所有key使用lfu演算法進行刪除。

⑧、volatile-lfu:對所有設定了過期時間的key使用lfu演算法進行刪除。

⑨、淘汰策略設定

生產中多數使用allkeys-lru淘汰策略。

a、修改檔案配置

b、通過命令修改

config set maxmemory- policy allkeys- lru # 設定快取淘汰策略為allkeys- lru,設定成功返回ok

config get maxmemory- policy # 獲取快取淘汰策略配置

(3)、lru演算法lru是least recently used的縮寫,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的資料予以淘汰。

①、利用linkedhashmap實現lru演算法

寫操作 + 讀操作時間複雜都為o(1)。

public class lrucachedemoextends linkedhashmap

/*** 如果hashmap裡的元素個數大於初始化容量capacity,則移除最近最少使用的元素,即linkedhashmap的雙向鍊錶中最前面的元素

* 重寫linkedhashmap的removeeldestentry方法,因為linkedhashmap是protected,所以此處不能大於protected

*/@override

protected boolean removeeldestentry(map.entryeldest)

public static void main(string args)

}

②、手寫實現lru演算法

public class lrucachedemo 

public node(k key, v value)

}/**

* 2、構建乙個虛擬的雙向鍊錶,裡面放置的是自定義的node節點

*/class doublelinkedlist

private void addfirst(nodenode)

private void addlast(nodenode)

private void removenode(nodenode)

private void removefirst()

private node getfirst()

private node getlast()

}private int capacity;

map> map;

doublelinkedlistdoublelinkedlist;

public lrucachedemo(int capacity)

public integer get(int key)

nodenode = map.get(key);

doublelinkedlist.removenode(node);

doublelinkedlist.addlast(node);

return node.value;

}public void put(int key, int value)else

nodeaddnode = new node<>(key, value);

map.put(key, addnode);

doublelinkedlist.addlast(addnode);}}

public static void main(string args)

}

Redis系列六 Redis事務

在redis事務中可以一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。乙個佇列中,一次性 順序性 排他性的執行一系列命令。case1 正常執行 執行exec全部成功 case2 放棄事務 執行discard case3 全體連...

六 記憶體管理

殭屍物件 已經被釋放的物件。再使用物件就會報錯。野指標 乙個指標指向被釋放的物件的記憶體。前提 相對於mrc下,一次 retain alloc 對應一次release,經常需要手動release進行記憶體管理,防止記憶體洩漏。從而引出自動釋放池 自動釋放池 自動釋放池是以棧為節點通過雙向鍊錶組合而成...

redis之路(六) Redis集群概述

redis cluster與redis3.0.0同時發布,以此結束了redis無官方集群方案的時代。redis cluster是去中心化,去中介軟體的,也就是說,集群中的每個節點都是平等的關係,都是對等的,每個節點都儲存各自的資料和整個集群的狀態。每個節點都和其他所有節點連線,而且這些連線保持活躍,...