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