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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...