redis 系列20 伺服器下

来源:https://www.cnblogs.com/MrHSR/archive/2018/12/07/10076631.html
-Advertisement-
Play Games

二. serverCron函數 2.3 更新伺服器每秒執行命令次數 serverCron函數中的trackOperationsPerSecond函數會以每100毫秒一次的頻率執行,這個函數以抽樣計算的方式,估算並記錄伺服器在最近一秒鐘處理的命令請求數量,這個值可以通過info status命令的in ...


二. serverCron函數

  2.3 更新伺服器每秒執行命令次數

    serverCron函數中的trackOperationsPerSecond函數會以每100毫秒一次的頻率執行,這個函數以抽樣計算的方式,估算並記錄伺服器在最近一秒鐘處理的命令請求數量,這個值可以通過info status命令的instantaneous_ops_sec域查看:

        127.0.0.1:6379> info stats
        # Stats
        total_connections_received:5
        total_commands_processed:67
        //伺服器在最近一秒鐘處理的命令請求數量
        instantaneous_ops_per_sec:0

  關於trackOperationsPerSecond函數的內部實現就不再介紹,大致是當客戶端執行INFO命令時,伺服器就會調用getOperationsPerSecond函數,根據ops_sec_samples環形數組中的抽樣結果,計算出instantaneous_ops_per_sec屬性的值。

  

  2.4 更新伺服器記憶體

    伺服器狀態redisServer結構的stat_peak_memory屬性記錄了伺服器的記憶體峰值大小,每次serverCron函數執行時,程式都會查看伺服器當前使用的記憶體數量,並與stat_peak_memory保存的數值進行比較,如果當前的記憶體數量比stat_peak_memory屬性記錄的值要大,那麼程式就將當前使用的記憶體數量記錄到stat_peak_memory屬性記錄中。INFO memory命令的used_memory_peak和used_memory_peak_human兩個域分別以兩種格式記錄了伺服器的記憶體峰值。

    127.0.0.1:6379> info memory
    # Memory
    used_memory_peak:858952
    used_memory_peak_human:838.82K

    這兩個是域是指過去Redis記憶體使用的峰值,是反映了記憶體過去最高峰值,而不是當前使用記憶體的值。

 

  2.5 處理sigterm信號

    在啟動伺服器時,redis會為伺服器進程的singterm信號關聯處理器singtermHandler函數,這個信息處理器負責在伺服器接收到singterm信號時,打開伺服器狀態的shutdown_asap標識。 每次serverCron函數運行時,程式都會對伺服器狀態redisServer結構函數的shutdown_asap屬性進行檢查,並根據屬性的值決定是否關閉伺服器。

        static void  sigtermHandler(int sig){
                //列印日誌
                redisLogFromHandler(reids_warning,"received sigterm, scheduling shutdown...");
            //打開關閉標識
                server.shutdown_asap=1;
            }
      //下麵先打開日誌功能,在redis.conf文件中設置日誌文件路徑,保存配置文件,重啟服務。
         171 logfile /usr/local/redis/redis.log
         [root@xuegod64 redis]# redis-server redis.conf
            
     //當在客戶端執行shutdown關閉伺服器時,伺服器在接到sigterm信號之後,關閉伺服器並列印相關日誌。
        127.0.0.1:6379> shutdown
        not connected>  

    日誌顯示可以看到,伺服器在關閉自身之前會進行RDB持久化操作,這也是伺服器攔截sigterm信號的原因,日誌信息如下:

          43:M 06 Dec 11:07:42.562 # User requested shutdown...

          42343:M 06 Dec 11:07:42.562 * Saving the final RDB snapshot before exiting.

          42343:M 06 Dec 11:07:42.565 * DB saved on disk

          42343:M 06 Dec 11:07:42.565 * Removing the pid file.

          42343:M 06 Dec 11:07:42.565 # Redis is now ready to exit, bye bye...

  

  2.6 管理客戶端資源

    serverCron函數每次執行都會調用clinetsCron函數,該函數會對一定數量的客戶端進行檢查,包括1.如果客戶端與伺服器的連接已經超時(如很長時間沒有互動),那麼程式會釋放這個客戶端。2.如果客戶端在上一次執行命令請求之後,輸入緩衝區的大小超過了一定的長度,那麼程式會釋放客戶端當前的輸入緩衝區。

 

  2.7 執行被延遲的bgrewriteaof

    說到bgsave和bgrewriteaof二個客戶端命令,前者針對RDB持久化,後者針對AOF 持久化。在伺服器執行bgsave命令的期間,如果客戶端向伺服器發送了bgrewriteaof命令,那麼伺服器會將bgrewriteaof命令的執行時間延遲到bgsave命令執行完畢之後。每次serverCron函數執行時,都會檢查bgsave命令或者bgrewriteaof命令是否正在執行,如果這兩個命令都沒在執行,並且aof_rewrite_scheduled屬性的值為1,那麼伺服器就會執行之前被推延的bgrewriteaof命令。

        struct redisServer {
                    //如果值為1, 那麼表示有bgrewriteaof命令被延遲了
                int aof_rewrite_scheduled;
            }

  

  2.8 檢查持久化操作的運作狀態

    伺服器狀態使用redisServer結構的rdb_child_pid屬性和aof_child_pid屬性記錄執行bgsave命令和bgrewriteaof命令的子進程的ID,這兩個屬性也可以用於檢查bgsave命令或者bgrewriteaof命令是否正在執行。

    struct redisServer {

            //記錄執行bgsave命令的子進程的ID
            //如果伺服器沒有在執行bgsave,那麼這個屬性的值為-1.
            pid_t rdb_chlid_pid;

            //記錄執行bgrewriteaof命令的子進程的ID
            //如果伺服器沒有在執行bgrewriteaof,那麼這個屬性的值為-1.
            pid_t aof_chlid_pid;
        }

    每次serverCron函數執行時,程式都會檢查rdb_chlid_pid和aof_child_pid兩個屬性值,只要其中一個屬性的值不為-1, 代表正在執行,程式就會執行一次wait3函數,檢查子進程是否有信號發給伺服器主進程。如果有信號到達:那麼對於bgsave命令來說,新的rdb文件已經生成; 對於bbgrewriteaof命令來說,AOF文件已經重寫完成; 伺服器需要進行相應命令的後續操作,比如用新的RDB文件替換現有RDB文件,或者用重寫後的AOF文件替換現有的AOF文件。如果沒有信號到達,那麼表示持久化操作未完成,程式不做動作。

 

三.初始化伺服器

    一個Redis伺服器啟動後,需要經過一系列的初始化和設置過程。比如(3.1)初始化伺服器狀態;(3.2)接受用戶指定的伺服器配置;(3.3)創建相應的數據結構和網路連接等。

  3.1 初始化伺服器狀態結構

    初始化伺服器第一步就是創建一個struct redisServer類型的實例變數server作為伺服器狀態,併為結構中的各個屬性設置預設值。初始化server變數的工作由redis.c/initServerConfig函數完成。主要包括:設置伺服器運行ID(info 命令信息中的run_id);設置伺服器的預設運行頻率(hz,在18 事件篇中有講);設置伺服器的預設文件路徑(info 命令信息中的config_file) ;設置伺服器運行架構(info 命令信息中的arch_bits) ;設置伺服器的預設埠號(info 命令信息中的tcp_port) ;設置伺服器的預設RDB持久化條件和AOF持久化條件;初始化伺服器的LRU時鐘;創建命令表。 該initServerConfig函數沒有創建伺服器狀態的其他數據結構;資料庫;慢查詢日誌;LUA環境;共用對象,這些數據結構在之後的步驟才會被創建出來

127.0.0.1:6379> info
# Server
redis_version:4.0.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:836bbbcc913c7a57
redis_mode:standalone
os:Linux 3.10.0-693.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:58994
run_id:b0694f86c7e794bf851f6193f1f96d85f993f325
tcp_port:6379
uptime_in_seconds:20
uptime_in_days:0
hz:10
lru_clock:659411
executable:/usr/local/redis/redis-server
config_file:/usr/local/redis/redis.conf

  

  3.2 載入配置選項

    在啟動伺服器時,用戶可以通過給定配置參數或者指定配置文件來修改伺服器的預設配置,當伺服器在用initServerConfig函數初始化完server變數之後,就會開始載入用戶給定的配置參數和配置文件,並根據用戶設定的配置,對server變數相關屬性的值進行修改。

    例1:用戶在終端中指定redis伺服器埠號,預設埠從6379變為了10086,啟動服務

         [root@xuegod64 redis]# redis-server --port 10086
         60098:C 07 Dec 16:04:05.183 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
        //下麵通過另一個客戶端,指定埠,連接到伺服器,通過info來查看,是沒有config_file的配置路徑。
        [root@xuegod64 ~]# redis-cli -h 127.0.0.1 -p 10086
         127.0.0.1:10086>info
        # Server
        redis_version:4.0.6
        ....

    例2: 用戶通過載入redis.conf配置文件,這是最常見的啟動服務。通過info來查看,這種是有config_file的配置路徑的

    [root@xuegod64 redis]# redis-server redis.conf

      通過上面案例知道,如果用戶為伺服器狀態屬性指定了新的值,那麼伺服器就會更新相應的屬性值,如果沒有為屬性設置新的值,那麼伺服器就用之前initServerConfig函數為屬性設置的預設值。

  

  3.3 初始化伺服器數據結構

    伺服器在載入用戶指定的配置選項,並對server狀態進行更新之後,伺服器就可以進入初始化第三個階段,此時伺服器創建的數據結構還包括:server.clients鏈表;server.db數組;保存頻道訂閱信息的server.pubsub_channels字典以及server.pubsub_patterns鏈表; 用於執行Lua腳本的server.lua;  用於保存慢日誌的server.slowlog屬性。

    接著伺服器將調用initServer函數,為以上的數據結構分配記憶體,該函數設置還包括:為伺服器設置進程號處理器;創建共用對象;打開伺服器監聽埠;為serverCron函數創建時間事件;做好AOF持久化寫入準備;初始化伺服器後臺I/O模塊。當initServer函數執行完後,伺服器將用ascll字元在日誌中列印出redis的圖標,以及redis的版本號信息。

    

      3.4 還原資料庫狀態

    在完成了對伺服器狀態server變數的初始化之後,伺服器需要載入RDB文件或者AOF文件,並根據文件記錄的內容來還原伺服器的資料庫狀態。如果伺服器啟用了AOF持久化功能,那麼伺服器使用AOF文件來還原資料庫狀態;相反 如果伺服器沒有啟用AOF持久化功能,那麼伺服器使用RDB文件來還原資料庫狀態。

    60183:M 07 Dec 16:06:15.343 * DB loaded from disk: 0.000 seconds    

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要 網上一些激活工具可能捆綁了木馬、病毒。使用激活工具有風險。使用線上KMS來激活系統則沒有這個風險。(自測至發佈日期仍然可用) (有能力的請支持正版windows系統) 將kms伺服器地址設置為kms.03k.org(線上可用的KMS伺服器都可以) 已管理員身份運行CMD輸入命令:slmgr / ...
  • awk 命令詳解 awk 是一種編程語言,用於在linux/nuix下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大的編程工具。它在命令行中使用,但更多是作為腳本來使用。 awk 的處理 ...
  • 背景 隨著博客越寫越多,難免會遇到需要插入圖片來說明的情況。 圖床選擇 首先調研了市面上的圖床服務,本著穩定長期的目標,過濾掉了打一槍換一個地方的野雞小網站,剩餘比較靠譜的優缺點如下。 |圖床|優點|缺點| | | | | |騰訊雲|免費 無需功能變數名稱|未來可能會收費| |七牛|免費|需要功能變數名稱和備案| ...
  • Zabbix trigger是zabbix 進行告警通知的設定條件 ,當監控獲取的值觸發了設定的條件時,會按照觸發器的設定,執行相應的action 操作 。在zabbix中為了比較方便的設定各種條件,zabbix為我們設計了相應的函數和操作符 。 一、創建觸發器觸發器可以是和模板關聯的,也可以是和主 ...
  • 一 註冊賬號和申請 1 Digital Ocean網址https://cloud.digitalocean.com,可直接通過郵箱註冊,會向郵箱發送驗證碼。在註冊後必須先充值5美元才可以使用,充值時可選擇paypal或者信用卡支付。 2 關於優惠。如果直接點擊官網鏈接註冊是沒有優惠的。如果你是在校大 ...
  • top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。下麵詳細介紹它的使用方法。top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前臺執行該命令,它將獨占前臺,直到用戶終止該程式為止.比較準確的說,top命令提供了 ...
  • 需求:外部人員需要對公司伺服器上某個文件夾內容進行讀寫操作 文件目錄信息:/opt/abc drwxr-xr-x 9 www www 4096 12月 4 13:02 abc #註意最初abc的www用戶組沒有寫許可權 為了後面的ftp用戶能夠對此文件具備寫操作,需要添加www用戶組的寫許可權: chm ...
  • MapReduce是什麼 MapReduce是一種分散式計算編程框架,是Hadoop主要組成部分之一,可以讓用戶專註於編寫核心邏輯代碼,最後以高可靠、高容錯的方式在大型集群上並行處理大量數據。 MapReduce的存儲 MapReduce的數據是存儲在HDFS上的,HDFS也是Hadoop的主要組成 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...