1. 程式人生 > >15天玩轉redis —— 第十篇 對快照模式的深入分析

15天玩轉redis —— 第十篇 對快照模式的深入分析

      我們知道redis是帶有持久化這個能力了,那到底持久化成到哪裡,持久化成啥樣呢???這篇我們一起來尋求答案。

一:快照模式

  或許在用Redis之初的時候,就聽說過redis有兩種持久化模式,第一種是SNAPSHOTTING模式,還是一種是AOF模式,而且在實戰場景下用的最多的

莫過於SNAPSHOTTING模式,這個不需要反駁吧,而且你可能還知道,使用SNAPSHOTTING模式,需要在redis.conf中設定配置引數,比如下面這樣:

# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB 
if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving completely by commenting
out all "save" lines. # # It is also possible to remove all the previously configured save # points by adding a save directive with a single empty string argument # like in the following example: # # save "" save 900 1 save 300 10 save 60 10000

上面三組命令也是非常好理解的,就是說900指的是“秒數”,1指的是“change次數”,接下來如果在“900s“內有1次更改,那麼就執行save儲存,同樣

的道理,如果300s內有10次change,60s內有1w次change,那麼也會執行save操作,就這麼簡單,看了我剛才說了這麼幾句話,是不是有種直覺在

告訴你,有兩個問題是不是要澄清一下:

1.  上面這個操作應該是redis自身進行的同步操作,請問是否可以手工執行save呢? 

   當然可以進行手工操作,redis提供了兩個操作命令:save,bgsave,這兩個命令都會強制將資料重新整理到硬碟中,如下圖:

2. 看上面的圖,貌似bgsave是開啟單獨執行緒的,請問是嗎?

     確實如你所說,bgsave是開啟次執行緒進行資料重新整理的,不信的話我們來看看程式碼,它的程式碼是在rdb.c原始檔中,如下:

從上面的程式碼中,有沒有看到一個重點,那就是fork方法,它就是一些牛人口中說的什麼fork出一個執行緒,今天你也算終於看到了,其實redis並不是單純

的單執行緒服務,至少fork告訴我們,它在一些場景下也是會開啟工作執行緒的,然後可以看到程式碼會在工作執行緒中執行同步的bgsave操作,就這麼簡單。

 3. 能簡單說下saveparams引數在redis原始碼中的邏輯嗎?

     可以的,其實在redis中有一個週期性函式,叫做serverCron,它會週期性啟動,大概會做七件事情,如redis註釋所說:

/* This is our timer interrupt, called server.hz times per second.
 * Here is where we do a number of things that need to be done asynchronously.
 * For instance:
 *
 * - Active expired keys collection (it is also performed in a lazy way on
 *   lookup).
 * - Software watchdog.
 * - Update some statistic.
 * - Incremental rehashing of the DBs hash tables.
 * - Triggering BGSAVE / AOF rewrite, and handling of terminated children.
 * - Clients timeout of different kinds.
 * - Replication reconnection.
 * - Many more...
 *
 * Everything directly called here will be called server.hz times per second,
 * so in order to throttle execution of things we want to do less frequently
 * a macro is used: run_with_period(milliseconds) { .... }
 */

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {

 上面的紅色字型就是做了我們所關心的save操作,看過方法的註釋,接下來我們來找一下具體邏輯。

從上面這段程式碼邏輯,你應該可以發現以下幾點:

<1>. saveparams引數是在server物件下面,而server物件正好是redisServer型別,如下圖:

從上面圖中 *saveparams 的註釋上來看,你應該知道*saveparams是saveparam型別的陣列,那現在是不是有強烈的好奇心想看一下saveparam

型別是怎麼定義的的呢??? 如下圖:

可以看到,saveparam引數裡面有兩個引數,seconds就是儲存秒數,changes就是改變數,而這二個引數就對應著我們配置檔案中的900 0 這樣的

配置節,想起來的沒有哈~~~

<2>  然後我們通過if發現,如果終滿足,就會最終呼叫rdbSaveBackground來持久化我們的rdb檔案,簡單吧。。。

好了,大概就這樣了,希望對你有幫助。

相關推薦

15redis —— 快照模式深入分析

      我們知道redis是帶有持久化這個能力了,那到底持久化成到哪裡,持久化成啥樣呢???這篇我們一起來尋求答案。 一:快照模式   或許在用Redis之初的時候,就聽說過redis有兩種持久化模式,第一種是SNAPSHOTTING模式,還是一種是AOF模式,而且在實

15redis —— 釋出/訂閱模式

本系列已經過半了,這一篇我們來看看redis好玩的釋出訂閱模式,其實在很多的MQ產品中都存在這樣的一個模式,我們常聽到的一個例子 就是郵件訂閱的場景,什麼意思呢,也就是說100個人訂閱了你的部落格,如果博主發表了文章,那麼100個人就會同時收到通知郵件,除了這個 場景還能找到

15redis —— 集合物件型別

1 /* 2 * Copyright (c) 2009-2012, Salvatore Sanfilippo <antirez at gmail dot com> 3 * All rights reserved. 4 * 5 * Redistribution and

15redis —— 無敵的列表型別

 據說60%的人使用redis看重的是redis中的list型別,那這個list有什麼用呢???不用我說大家都明白,做佇列使用唄,為什麼用它呢,很簡單唄, 因為有了它我就不需要專門的MQ產品啦,比如說RabbitMQ,ActiveMQ等等。。。對吧。 一:實戰      先

15redis —— 第一 開始入手

    雙十一終於還是過去了,我負責的mongodb由於做了副本集,最終還是挺過去了,同事負責的redis,還是遺憾的在早上8點左右宕機了,然後大家就是馬不停 蹄的趕往公司解決問題,因為我對redis也不是很瞭解,工作上使用redis的時候也是應付的找找資料,所以沒有從系統層

redis —— 4 雜湊物件型別

redis中的hash也是我們使用中的高頻資料結構, 它的構造基本上和程式語言中的HashTable,Dictionary大同小異, 如果大家往後有什麼邏 輯需要用Dictionary存放的話, 可

支撐微博億級社交平臺,小白也能Redis叢集(原理)

Redis作為一款效能優異的記憶體資料庫,支撐著微博億級社交平臺,也成為很多網際網路公司的標配。這裡將以Redis Cluster叢集為核心,基於最新的Redis5版本,從原理再到實戰,玩轉Redis叢集 常見Redis叢集方案 在介紹Redis Cluster叢集方案之前,為了方便對比,先簡單瞭解一下業

支撐微博億級社交平臺,小白也能Redis叢集(實戰)

上篇文章《支撐微博億級社交平臺,小白也能玩轉Redis叢集(原理篇)》介紹了Redis叢集相關原理,這篇文章將介紹Redis Cluster叢集的搭建、配置,運維、擴容等具體操作 叢集搭建 2018年10月 Redis 釋出了穩定版本的 5.0 版本,推出了各種新特性,其中一點是叢集管理工具從基於Ruby

[老老實實學WCF] 訊息通訊模式(下) 雙工

老老實實學WCF 第十篇 訊息通訊模式(下) 雙工 在前一篇的學習中,我們瞭解了單向和請求/應答這兩種訊息通訊模式。我們知道可以通過配置操作協定的IsOneWay屬性來改變模式。在這一篇中我們來研究雙工這種訊息通訊模式。 在一定程度上說,雙工模式並不是與前面兩種模式相提

【設計模式:外觀模式,開著小破車的快樂

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6cc3b1afe0eb425197976764db0d545c~tplv-k3u1fbpfcp-zoom-1.image) # 一 開著小破車的快樂 不知道大家有沒有這樣開或者坐過這樣一輛“小破車

:springboot集成swagger2,構建優雅的Restful API

html 風格 lan round amt select() hash 指定 model   聲明:本部分內容均轉自於方誌明博友的博客,因為本人很喜歡他的博客,所以一直在學習,轉載僅是記錄和分享,若也有喜歡的人的話,可以去他的博客首頁看:http://blog.csdn.n

】Node深入淺出 章節總結(九章 — 程序) 完結

為了看黑色背景,就轉了過來,眼睛看白色螢幕實在受不鳥! 本章總結將結合個人搭建 egg 引入公司的一些實踐來進行總結,希望能讓大家瞭解到程序管理和叢集分發的重要性。 閱讀完本章你應該理解以下幾點: 為什麼要使用多程序架構啟動服務; 經典的 Master-Worker

redis持久化,阿里架構師給你來一方案介紹

一、基本介紹 本次演示使用的redis版本是3.2.100,作業系統是win10。 redis支援兩種持久化方案,RDB和AOF

:K均值聚類(KMeans)

步驟 中國 小結 logo kmeans 實現 調整 r語言 img 前言 本文講解如何使用R語言進行 KMeans 均值聚類分析,並以一個關於人口出生率死亡率的實例演示具體分析步驟。 聚類分析總體流程 1. 載入並了解數據集;2. 調用聚類函數進行聚類

SQL Serverf 索引 - 索引壓縮 、附加特性 <>

eat name inf bsp post 正常 physical 生效 info 一、索引壓縮   數據和索引壓縮在SQL Server2008被引入。壓縮一個索引意味著將在一個頁面中獲得更多的關鍵字信息。這可以造成重大的性能改進,因為存儲索引需要的頁面和索引級別更少。

:雜貨鋪

默認 類型函數 ngs py3 字符 最大值 技術 int() 所有 一、內置函數 2版本內置函數: 3版本的內置函數: 2、我們可以在idle裏面使用命令dir(__builtins__)查看Python的所有內置函數 標準類型函數 mp(num1,

:Spark SQL 源碼分析之 In-Memory Columnar Storage源碼分析之 query

pro .net asn 解析 partition store exec attr_ array /** Spark SQL源碼分析系列文章*/ 前面講到了Spark SQL In-Memory Columnar Storage的存儲結構是基於列存儲的。 那

HTTP跳HTTPS

p s write 測試 直接 list 域名跳轉 mil /var/ star 一、實現訪問http跳轉https訪問(http的單向認證)①修改配置文件# vim /etc/httpd/conf/httpd.conf 增加在文件最後 <IfModule s

python全棧開發【】Python常用模塊二(時間、random、os、sys和序列化)

utc時間 用戶 這也 文件名 password 如何 json字符串 並且 持久 一、time模塊 表示時間的三種方式:   時間戳:數字(計算機能認識的)   時間字符串:t=‘2012-12-12‘   結構化時間:time.struct_time(tm_year=2

MySQL數據庫學習【】(視圖、觸發器、事物)

註意 onf action 聲明 concat_ws base 循環 5-0 print 一、視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可