Redis運維和開發學習筆記(2) redis持久化

Redis運維和開發學習筆記(2) redis持久化

文章目錄

  • Redis運維和開發學習筆記(2) redis持久化
    • 持久化
    • 持久化方式一:RDB
      • 觸發~~的三種~~方式
        • 1. save命令
        • 2. bgsave
        • 配置
        • 觸發機制
    • RDB 總結
  • 持久化方式二:AOF
    • AOF的三種策略
    • 三種策略的優缺點
    • AOF重寫機制

持久化

  • redis將所有數據保存在內存中,對數據的更新異步地保存在磁盤上

    • 快照
      • MySQL Dump
      • Redis RDB
    • 寫日志
      • MySQL Binlog
      • Hbase HLog
      • Redis AOF
  • RDB存在的問題

    • 耗時,耗性能
    • 丟失數據

持久化方式一:RDB

RDB是Redis用來進行持久化的一種方式,是把當前內存中的數據集快照寫入磁盤,也就是 Snapshot 快照(數據庫中所有鍵值對數據)。恢復時是將快照文件直接讀到內存里。
調用forks 生成一個子進程 子進程復制數據集到一個臨時的rdb文件中 當子進程完成對數據集的復制后,redis會用新的rdb文件,并刪除舊得rdb文件

觸發的三種方式

1. save命令

  • 過程
    client->redis->創建RDB文件(二進制)
redis> save
ok

2. bgsave

  • 過程
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qEl1FSOy-1572053410723)(media/15637201103316/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202019-07-21%2022.56.06.png)]

  • 兩者對比
    save與sbgsave

     | 命令 | save | bgsave |
    

| — | — | — |
| IO類型 | 同步 | 異步 |
| 阻塞? | 是 | 是(阻塞發生在fork) |
| 復雜度 | O(n) | O(n) |
| 優點 | 不消耗額外的內存 | 不阻塞客戶端命令 |
| 缺點 | 阻塞客戶端命令 | fork消耗內存 |

配置

save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir ./ (設置路徑)
stop-writes-on-bgsave-error yes(如果bgsave發生錯誤就停止寫入)
rdbcompression yes(采用壓縮格式)
rdbchecksum yes(采用校驗和)

觸發機制

  1. 全量復制(主會自動生成rdb文件)
  2. debug reload 不講內存清空的重啟,觸發rdb文件生成
  3. shutdown觸發rdb生成

RDB 總結

  1. RDB是 Redisp內存到硬盤的快照,用于持久化
  2. save通常會阻 ARedis塞
  3. bgsaveTZRedis,但是會fork新進程
  4. save自動配置滿足任一就會被執行。
  5. 有些觸發機制不容忽視

持久化方式二:AOF

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Tz5XGcNh-1572053410724)(media/15637201103316/%E5%9B%BE%E7%89%87%201.png)]

| 時間戳 | save |
| — | — |
| T1 | 執行多條命令 |
| T2 | 滿足RDB條件自動創建 |
| T3 | 再次執行多條寫命令 |
| T4 | 宕機 |
| | 數據丟失 |

寫一條命令,就在AOF增加一條命令。當redis宕機,就是用AOF對數據進行完整恢復。

AOF的三種策略

  • always
    redis執行寫命令,是將命令卸載緩沖區,每條命令fsycn到硬盤。
  • everysec
    redis執行寫命令,是將命令卸載緩沖區,每秒把命令fsycn到硬盤。
  • no
    redis執行寫命令,是將命令卸載緩沖區,由操作系統判斷把命令fsycn到硬盤。

三種策略的優缺點

命令alwayseverysecno
優點不丟失數據每秒一次Sync丟1秒數據不用管
缺點1O開銷較大,一般的sata盤只有幾百TPS丟1秒數據不可控

AOF重寫機制

原生AOFAOF 重寫
set hello worldset hello hehe
set hello jave
set hello hehe

減少磁盤占用量,加快恢復速度

  • 兩種方式
    bgrewriteaof(fork子進程,完成重寫)
    AOF重寫配置

  • 配置

    | 配置名 | 含義 |
    | — | — |
    | Auto-aof-rewrite-min-size | AOF文件重寫需要的尺寸 |
    | Auto-aof-rewrite-percentage | AOF增長率 |

  • 統計

    | 統計名 | 含義 |
    | — | — |
    | aof_current_size | AOF 當前尺寸 |
    | aof_base_size | AOF上次啟動和重寫的尺寸 |

  • 自動觸發機制
    aof_current_size > Auto-aof-rewrite-min-size
    (aof_current_size - aof_base_size)/aof_base_size > Auto-aof-rewrite-percentage

  • AOF重寫流程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382391.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Effective C++學習第六天

條款18:讓接口更容易被正確使用,不易被誤用設計接口的原則:正確性、高效性、封裝性、維護性、延展性以及協議的一致性;設計原則:1)導入新類型來預防很多客戶端的錯誤,多使用系統類型&#xff08…

Redis運維和開發學習筆記(4) Redis參數意義

Redis運維和開發學習筆記(4) Redis參數意義 文章目錄Redis運維和開發學習筆記(4) Redis參數意義參數意義參數意義 Client連接 問題 id567800790 addr10.18.17.217:37310 fd1572 name age2039114 idle2034860 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 …

Effective C++學習第七天

條款23:寧以non-memeber、non-friend替換member函數non-member/non-friend可以給對象帶來更大的封裝性,從兩個方面來考慮:1)考慮封裝,越多東西被封裝,它們就越不可見,就越少人看到它&#xff0c…

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式 主從復制 將主節點的數據改變同步給從節點 作用 備份數據讀寫分離 存在的問題: 手動干預切主等操作主節點的寫能力受到單機限制主節點的存儲能力受到單機限制 主從模式的故障恢復 當主節點發生故障時&am…

Effective C++學習第八天

條款26:盡可能延后變量定義式的出現時間當你定義了一個變量,如果在使用變量之前出現異常,那么你得承受一次構造成本和析構成本,而且你沒有使用該變量;本條款給出的建議是延遲變量的定義,直到非得使用該變量…

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令 文章目錄Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令info serverinfo clientinfo memoryinfo persistenceinfo statsinfo commandstatsinfo cpuinfo clusterinfo keyspaceinfo server Redis服務器相關的通用…

Effective C++學習第九天

條款32:確定你的public繼承塑模出is-a模型class D(derived)以public形式繼承class B(base),則每一個類型為D的對象同時也是一個類型為B的對象,反之不成立,因此B比D表現出更加一般化的…

Effective C++學習第十天

條款36:絕不重新定義繼承而來的non-virtual函數non-virtual函數執行的是靜態綁定,在編譯器就已經決定,因此對象對用的函數只和指針的類型有關,而與指針所指的對象無關;記住non-virtual函數的性質:不變性凌駕…

Redis運維和開發學習筆記(7) 內存管理和過期策略

Redis運維和開發學習筆記(7) 內存管理和過期策略 文章目錄Redis運維和開發學習筆記(7) 內存管理和過期策略內存回收策略惰性刪除定時任務刪除maxmemory過期策略allkeys-lru主從搭建測試搭建完畢主從測試結果volatile-lru測試結果volatile-ttl測試結果allkeys-lru內存回收策略 …

Effective C++學習第十一天

條款41:了解隱式接口和編譯期多態面向對象編程世界總是以顯式接口(源碼可見的接口)和運行期多態(virtual)解決問題;對于templates及泛型編程的世界,隱式接口和編譯期多態顯得更加重要&#xff1…

Redis源碼分析(零)學習路徑筆記

文章目錄第一階段第二階段 熟悉Redis的內存編碼結構第三階段 熟悉Redis數據類型的實現第四階段 熟悉Redis數據庫的實現第五階段 熟悉客戶端和服務器端的代碼實現第六階段 這一階段主要是熟悉Redis多機部分的代碼實現關于測試方面的文件有一些工具類的文件如下SORT命令的實現一些…

Effective C++學習第十二天

條款47:請使用traits classes表現類型信息STL有五類迭代器分類,input迭代器(只讀,一次,向前)、output迭代器(可寫,一次,向前)、forward迭代器(讀/…

Redis源碼分析(一)redis.c //redis-server.c

Redis源碼分析(一)redis.c //redis-server.c 入口函數 int main() 4450 int main(int argc, char **argv) {4451 initServerConfig();4452 if (argc 2) {4453 ResetServerSaveParams();4454 loadServerConfig(argv[1]);4455 …

Linux 學習

1.linux文本命令行語言環境設置命令 查看當前語言環境: echo ¥LANG 修改: LANG選擇的語言環境’ 引申:https://blog.csdn.net/huoyunshen88/article/details/41113633 2.linux中的硬鏈接和軟連接 linux中文件的儲存方式&#xf…

vivo C/C++工程師視頻面試總結 20180802

1.自我介紹:有點兒緊張了,直接把自己簡歷上的一些信息信息說了一遍,說完之后在介紹了一下自己的平時的愛好和興趣,感覺面試官沒有理我,直接進入下一環節了。 2.項目詳情:主要是自己最近的一個項目和自己負…

Redis源碼分析(二)redis-cli.c

文章目錄1. int main()2. parseOptions(int argc, char **argv) 進行ip和port的改變3. lookupCommand(char *name) 查找命令,判斷命令合法3.2 strcasecmp(name,cmdTable[j].name)3.1 redisCommand cmdTable[]4. cliSendCommand(int argc, char **argv)4.1 cliConnec…

C語言中有bool變量嗎?

1.C/C中定義的數據類型: C語言中定義了6種基本數據類型:short,int,long,float,double,char 4種構造類型:數組,結構體(struct),共用類型(union),枚舉類型(enum) 指針類型和空類型 C語…

redis源碼剖析(三)——基礎數據結構

文章目錄SDS鏈表字典這篇文章關于 Redis 的基礎數據:SDS SDS (Simple Dynamic String)是 Redis 最基礎的數據結構。直譯過來就是”簡單的動態字符串“。Redis 自己實現了一個動態的字符串,而不是直接使用了 C 語言中的字符串。 sds 的數據結…

C++迭代器使用錯誤總結

指針和迭代器的區別: 迭代器: (1)迭代器不是指針,是類模板,表現的像指針。他只是模擬了指針的一些功能,通過重載了指針的一些操作符,->,*, --等封裝了指針,是一…

redis源碼剖析(四)跳表

文章目錄整數集合跳躍表壓縮列表總結整數集合 當一個集合只包含整數,且這個集合的元素不多的時候,Redis 就會使用整數集合 intset 。首先看 intset 的數據結構: typedef struct intset {// 編碼方式uint32_t encoding;// 集合包含的元素數量…