<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【94期】面試官:熟悉Redis嗎,項目中你是如何對Redis內(nèi)存進行優(yōu)化的

          共 1447字,需瀏覽 3分鐘

           ·

          2020-11-21 04:24

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 5 分鐘。

          來自:cnblogs.com/niejunlei/p/12898225.html

          對于redis來說,什么是最重要的?
          毋庸置疑,是內(nèi)存。

          一、reids 內(nèi)存分析

          redis內(nèi)存使用情況:info memory
          示例:
          可以看到,當前節(jié)點內(nèi)存碎片率為226893824/209522728≈1.08,使用的內(nèi)存分配器是jemalloc。
          used_memory_rss?通常情況下是大于?used_memory?的,因為內(nèi)存碎片的存在。
          但是當操作系統(tǒng)把redis內(nèi)存swap到硬盤時,memory_fragmentation_ratio 會小于1。redis使用硬盤作為內(nèi)存,因為硬盤的速度,redis性能會受到極大的影響。

          二、redis 內(nèi)存使用

          之前的文章關(guān)于redis,你需要了解的幾點!中我們簡單介紹過redis的內(nèi)存使用分布:自身內(nèi)存,鍵值對象占用、緩沖區(qū)內(nèi)存占用及內(nèi)存碎片占用。
          https://www.cnblogs.com/niejunlei/p/12896605.html
          redis 空進程自身消耗非常的少,可以忽略不計,優(yōu)化內(nèi)存可以不考慮此處的因素。

          1、對象內(nèi)存

          對象內(nèi)存,也即真實存儲的數(shù)據(jù)所占用的內(nèi)存。
          redis k-v結(jié)構(gòu)存儲,對象占用可以簡單的理解為?k-size + v-size。
          redis的鍵統(tǒng)一都為字符串類型,值包含多種類型:string、list、hash、set、zset五種基本類型及基于string的Bitmaps和HyperLogLog類型等。
          在實際的應(yīng)用中,一定要做好kv的構(gòu)建形式及內(nèi)存使用預(yù)期,可以參考 關(guān)于redis,你需要了解的幾點!中關(guān)于不同值類型不同形式下的內(nèi)部存儲實現(xiàn)介紹。

          2、緩沖內(nèi)存

          緩沖內(nèi)存包括三部分:客戶端緩存、復(fù)制積壓緩存及AOF緩沖區(qū)。

          1)客戶端緩存

          接入redis服務(wù)器的TCP連接輸入輸出緩沖內(nèi)存占用,TCP輸入緩沖占用是不受控制的,最大允許空間為1G。輸出緩沖占用可以通過client-output-buffer-limit參數(shù)配置。
          redis 客戶端主要分為從客戶端、訂閱客戶端和普通客戶端。
          從客戶端連接占用:也就是我們所說的slave,主節(jié)點會為每一個從節(jié)點建立一條連接用于命令復(fù)制,緩沖配置為:client-output-buffer-limit slave 256mb 64mb 60。
          主從之間的間絡(luò)延遲及掛載的從節(jié)點數(shù)量是影響內(nèi)存占用的主要因素。因此在涉及需要異地部署主從時要特別注意,另外,也要避免主節(jié)點上掛載過多的從節(jié)點(<=2);
          訂閱客戶端內(nèi)存占用:發(fā)布訂閱功能連接客戶端使用單獨的緩沖區(qū),默認配置:client-output-buffer-limit pubsub 32mb 8mb 60。
          當消費慢于生產(chǎn)時會造成緩沖區(qū)積壓,因此需要特別注意消費者角色配比及生產(chǎn)、消費速度的監(jiān)控。
          普通客戶端內(nèi)存占用:除了上述之外的其它客戶端,如我們通常的應(yīng)用連接,默認配置:client-output-buffer-limit normal 1000。
          可以看到,普通客戶端沒有配置緩沖區(qū)限制,通常一般的客戶端內(nèi)存消耗也可以忽略不計。
          但是當redis服務(wù)器響應(yīng)較慢時,容易造成大量的慢連接,主要表現(xiàn)為連接數(shù)的突增,如果不能及時處理,此時會嚴重影響redis服務(wù)節(jié)點的服務(wù)及恢復(fù)。
          關(guān)于此,在實際應(yīng)用中需要注意幾點:
          • maxclients最大連接數(shù)配置必不可少。

          • 合理預(yù)估單次操作數(shù)據(jù)量(寫或讀)及網(wǎng)絡(luò)時延ttl。

          • 禁止線上大吞吐量命令操作,如keys等。

          高并發(fā)應(yīng)用情景下,redis內(nèi)存使用需要有實時的監(jiān)控預(yù)警機制,

          2)復(fù)制積壓緩沖區(qū)

          v2.8之后提供的一個可重用的固定大小緩沖區(qū),用以實現(xiàn)向從節(jié)點的部分復(fù)制功能,避免全量復(fù)制。配置單數(shù):repl-backlog-size,默認1M。單個主節(jié)點配置一個復(fù)制積壓緩沖區(qū)。

          3)AOF緩沖區(qū)

          AOF重寫期間增量的寫入命令保存,此部分緩存占用大小取決于AOF重寫時間及增量。

          3、內(nèi)存碎片內(nèi)存占用

          關(guān)于redis,你需要了解的幾點!簡單介紹過redis的內(nèi)存分配方式。(更多面試題,歡迎關(guān)注公眾號 Java面試題精選)

          三、redis 子進程內(nèi)存消耗

          子進程即redis執(zhí)行持久化(RDB/AOF)時fork的子任務(wù)進程。

          1、關(guān)于linux系統(tǒng)的寫時復(fù)制機制:

          父子進程會共享相同的物理內(nèi)存頁,父進程處理寫請求時會對需要修改的頁復(fù)制一份副本進行修改,子進程讀取的內(nèi)存則為fork時的父進程內(nèi)存快照,因此,子進程的內(nèi)存消耗由期間的寫操作增量決定。

          2、關(guān)于linux的透明大頁機制THP(Transparent Huge Page):

          THP機制會降低fork子進程的速度;寫時復(fù)制內(nèi)存頁由4KB增大至2M。高并發(fā)情境下,寫時復(fù)制內(nèi)存占用消耗影響會很大,因此需要選擇性關(guān)閉。

          3、關(guān)于linux配置:

          一般需要配置linux系統(tǒng)?vm.overcommit_memory=1,以允許系統(tǒng)可以分配所有的物理內(nèi)存。防止fork任務(wù)因內(nèi)存而失敗。

          四、redis 內(nèi)存管理

          redis的內(nèi)存管理主要分為兩方面:內(nèi)存上限控制及內(nèi)存回收管理。

          1、內(nèi)存上限:maxmemory

          目的:緩存應(yīng)用內(nèi)存回收機制觸發(fā) + 防止物理內(nèi)存用盡(redis 默認無限使用服務(wù)器內(nèi)存) + 服務(wù)節(jié)點內(nèi)存隔離(單服務(wù)器上部署多個redis服務(wù)節(jié)點)
          在進行內(nèi)存分配及限制時要充分考慮內(nèi)存碎片占用影響。
          動態(tài)調(diào)整,擴展redis服務(wù)節(jié)點可用內(nèi)存:config set maxmemory {}。

          2、內(nèi)存回收

          回收時機:鍵過期、內(nèi)存占用達到上限

          1)過期鍵刪除:

          redis 鍵過期時間保存在內(nèi)部的過期字典中,redis采用惰性刪除機制+定時任務(wù)刪除機制。
          惰性刪除:即讀時刪除,讀取帶有超時屬性的鍵時,如果鍵已過期,則刪除然后返回空值。這種方式存在問題是,觸發(fā)時機,加入過期鍵長時間未被讀取,那么它將會一直存在內(nèi)存中,造成內(nèi)存泄漏。
          定時任務(wù)刪除:redis內(nèi)部維護了一個定時任務(wù)(默認每秒10次,可配置),通過自適應(yīng)法進行刪除。
          刪除邏輯如下:
          需要說明的一點是,快慢模式執(zhí)行的刪除邏輯相同,這是超時時間不同。

          2)內(nèi)存溢出控制

          當內(nèi)存達到maxmemory,會觸發(fā)內(nèi)存回收策略,具體策略依據(jù)maxmemory-policy來執(zhí)行。
          • noevication:默認不回收,達到內(nèi)存上限,則不再接受寫操作,并返回錯誤。

          • volatile-lru:根據(jù)LRU算法刪除設(shè)置了過期時間的鍵,如果沒有則不執(zhí)行回收。

          • allkeys-lru:根據(jù)LRU算法刪除鍵,針對所有鍵。

          • allkeys-random:隨機刪除鍵。

          • volatitle-random:速記刪除設(shè)置了過期時間的鍵。

          • volatilte-ttl:根據(jù)鍵ttl,刪除最近過期的鍵,同樣如果沒有設(shè)置過期的鍵,則不執(zhí)行刪除。

          動態(tài)配置:config set maxmemory-policy {}
          在設(shè)置了maxmemory情況下,每次的redis操作都會檢查執(zhí)行內(nèi)存回收,因此對于線上環(huán)境,要確保所這只的maxmemory>used_memory。
          另外,可以通過動態(tài)配置maxmemory來主動觸發(fā)內(nèi)存回收。

          推薦閱讀:

          【93期】經(jīng)典面試題:Redis 內(nèi)存滿了怎么辦?

          【92期】面試官:你說你精通Java并發(fā),那給我講講J.U.C吧

          【91期】面試官:Spring 用了哪些設(shè)計模式?說三種即可

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費獲取??!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱?

          瀏覽 130
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  加勒比蜜桃日韩成人 | wwwx欧美 | 亚洲一级一射欧美999 | 亚洲操逼操 | 人人射在线观看 |