Redis4.0 之持久化存儲

redis若是提供緩存服務,能夠關閉全部持久化存儲,如此一來redis重啓後全部數據會丟失 
開啓rdb或aof持久化存儲,能把redis中的數據持久化到磁盤中。 
rdb和aof對性能都有影響,因此建議持久化的操做在從庫上進行前端

Redis的rdb存儲方式,使用save配置開啓rdb存儲或者關閉rdb存儲

# 默認狀況下rdb持久化存儲是開啓的
[root@redis01 ~]# redis-cli -h 127.0.0.1 config set save ""  # 關閉rdb存儲
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite  # 保存配置
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config set save "180 1 120 10 60 10000"  # 開啓rdb
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite  # 保存配置
OK

進行數據寫入 , 觀察rdb存儲日誌redis

# 輸入一萬條數據
[root@redis01 ~]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done 
# 查看日誌
[root@redis01 ~]# tail -5 /data/redis/redis.log 
54721:M 08 Oct 18:43:39.026 * 10000 changes in 60 seconds. Saving...  # 60秒內發生了一萬條數據變化,出發rdb存儲
54721:M 08 Oct 18:43:39.027 * Background saving started by pid 85432
85432:C 08 Oct 18:43:39.032 * DB saved on disk
85432:C 08 Oct 18:43:39.033 * RDB: 0 MB of memory used by copy-on-write
54721:M 08 Oct 18:43:39.127 * Background saving terminated with success

Redis也提供了bgsave命令可以馬上出發rdb存儲算法

[root@redis01 ~]# redis-cli save  # 會阻塞前端客戶數據寫入
OK
[root@redis01 ~]# redis-cli bgsave  # 後臺啓動新進程進行rdb存儲
Background saving started
[root@redis01 ~]# tail -5 /data/redis/redis.log 
54721:M 08 Oct 18:46:44.263 * DB saved on disk  # save觸發rdb存儲
54721:M 08 Oct 18:47:02.738 * Background saving started by pid 85602  # bgsave觸發的rdb存儲
85602:C 08 Oct 18:47:02.744 * DB saved on disk
85602:C 08 Oct 18:47:02.744 * RDB: 0 MB of memory used by copy-on-write
54721:M 08 Oct 18:47:02.835 * Background saving terminated with success

Redis的AOF存儲方式數據庫

aof持久化存儲會把用戶每次的操做都記錄到文件中vim

# 動態開啓和關閉aof
[root@redis01 ~]# redis-cli -h 127.0.0.1 config set appendonly yes  # 開啓aof
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config set appendonly no  # 關閉aof
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite
OK

寫入數據, 查看aof文件緩存

[root@redis01 ~]# cd /data/redis/
[root@redis01 redis]# ls
appendonly.aof  dump.rdb  redis.log  redis.pid
[root@redis01 redis]# du -sh appendonly.aof 
460K    appendonly.aof
[root@redis01 redis]# du -sh dump.rdb 
236K    dump.rdb
# 寫入數據
[root@redis01 redis]# for line in `seq -w 100`;do redis-cli set key_${line} value1_${line};done
# 查看aof和rdb文件大小
[root@redis01 redis]# du -sh appendonly.aof 
960K    appendonly.aof
[root@redis01 redis]# du -sh dump.rdb 
236K    dump.rdb

重寫aof文件 , 整理相同的key , 寫入最後的有效值app

執行AOF文件重寫操做會從新建立一個當前AOF文件的體積優化版本
即便BGREWRITEAOF執行失敗,也不會有任何數據丟失,由於舊的AOF文件在BGREWRITEAOF成功以前不會被修改
重寫操做只會在沒有其餘持久化工做在後臺執行時被觸發
從Redis2.4開始,AOF重寫由Redis自行觸發,BGREWRITEAOF僅僅用於手動觸發重寫操做dom

[root@redis01 redis]# > appendonly.aof   # 清空aof文件
[root@redis01 redis]# ll
總用量 252
-rw-r--r--. 1 root root      0 10月  8 19:00 appendonly.aof
-rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
-rw-r--r--. 1 root root   5654 10月  8 18:59 redis.log
-rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
[root@redis01 redis]# redis-cli bgrewriteaof  # 手動觸發aof重寫
Background append only file rewriting started
[root@redis01 redis]# ll
總用量 716
-rw-r--r--. 1 root root 474323 10月  8 19:00 appendonly.aof  # redis裏的全部數據會被從新寫入aof
-rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
-rw-r--r--. 1 root root   6395 10月  8 19:00 redis.log
-rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
[root@redis01 redis]# > appendonly.aof 
[root@redis01 redis]# ll
總用量 252
-rw-r--r--. 1 root root      0 10月  8 19:01 appendonly.aof
-rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
-rw-r--r--. 1 root root   6395 10月  8 19:00 redis.log
-rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
[root@redis01 redis]# redis-cli set weihan mingming
OK
[root@redis01 redis]# ll
總用量 256
-rw-r--r--. 1 root root     39 10月  8 19:01 appendonly.aof
-rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
-rw-r--r--. 1 root root   6395 10月  8 19:00 redis.log
-rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
[root@redis01 redis]# cat appendonly.aof 
*3
$3
set
$6
weihan
$8
mingming
[root@redis01 redis]# redis-cli del weihan mingming
(integer) 1
[root@redis01 redis]# cat appendonly.aof 
*3
$3
set
$6
weihan
$8
mingming
*3
$3
del
$6
weihan
$8
mingming
[root@redis01 redis]# ll
總用量 256
-rw-r--r--. 1 root root     78 10月  8 19:03 appendonly.aof
-rw-r--r--. 1 root root 242180 10月  8 19:02 dump.rdb
-rw-r--r--. 1 root root   6721 10月  8 19:02 redis.log
-rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid

咱們向redis添加了一個key,又刪除了這個key,redis數據庫從本質上來講並無新增任何數據 可是aof文件仍舊把操做都給記錄了 這樣就會致使aof文件最終會很是大,因此aof文件的優化,就是讓aof文件進行重寫,只記錄數據的增量部分 如此aof文件就小不少了性能

 

aof配置自動rewrite機制測試

[root@redis01 redis]# cd /usr/local/redis/conf/
[root@redis01 conf]# vim redis.conf
auto-aof-rewrite-percentage 100 # 默認100%,也就是aof增長一倍後考慮rewrite,兩個條件要同時知足
auto-aof-rewrite-min-size 64mb  # 默認64mb,也就是aof達到64M後考慮rewirte,兩個條件要同時知足
# 獲取aof-rewrite配置
[root@redis01 conf]# redis-cli config get auto-aof-rewrite*
1) "auto-aof-rewrite-percentage"
2) "100"
3) "auto-aof-rewrite-min-size"
4) "67108864"
# 進行aof自動重寫
[root@redis01 conf]# redis-cli config set auto-aof-rewrite-min-size 100000
OK
[root@redis01 conf]# redis-cli config get auto-aof-rewrite*
1) "auto-aof-rewrite-percentage"
2) "100"
3) "auto-aof-rewrite-min-size"
4) "100000"
[root@redis01 conf]# redis-cli config rewrite
OK
[root@redis01 conf]# cd /data/redis/
[root@redis01 redis]# > appendonly.aof 
[root@redis01 redis]# du -sh appendonly.aof 
0K    appendonly.aof
[root@redis01 redis]# for line in `seq -w 1000`;do redis-cli set key2_${line} value2_${line};done
[root@redis01 redis]# du -sh appendonly.aof 
48K    appendonly.aof
[root@redis01 redis]# for line in `seq -w 1000`;do redis-cli set key2_${line} value2_${line};done
[root@redis01 redis]# du -sh appendonly.aof 
128K    appendonly.aof
[root@redis01 redis]# du -sh appendonly.aof 
92K    appendonly.aof    # 自動觸發了aof重寫機制

Redis的刪除算法

# Redis的鍵值設置有效期 , 過時自動刪除
redis-cli flushall命令 # 手動清空redis裏全部數據 [root@redis01 redis]# redis-cli set name weihan OK [root@redis01 redis]# redis-cli ttl name (integer) -1  # -1表明key永不過時 [root@redis01 redis]# redis-cli expire name 10  # 設定key過時時間爲10s (integer) 1 [root@redis01 redis]# redis-cli ttl name  # 查看key剩餘的存活時間 (integer) 9 [root@redis01 redis]# redis-cli ttl name (integer) 7 [root@redis01 redis]# redis-cli ttl name (integer) 5 [root@redis01 redis]# redis-cli ttl name (integer) 3 [root@redis01 redis]# redis-cli ttl name (integer) 1 [root@redis01 redis]# redis-cli ttl name (integer) -2 [root@redis01 redis]# redis-cli get name  # key已經由於過時被刪除 (nil)

Redis的最大內存設置

[root@redis01 redis]# redis-cli config get maxmemory
1) "maxmemory"
2) "0"          # 默認對內存無限制
[root@redis01 redis]# redis-cli config set maxmemory 1M  # 設置限制爲1M
OK
[root@redis01 redis]# redis-cli config get maxmemory
1) "maxmemory"
2) "1000000"

Redis的內存清理算法

volatile-lru : 使用LRU算法刪除鍵(key須要設置過時時間)

volatile-random : 隨機刪除鍵(key須要設置過時時間)

volatile-ttl : 刪除ttl最小的鍵(key須要設置過時時間)

allkeys-lru : 使用LRU算法刪除鍵(全部key)

allkeys-random : 隨機刪除鍵(全部key)

noeviction : 不進行任何的操做,只返回錯誤,默認

[root@redis01 redis]# redis-cli config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"            # 默認算法
# 模擬內存溢出
[root@redis01 redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value_${line};done
[root@redis01 redis]# redis-cli set name weihan
(error) OOM command not allowed when used memory > 'maxmemory'.
[root@redis01 redis]# redis-cli 
127.0.0.1:6379> set name weihan
(error) OOM command not allowed when used memory > 'maxmemory'.        # 測試會報錯

設置刪除算法

# 將刪除算法設置爲volatile-lru
[root@redis01 redis]# redis-cli config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
[root@redis01 redis]# redis-cli config set maxmemory-policy volatile-lru
OK
[root@redis01 redis]# redis-cli config get maxmemory-policy
1) "maxmemory-policy"
2) "volatile-lru"
[root@redis01 redis]# redis-cli config rewrite
OK
[root@redis01 redis]# redis-cli get key_00111
"value1_00111"
[root@redis01 redis]# redis-cli expire key_00111 3600
(integer) 1
[root@redis01 redis]# redis-cli ttl key_00111 
(integer) -2
[root@redis01 redis]# redis-cli get key_00111
(nil)
# 測試發現 volatile-lru算法能夠實現當內存達到了預設的最大值後,會優先刪除有過時時間的key

Redis禁用屏蔽危險命令

FLUSHALL和FLUSHDB會清除redis的數據,比較危險 
KEYS在鍵過多的時候使用會阻塞業務請求

# 配置代碼以下, 寫入配置文件便可,此配置沒法平滑更新
[root@redis01 redis]# vim /usr/local/redis/conf/redis.conf
rename-command  FLUSHALL "" # 將命令更名成空
rename-command  FLUSHDB ""  # 將命令更名成空
rename-command  KEYS ""     # 將命令更名成空
[root@redis01 redis]# redis-cli shutdown
[root@redis01 redis]# redis-server /usr/local/redis/conf/redis.conf
[root@redis01 redis]# redis-cli flushall
(error) ERR unknown command 'flushall'
[root@redis01 redis]# redis-cli flushdb
(error) ERR unknown command 'flushdb'
[root@redis01 redis]# redis-cli 
127.0.0.1:6379> keys *
(error) ERR unknown command 'keys'
相關文章
相關標籤/搜索