六、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是去中心化,去中介軟體的,也就是說,集群中的每個節點都是平等的關係,都是對等的,每個節點都儲存各自的資料和整個集群的狀態。每個節點都和其他所有節點連線,而且這些連線保持活躍,...