Redis持久化機制和內存回收機制
中國加油,武漢加油!
篇幅較長,配合目錄觀看
案例準備
1. Redis持久化機制
Redis會定期的把內存中的數據持久化到硬盤上,當Redis服務關閉後,重啓Redis會自動把硬盤的數據恢復到內存中繼續使用。
1.1 Redis兩種持久化方式
1.1.1 RDB(快照,默認的方式)
- 記錄當前Reids一瞬間的內存結構,以文件的形式保存的硬盤上。
- save: 手動進行快照,這個過程是前臺快照,在執行的快照的的過程中,Redis是拒絕寫命令的。
- bgsave: 手動進行快照,這個過程是後臺快照,Redis會啓動一個新的線程執行快照,當前線程是接收執行寫命令的(它是把寫的命令放到緩存中)
1.1.1.1 修改配置
cd /usr/local/redis3/bin
vim redis.conf
save 900 1 # 配置快照的頻率,意思是900s之內有1個數據發送了變化就拍快照。
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes # 因爲bgsave命令是啓動一個新的線程執行快照,當前線程還是接收寫命令的,如果新線程在執行快照的過程中出現錯誤是否停止寫命令,默認是yes,這樣用戶可以感知到執行快照失敗。
rdbchecksum yes # 快照時檢查快照的完整性
dbfilename dump.rdb # 生成快照文件的名字(可以把這個文件發送給別人,啓動後緩存就會有的對應的數據)
dir ./ #快照文件存放的位置
1.1.2 AOF(只追加文件)
AOF把服務器執行的所有寫(增刪改)的命令記錄在一個文件中,並在服務器啓動時,通過重新執行這些命令來還原數據集。
1.1.2.1 修改配置
appendonly no # 是否開啓只追加文件
appendfilename "appendonly.aof" # 只追加文件的名稱
# 只追加文件記錄評率
# appendfsync always # 每次執行寫操作後記錄到只追加文件中(絕對安全)
appendfsync everysec # 每秒中記錄一次只追加文件(默認值)
# appendfsync no # 不主動記錄只追加文件,需要手動記錄
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb # 只追加文件的大小,超過64兆新建一個文件記錄命令
aof-load-truncated yes # 如果最後一個命令出現錯誤,是否丟棄。
1.2 快照 VS 只追加文件
- 快照:記錄和恢復的速度快,數據的安全性不高(因爲他是按照時間來記錄的)
- 只追加文件:記錄和恢復的速度慢(命令一旦很多久執行慢),數據安全性高(因爲最多隻丟失1s的數據)
- 如果Redis只是作爲緩存服務器話,快照和只追加文件都可以關閉,這樣可以大大的提高Redis讀寫性能,如果對數據要求安全性很高,則兩個都可以開啓。
2. Reids內存回收機制
cd /usr/local/redis3/bin
vim redis.conf
算法名稱 | 算法描述 |
---|---|
volatile-lru | 只限於設置了 expire 的部分; 優先刪除最近最少使用的 key |
allkeys-lru | 所有key通用; 優先刪除最近最少使用的 key |
volatile-random | 採用隨機淘汰策略刪除超時的鍵值對 |
allkeys-random | 只限於設置了 expire 的部分; 隨機刪除一部分 key |
volatile-ttl | 只限於設置了 expire 的部分; 優先刪除剩餘時間短的key |
noeviction | 不淘汰任何鍵值對,當內存已滿,只支持讀,不支持寫 |
2.1 注意
爲了提高垃圾回收的策略,LRU和TTL算法都不是精確的算法,而是一個近似的算法。
就是他會根據探測樣本的數量設置,來進行探測,然後根據探測到這幾個進行淘汰。
LRU:看命中率
maxmemory-samples 5 #設置抽取的樣本數量
2.2 總結
- 默認的回收策略:默認不回收
- 設置回收的算法:LRU,random,TTL
- 算法不是精確的,而是採樣的方式,可以設置採樣的個數,默認是5個