女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Redis更節(jié)省內存?

jf_ro2CN3Fa ? 來源:水滴與銀彈 ? 作者:水滴與銀彈 ? 2022-12-19 15:41 ? 次閱讀


前言

這篇文章我想和你聊一聊 Redis 的最佳實踐。

你的項目或許已經(jīng)使用 Redis 很長時間了,但在使用過程中,你可能還會或多或少地遇到以下問題:

  • 我的 Redis 內存為什么增長這么快?
  • 為什么我的 Redis 操作延遲變大了?
  • 如何降低 Redis 故障發(fā)生的頻率?
  • 日常運維 Redis 需要注意什么?
  • 部署 Redis 時,如何做好資源規(guī)劃?
  • Redis 監(jiān)控重點要關注哪些指標?

尤其是當你的項目越來越依賴 Redis 時,這些問題就變得尤為重要。

此時,你迫切需要一份「最佳實踐指南」

這篇文章,我將從以下七個維度,帶你「全面」分析 Redis 的最佳實踐優(yōu)化:

  • 內存
  • 性能
  • 高可靠
  • 日常運維
  • 資源規(guī)劃
  • 監(jiān)控
  • 安全

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

如何使用 Redis 更節(jié)省內存?

首先,我們來看一下 Redis 內存方面的優(yōu)化。

眾所周知,Redis 的性能之所以如此之高,原因就在于它的數(shù)據(jù)都存儲在「內存」中,所以訪問 Redis 中的數(shù)據(jù)速度極快。

但從資源利用率層面來說,機器的內存資源相比于磁盤,還是比較昂貴的。

當你的業(yè)務應用在 Redis 中存儲數(shù)據(jù)很少時,你可能并不太關心內存資源的使用情況。但隨著業(yè)務的發(fā)展,你的業(yè)務存儲在 Redis 中的數(shù)據(jù)就會越來越多。

如果沒有提前制定好內存優(yōu)化策略,那么等業(yè)務開始增長時,Redis 占用的內存也會開始膨脹。

所以,提前制定合理的內存優(yōu)化策略,對于資源利用率的提升是很有必要的。

那在使用 Redis 時,怎樣做才能更節(jié)省內存呢?這里我給你總結了 6 點建議,我們依次來看:

1) 控制 key 的長度

最簡單直接的內存優(yōu)化,就是控制 key 的長度。

在開發(fā)業(yè)務時,你需要提前預估整個 Redis 中寫入 key 的數(shù)量,如果 key 數(shù)量達到了百萬級別,那么,過長的 key 名也會占用過多的內存空間。

所以,你需要保證 key 在簡單、清晰的前提下,盡可能把 key 定義得短一些。

例如,原有的 key 為 user123,則可以優(yōu)化為 u123。

這樣一來,你的 Redis 就可以節(jié)省大量的內存,這個方案對內存的優(yōu)化非常直接和高效。

2) 避免存儲 bigkey

除了控制 key 的長度之外,你同樣需要關注 value 的大小,如果大量存儲 bigkey,也會導致 Redis 內存增長過快。

除此之外,客戶端在讀寫 bigkey 時,還有產(chǎn)生性能問題(下文會具體詳述)。

所以,你要避免在 Redis 中存儲 bigkey,我給你的建議是:

  • String:大小控制在 10KB 以下
  • List/Hash/Set/ZSet:元素數(shù)量控制在 1 萬以下

3) 選擇合適的數(shù)據(jù)類型

Redis 提供了豐富的數(shù)據(jù)類型,這些數(shù)據(jù)類型在實現(xiàn)上,也對內存使用做了優(yōu)化。具體來說就是,一種數(shù)據(jù)類型對應多種數(shù)據(jù)結構來實現(xiàn):

1082542e-7f1d-11ed-8abf-dac502259ad0.png

例如,String、Set 在存儲 int 數(shù)據(jù)時,會采用整數(shù)編碼存儲。Hash、ZSet 在元素數(shù)量比較少時(可配置),會采用壓縮列表(ziplist)存儲,在存儲比較多的數(shù)據(jù)時,才會轉換為哈希表和跳表。

作者這么設計的原因,就是為了進一步節(jié)約內存資源。

那么你在存儲數(shù)據(jù)時,就可以利用這些特性來優(yōu)化 Redis 的內存。這里我給你的建議如下:

  • String、Set:盡可能存儲 int 類型數(shù)據(jù)
  • Hash、ZSet:存儲的元素數(shù)量控制在轉換閾值之下,以壓縮列表存儲,節(jié)約內存

4) 把 Redis 當作緩存使用

Redis 數(shù)據(jù)存儲在內存中,這也意味著其資源是有限的。你在使用 Redis 時,要把它當做緩存來使用,而不是數(shù)據(jù)庫。

所以,你的應用寫入到 Redis 中的數(shù)據(jù),盡可能地都設置「過期時間」。

業(yè)務應用在 Redis 中查不到數(shù)據(jù)時,再從后端數(shù)據(jù)庫中加載到 Redis 中。

108fd126-7f1d-11ed-8abf-dac502259ad0.jpg

采用這種方案,可以讓 Redis 中只保留經(jīng)常訪問的「熱數(shù)據(jù)」,內存利用率也會比較高。

5) 實例設置 maxmemory + 淘汰策略

雖然你的 Redis key 都設置了過期時間,但如果你的業(yè)務應用寫入量很大,并且過期時間設置得比較久,那么短期間內 Redis 的內存依舊會快速增長。

如果不控制 Redis 的內存上限,也會導致使用過多的內存資源。

對于這種場景,你需要提前預估業(yè)務數(shù)據(jù)量,然后給這個實例設置 maxmemory 控制實例的內存上限,這樣可以避免 Redis 的內存持續(xù)膨脹。

配置了 maxmemory,此時你還要設置數(shù)據(jù)淘汰策略,而淘汰策略如何選擇,你需要結合你的業(yè)務特點來決定:

  • volatile-lru / allkeys-lru:優(yōu)先保留最近訪問過的數(shù)據(jù)
  • volatile-lfu / allkeys-lfu:優(yōu)先保留訪問次數(shù)最頻繁的數(shù)據(jù)(4.0+版本支持)
  • volatile-ttl :優(yōu)先淘汰即將過期的數(shù)據(jù)
  • volatile-random / allkeys-random:隨機淘汰數(shù)據(jù)

6) 數(shù)據(jù)壓縮后寫入 Redis

以上方案基本涵蓋了 Redis 內存優(yōu)化的各個方面。

如果你還想進一步優(yōu)化 Redis 內存,你還可以在業(yè)務應用中先將數(shù)據(jù)壓縮,再寫入到 Redis 中(例如采用 snappy、gzip 等壓縮算法)。

當然,壓縮存儲的數(shù)據(jù),客戶端在讀取時還需要解壓縮,在這期間會消耗更多 CPU 資源,你需要根據(jù)實際情況進行權衡。

以上就是「節(jié)省內存資源」方面的實踐優(yōu)化,是不是都比較簡單?

下面我們來看「性能」方面的優(yōu)化。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

如何持續(xù)發(fā)揮 Redis 的高性能?

當你的系統(tǒng)決定引入 Redis 時,想必看中它最關鍵的一點就是:性能

我們知道,一個單機版 Redis 就可以達到 10W QPS,這么高的性能,也意味著如果在使用過程中發(fā)生延遲情況,就會與我們的預期不符。

所以,在使用 Redis 時,如何持續(xù)發(fā)揮它的高性能,避免操作延遲的情況發(fā)生,也是我們的關注焦點。

在這方面,我給你總結了 13 條建議:

1) 避免存儲 bigkey

存儲 bigkey 除了前面講到的使用過多內存之外,對 Redis 性能也會有很大影響。

由于 Redis 處理請求是單線程的,當你的應用在寫入一個 bigkey 時,更多時間將消耗在「內存分配」上,這時操作延遲就會增加。同樣地,刪除一個 bigkey 在「釋放內存」時,也會發(fā)生耗時。

而且,當你在讀取這個 bigkey 時,也會在「網(wǎng)絡數(shù)據(jù)傳輸」上花費更多時間,此時后面待執(zhí)行的請求就會發(fā)生排隊,Redis 性能下降。

109fe3c2-7f1d-11ed-8abf-dac502259ad0.jpg

所以,你的業(yè)務應用盡量不要存儲 bigkey,避免操作延遲發(fā)生。

如果你確實有存儲 bigkey 的需求,你可以把 bigkey 拆分為多個小 key 存儲。

2) 開啟 lazy-free 機制

如果你無法避免存儲 bigkey,那么我建議你開啟 Redis 的 lazy-free 機制。(4.0+版本支持)

當開啟這個機制后,Redis 在刪除一個 bigkey 時,釋放內存的耗時操作,將會放到后臺線程中去執(zhí)行,這樣可以在最大程度上,避免對主線程的影響。

10ab5a5e-7f1d-11ed-8abf-dac502259ad0.jpg

3) 不使用復雜度過高的命令

Redis 是單線程模型處理請求,除了操作 bigkey 會導致后面請求發(fā)生排隊之外,在執(zhí)行復雜度過高的命令時,也會發(fā)生這種情況。

因為執(zhí)行復雜度過高的命令,會消耗更多的 CPU 資源,主線程中的其它請求只能等待,這時也會發(fā)生排隊延遲。

所以,你需要避免執(zhí)行例如 SORT、SINTER、SINTERSTORE、ZUNIONSTORE、ZINTERSTORE 等聚合類命令。

對于這種聚合類操作,我建議你把它放到客戶端來執(zhí)行,不要讓 Redis 承擔太多的計算工作。

4) 執(zhí)行 O(N) 命令時,關注 N 的大小

規(guī)避使用復雜度過高的命令,就可以高枕無憂了么?

答案是否定的。

當你在執(zhí)行 O(N) 命令時,同樣需要注意 N 的大小。

如果一次性查詢過多的數(shù)據(jù),也會在網(wǎng)絡傳輸過程中耗時過長,操作延遲變大。

所以,對于容器類型(List/Hash/Set/ZSet),在元素數(shù)量未知的情況下,一定不要無腦執(zhí)行 LRANGE key 0 -1 / HGETALL / SMEMBERS / ZRANGE key 0 -1。

在查詢數(shù)據(jù)時,你要遵循以下原則:

  1. 先查詢數(shù)據(jù)元素的數(shù)量(LLEN/HLEN/SCARD/ZCARD)
  2. 元素數(shù)量較少,可一次性查詢全量數(shù)據(jù)
  3. 元素數(shù)量非常多,分批查詢數(shù)據(jù)(LRANGE/HASCAN/SSCAN/ZSCAN)

5) 關注 DEL 時間復雜度

你沒看錯,在刪除一個 key 時,如果姿勢不對,也有可能影響到 Redis 性能。

刪除一個 key,我們通常使用的是 DEL 命令,回想一下,你覺得 DEL 的時間復雜度是多少?

O(1) ?其實不一定。

當你刪除的是一個 String 類型 key 時,時間復雜度確實是 O(1)。

但當你要刪除的 key 是 List/Hash/Set/ZSet 類型,它的復雜度其實為 O(N),N 代表元素個數(shù)。

也就是說,刪除一個 key,其元素數(shù)量越多,執(zhí)行 DEL 也就越慢!

原因在于,刪除大量元素時,需要依次回收每個元素的內存,元素越多,花費的時間也就越久!

而且,這個過程默認是在主線程中執(zhí)行的,這勢必會阻塞主線程,產(chǎn)生性能問題。

那刪除這種元素比較多的 key,如何處理呢?

我給你的建議是,分批刪除:

  • List類型:執(zhí)行多次 LPOP/RPOP,直到所有元素都刪除完成
  • Hash/Set/ZSet類型:先執(zhí)行 HSCAN/SSCAN/SCAN 查詢元素,再執(zhí)行 HDEL/SREM/ZREM 依次刪除每個元素

沒想到吧?一個小小的刪除操作,稍微不小心,也有可能引發(fā)性能問題,你在操作時需要格外注意。

6) 批量命令代替單個命令

當你需要一次性操作多個 key 時,你應該使用批量命令來處理。

批量操作相比于多次單個操作的優(yōu)勢在于,可以顯著減少客戶端、服務端的來回網(wǎng)絡 IO 次數(shù)。

所以我給你的建議是:

  • String / Hash 使用 MGET/MSET 替代 GET/SET,HMGET/HMSET 替代 HGET/HSET
  • 其它數(shù)據(jù)類型使用 Pipeline,打包一次性發(fā)送多個命令到服務端執(zhí)行
10be76f2-7f1d-11ed-8abf-dac502259ad0.jpg

7) 避免集中過期 key

Redis 清理過期 key 是采用定時 + 懶惰的方式來做的,而且這個過程都是在主線程中執(zhí)行。

如果你的業(yè)務存在大量 key 集中過期的情況,那么 Redis 在清理過期 key 時,也會有阻塞主線程的風險。

10ce03ce-7f1d-11ed-8abf-dac502259ad0.jpg

想要避免這種情況發(fā)生,你可以在設置過期時間時,增加一個隨機時間,把這些 key 的過期時間打散,從而降低集中過期對主線程的影響。

8) 使用長連接操作 Redis,合理配置連接池

你的業(yè)務應該使用長連接操作 Redis,避免短連接。

當使用短連接操作 Redis 時,每次都需要經(jīng)過 TCP 三次握手、四次揮手,這個過程也會增加操作耗時。

同時,你的客戶端應該使用連接池的方式訪問 Redis,并設置合理的參數(shù),長時間不操作 Redis 時,需及時釋放連接資源。

9) 只使用 db0

盡管 Redis 提供了 16 個 db,但我只建議你使用 db0。

為什么呢?我總結了以下 3 點原因:

  1. 在一個連接上操作多個 db 數(shù)據(jù)時,每次都需要先執(zhí)行 SELECT,這會給 Redis 帶來額外的壓力
  2. 使用多個 db 的目的是,按不同業(yè)務線存儲數(shù)據(jù),那為何不拆分多個實例存儲呢?拆分多個實例部署,多個業(yè)務線不會互相影響,還能提高 Redis 的訪問性能
  3. Redis Cluster 只支持 db0,如果后期你想要遷移到 Redis Cluster,遷移成本高

10) 使用讀寫分離 + 分片集群

如果你的業(yè)務讀請求量很大,那么可以采用部署多個從庫的方式,實現(xiàn)讀寫分離,讓 Redis 的從庫分擔讀壓力,進而提升性能。

10edbf16-7f1d-11ed-8abf-dac502259ad0.jpg

如果你的業(yè)務寫請求量很大,單個 Redis 實例已無法支撐這么大的寫流量,那么此時你需要使用分片集群,分擔寫壓力。

10fe060a-7f1d-11ed-8abf-dac502259ad0.jpg

11) 不開啟 AOF 或 AOF 配置為每秒刷盤

如果對于丟失數(shù)據(jù)不敏感的業(yè)務,我建議你不開啟 AOF,避免 AOF 寫磁盤拖慢 Redis 的性能。

如果確實需要開啟 AOF,那么我建議你配置為 appendfsync everysec,把數(shù)據(jù)持久化的刷盤操作,放到后臺線程中去執(zhí)行,盡量降低 Redis 寫磁盤對性能的影響。

12) 使用物理機部署 Redis

Redis 在做數(shù)據(jù)持久化時,采用創(chuàng)建子進程的方式進行。

而創(chuàng)建子進程會調用操作系統(tǒng)的 fork 系統(tǒng)調用,這個系統(tǒng)調用的執(zhí)行耗時,與系統(tǒng)環(huán)境有關。

虛擬機環(huán)境執(zhí)行 fork 的耗時,要比物理機慢得多,所以你的 Redis 應該盡可能部署在物理機上。

13) 關閉操作系統(tǒng)內存大頁機制

Linux 操作系統(tǒng)提供了內存大頁機制,其特點在于,每次應用程序向操作系統(tǒng)申請內存時,申請單位由之前的 4KB 變?yōu)榱?2MB。

這會導致什么問題呢?

當 Redis 在做數(shù)據(jù)持久化時,會先 fork 一個子進程,此時主進程和子進程共享相同的內存地址空間。

當主進程需要修改現(xiàn)有數(shù)據(jù)時,會采用寫時復制(Copy On Write)的方式進行操作,在這個過程中,需要重新申請內存。

如果申請內存單位變?yōu)榱?2MB,那么勢必會增加內存申請的耗時,如果此時主進程有大量寫操作,需要修改原有的數(shù)據(jù),那么在此期間,操作延遲就會變大。

110c5336-7f1d-11ed-8abf-dac502259ad0.jpg

所以,為了避免出現(xiàn)這種問題,你需要在操作系統(tǒng)上關閉內存大頁機制。

好了,以上這些就是 Redis 「高性能」方面的實踐優(yōu)化。如果你非常關心 Redis 的性能問題,可以結合這些方面針對性優(yōu)化。

我們再來看 Redis 「可靠性」如何保證。

如何保證 Redis 的可靠性?

這里我想提醒你的是,保證 Redis 可靠性其實并不難,但難的是如何做到「持續(xù)穩(wěn)定」。

下面我會從「資源隔離」、「多副本」、「故障恢復」這三大維度,帶你分析保障 Redis 可靠性的最佳實踐。

1) 按業(yè)務線部署實例

提升可靠性的第一步,就是「資源隔離」。

你最好按不同的業(yè)務線來部署 Redis 實例,這樣當其中一個實例發(fā)生故障時,不會影響到其它業(yè)務。

這種資源隔離的方案,實施成本是最低的,但成效卻是非常大的。

2) 部署主從集群

如果你只使用單機版 Redis,那么就會存在機器宕機服務不可用的風險。

所以,你需要部署「多副本」實例,即主從集群,這樣當主庫宕機后,依舊有從庫可以使用,避免了數(shù)據(jù)丟失的風險,也降低了服務不可用的時間。

在部署主從集群時,你還需要注意,主從庫需要分布在不同機器上,避免交叉部署。

這么做的原因在于,通常情況下,Redis 的主庫會承擔所有的讀寫流量,所以我們一定要優(yōu)先保證主庫的穩(wěn)定性,即使從庫機器異常,也不要對主庫造成影響。

而且,有時我們需要對 Redis 做日常維護,例如數(shù)據(jù)定時備份等操作,這時你就可以只在從庫上進行,這只會消耗從庫機器的資源,也避免了對主庫的影響。

3) 合理配置主從復制參數(shù)

在部署主從集群時,如果參數(shù)配置不合理,也有可能導致主從復制發(fā)生問題:

  • 主從復制中斷
  • 從庫發(fā)起全量復制,主庫性能受到影響

在這方面我給你的建議有以下 2 點:

  1. 設置合理的 repl-backlog 參數(shù):過小的 repl-backlog 在寫流量比較大的場景下,主從復制中斷會引發(fā)全量復制數(shù)據(jù)的風險
  2. 設置合理的 slave client-output-buffer-limit:當從庫復制發(fā)生問題時,過小的 buffer 會導致從庫緩沖區(qū)溢出,從而導致復制中斷

4) 部署哨兵集群,實現(xiàn)故障自動切換

只部署了主從節(jié)點,但故障發(fā)生時是無法自動切換的,所以,你還需要部署哨兵集群,實現(xiàn)故障的「自動切換」。

而且,多個哨兵節(jié)點需要分布在不同機器上,實例為奇數(shù)個,防止哨兵選舉失敗,影響切換時間。

以上這些就是保障 Redis「高可靠」實踐優(yōu)化,你應該也發(fā)現(xiàn)了,這些都是部署和運維層的優(yōu)化。

除此之外,你可能還會對 Redis 做一些「日常運維」工作,這時你要注意哪些問題呢?

日常運維 Redis 需要注意什么?

如果你是 DBA 運維人員,在平時運維 Redis 時,也需要注意以下 6 個方面。****

1) 禁止使用 KEYS/FLUSHALL/FLUSHDB 命令

執(zhí)行這些命令,會長時間阻塞 Redis 主線程,危害極大,所以你必須禁止使用它。

如果確實想使用這些命令,我給你的建議是:

  • SCAN 替換 KEYS
  • 4.0+版本可使用 FLUSHALL/FLUSHDB ASYNC,清空數(shù)據(jù)的操作放在后臺線程執(zhí)行

2) 掃描線上實例時,設置休眠時間

不管你是使用 SCAN 掃描線上實例,還是對實例做 bigkey 統(tǒng)計分析,我建議你在掃描時一定記得設置休眠時間。

防止在掃描過程中,實例 OPS 過高對 Redis 產(chǎn)生性能抖動。

3) 慎用 MONITOR 命令

有時在排查 Redis 問題時,你會使用 MONITOR 查看 Redis 正在執(zhí)行的命令。

但如果你的 Redis OPS 比較高,那么在執(zhí)行 MONITOR 會導致 Redis 輸出緩沖區(qū)的內存持續(xù)增長,這會嚴重消耗 Redis 的內存資源,甚至會導致實例內存超過 maxmemory,引發(fā)數(shù)據(jù)淘汰,這種情況你需要格外注意。

111bbc7c-7f1d-11ed-8abf-dac502259ad0.jpg

所以你在執(zhí)行 MONITOR 命令時,一定要謹慎,盡量少用。

4) 從庫必須設置為 slave-read-only

你的從庫必須設置為 slave-read-only 狀態(tài),避免從庫寫入數(shù)據(jù),導致主從數(shù)據(jù)不一致。

除此之外,從庫如果是非 read-only 狀態(tài),如果你使用的是 4.0 以下的 Redis,它存在這樣的 Bug:

從庫寫入了有過期時間的數(shù)據(jù),不會做定時清理和釋放內存。

這會造成從庫的內存泄露!這個問題直到 4.0 版本才修復,你在配置從庫時需要格外注意。

5) 合理配置 timeout 和 tcp-keepalive 參數(shù)

如果因為網(wǎng)絡原因,導致你的大量客戶端連接與 Redis 意外中斷,恰好你的 Redis 配置的 maxclients 參數(shù)比較小,此時有可能導致客戶端無法與服務端建立新的連接(服務端認為超過了 maxclients)。

造成這個問題原因在于,客戶端與服務端每建立一個連接,Redis 都會給這個客戶端分配了一個 client fd。

當客戶端與服務端網(wǎng)絡發(fā)生問題時,服務端并不會立即釋放這個 client fd。

什么時候釋放呢?

Redis 內部有一個定時任務,會定時檢測所有 client 的空閑時間是否超過配置的 timeout 值。

如果 Redis 沒有開啟 tcp-keepalive 的話,服務端直到配置的 timeout 時間后,才會清理釋放這個 client fd。

在沒有清理之前,如果還有大量新連接進來,就有可能導致 Redis 服務端內部持有的 client fd 超過了 maxclients,這時新連接就會被拒絕。

針對這種情況,我給你的優(yōu)化建議是:

  1. 不要配置過高的 timeout:讓服務端盡快把無效的 client fd 清理掉
  2. Redis 開啟 tcp-keepalive:這樣服務端會定時給客戶端發(fā)送 TCP 心跳包,檢測連接連通性,當網(wǎng)絡異常時,可以盡快清理僵尸 client fd

6) 調整 maxmemory 時,注意主從庫的調整順序

Redis 5.0 以下版本存在這樣一個問題:從庫內存如果超過了 maxmemory,也會觸發(fā)數(shù)據(jù)淘汰。

在某些場景下,從庫是可能優(yōu)先主庫達到 maxmemory 的(例如在從庫執(zhí)行 MONITOR 命令,輸出緩沖區(qū)占用大量內存),那么此時從庫開始淘汰數(shù)據(jù),主從庫就會產(chǎn)生不一致。

要想避免此問題,在調整 maxmemory 時,一定要注意主從庫的修改順序:

  • 調大 maxmemory:先修改從庫,再修改主庫
  • 調小 maxmemory:先修改主庫,再修改從庫

直到 Redis 5.0,Redis 才增加了一個配置 replica-ignore-maxmemory,默認從庫超過 maxmemory 不會淘汰數(shù)據(jù),才解決了此問題。

好了,以上這些就是「日常運維」Redis 需要注意的,你可以對各個配置項查漏補缺,看有哪些是需要優(yōu)化的。

接下來,我們來看一下,保障 Redis「安全」都需要注意哪些問題。

Redis 安全如何保證?

無論如何,在互聯(lián)網(wǎng)時代,安全問題一定是我們需要隨時警戒的。

你可能聽說過 Redis 被注入可執(zhí)行腳本,然后拿到機器 root 權限的安全問題,都是因為在部署 Redis 時,沒有把安全風險注意起來。

針對這方面,我給你的建議是:

  1. 不要把 Redis 部署在公網(wǎng)可訪問的服務器上
  2. 部署時不使用默認端口 6379
  3. 以普通用戶啟動 Redis 進程,禁止 root 用戶啟動
  4. 限制 Redis 配置文件的目錄訪問權限
  5. 推薦開啟密碼認證
  6. 禁用/重命名危險命令(KEYS/FLUSHALL/FLUSHDB/CONFIG/EVAL)

只要你把這些做到位,基本上就可以保證 Redis 的安全風險在可控范圍內。

至此,我們分析了 Redis 在內存、性能、可靠性、日常運維方面的最佳實踐優(yōu)化。

除了以上這些,你還需要做到提前「預防」。

如何預防 Redis 問題?

要想提前預防 Redis 問題,你需要做好以下兩個方面:

  1. 合理的資源規(guī)劃
  2. 完善的監(jiān)控預警

先來說資源規(guī)劃。

在部署 Redis 時,如果你可以提前做好資源規(guī)劃,可以避免很多因為資源不足產(chǎn)生的問題。這方面我給你的建議有以下 3 點:

  1. 保證機器有足夠的 CPU、內存、帶寬、磁盤資源
  2. 提前做好容量規(guī)劃,主庫機器預留一半內存資源,防止主從機器網(wǎng)絡故障,引發(fā)大面積全量同步,導致主庫機器內存不足的問題
  3. 單個實例內存建議控制在 10G 以下,大實例在主從全量同步、RDB 備份時有阻塞風險

再來看監(jiān)控如何做。

監(jiān)控預警是提高穩(wěn)定性的重要環(huán)節(jié),完善的監(jiān)控預警,可以把問題提前暴露出來,這樣我們才可以快速反應,把問題最小化。

這方面我給你的建議是:

  1. 做好機器 CPU、內存、帶寬、磁盤監(jiān)控,資源不足時及時報警,任意資源不足都會影響 Redis 性能
  2. 設置合理的 slowlog 閾值,并對其進行監(jiān)控,slowlog 過多及時報警
  3. 監(jiān)控組件采集 Redis INFO 信息時,采用長連接,避免頻繁的短連接
  4. 做好實例運行時監(jiān)控,重點關注 expired_keys、evicted_keys、latest_fork_usec 指標,這些指標短時突增可能會有阻塞風險

總結

好了,總結一下,這篇文章我?guī)闳娣治隽?Redis 最佳實踐的優(yōu)化路徑,其中包括內存資源、高性能、高可靠、日常運維、資源規(guī)劃、監(jiān)控、安全 7 個維度。

這里我畫成了思維導圖,方便你在實踐時做參考。

112b1870-7f1d-11ed-8abf-dac502259ad0.png

我還把這些實踐優(yōu)化,按照「業(yè)務開發(fā)」和「運維」兩個維度,進一步做了劃分。

并且以「強制」、「推薦」、「參考」3 個級別做了標注,這樣你在實踐優(yōu)化時,就會更明確哪些該做,哪些需要結合實際的業(yè)務場景進一步分析。

這些級別的實施規(guī)則如下:

  • 強制:需嚴格遵守,否則危害極大
  • 推薦:推薦遵守,可提升性能、降低內存、便于運維
  • 參考:根據(jù)業(yè)務特點參考實施

如果你是業(yè)務開發(fā)人員,你需要了解 Redis 的運行機制,例如各個命令的執(zhí)行時間復雜度、數(shù)據(jù)過期策略、數(shù)據(jù)淘汰策略等,使用合理的命令,并結合業(yè)務場景進行優(yōu)化。

113f8b7a-7f1d-11ed-8abf-dac502259ad0.png

如果你是 DBA 運維人員,你需要在資源規(guī)劃、運維、監(jiān)控、安全層面做到位,做到未雨綢繆。

115422c4-7f1d-11ed-8abf-dac502259ad0.png

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 磁盤
    +關注

    關注

    1

    文章

    388

    瀏覽量

    25624
  • 數(shù)據(jù)結構

    關注

    3

    文章

    573

    瀏覽量

    40579
  • Redis
    +關注

    關注

    0

    文章

    384

    瀏覽量

    11302

原文標題:Redis中一個你絕對沒用過,但是特別好用性能炸裂的數(shù)據(jù)結構,分享!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Redis 再次開源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?290次閱讀

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個redis節(jié)點不超過10G內存)。
    的頭像 發(fā)表于 03-31 10:46 ?495次閱讀
    <b class='flag-5'>redis</b>三種集群方案詳解

    Redis實戰(zhàn)筆記

    在目前的技術選型中,Redis 儼然已經(jīng)成為了系統(tǒng)高性能緩存方案的事實標準,因此現(xiàn)在?Redis 也成為了后端開發(fā)的基本技能樹之一。 ? 基于上述情況,今天給大家分享一份?杰哥?親筆撰寫的內部
    的頭像 發(fā)表于 02-09 09:12 ?294次閱讀
    <b class='flag-5'>Redis</b>實戰(zhàn)筆記

    華為云 Flexus X 加速 Redis 案例實踐與詳解

    Redis 加速鏡像,更是為開發(fā)者提供了極大的便利。本文將詳細介紹如何利用華為云 Flexus X 實例自帶的 Redis 鏡像,快速部署并配置 Redis,以及通過實際案例展示其便捷性和高效性。 一、華為云 Flexus
    的頭像 發(fā)表于 01-23 17:52 ?251次閱讀
    華為云 Flexus X 加速 <b class='flag-5'>Redis</b> 案例實踐與詳解

    Redis Cluster之故障轉移

    1. Redis Cluster 簡介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實現(xiàn) Redis
    的頭像 發(fā)表于 01-20 09:21 ?725次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉移

    云服務器 Flexus X 實例,Docker 集成搭建 Redis 集群

    Redis 集群是一種分布式的 Redis 解決方案,能夠在多個節(jié)點之間分片存儲數(shù)據(jù),實現(xiàn)水平擴展和高可用性。與傳統(tǒng)的主從架構不同,Redis 集群支持數(shù)據(jù)自動分片、主節(jié)點故障自動切換,并可以在多臺
    的頭像 發(fā)表于 01-13 13:37 ?296次閱讀
    云服務器 Flexus X 實例,Docker 集成搭建 <b class='flag-5'>Redis</b> 集群

    華為云Flexus X實例,Redis性能加速評測及對比

    隨著云計算技術的飛速發(fā)展,Redis 作為一種高性能的內存數(shù)據(jù)庫,在各種應用場景中發(fā)揮著越來越重要的作用。為了滿足不同用戶對 Redis 性能的高要求,華為云推出了 Flexus X 實例,并提供了
    的頭像 發(fā)表于 12-29 15:47 ?409次閱讀
    華為云Flexus X實例,<b class='flag-5'>Redis</b>性能加速評測及對比

    華為云 Flexus X 輕松實現(xiàn) Redis 一主多從高效部署

    ,F(xiàn)lexus?X 預裝 Redis 加速鏡像,簡化了 Redis 的安裝和配置流程,降低了技術門檻,使開發(fā)者能夠專注于業(yè)務邏輯的實現(xiàn)。 ????????本文將詳細介紹如何在華為云 Flexus?X 上
    的頭像 發(fā)表于 12-27 13:45 ?420次閱讀
    華為云 Flexus X 輕松實現(xiàn) <b class='flag-5'>Redis</b> 一主多從高效部署

    Redis使用重要的兩個機制:Reids持久化和主從復制

    今天這篇文章,我們一起了解 Redis 使用中非常重要的兩個機制:Reids 持久化和主從復制。 我們都知道Redis是一個內存數(shù)據(jù)庫,在學習主從同步之前,我們首先要想到 Redis
    的頭像 發(fā)表于 12-18 10:33 ?334次閱讀
    <b class='flag-5'>Redis</b>使用重要的兩個機制:Reids持久化和主從復制

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內存數(shù)據(jù)存儲系統(tǒng),它們主要用于提高應用程序的性能,通過減少對數(shù)據(jù)庫的直接訪問來加速數(shù)據(jù)檢索。以下是對Redis和Memcached的比較,涵蓋了它們的一些
    的頭像 發(fā)表于 12-18 09:33 ?473次閱讀

    虛擬內存的作用和原理 如何調整虛擬內存設置

    能,允許更多的程序同時運行,以及防止內存溢出。 虛擬內存的作用 擴展物理內存 :當物理內存不足以容納當前運行的所有程序時,虛擬內存允許系統(tǒng)將
    的頭像 發(fā)表于 12-04 09:13 ?1893次閱讀

    恒訊科技分析:云數(shù)據(jù)庫rds和redis區(qū)別是什么如何選擇?

    結構化數(shù)據(jù),使用SQL作為查詢語言,支持ACID事務和多種復雜查詢操作。而Redis是一個基于內存的非關系型數(shù)據(jù)庫,采用鍵值對模型存儲數(shù)據(jù),支持豐富的數(shù)據(jù)結構如字符串、列表、集合、哈希表等。 2、性能:Redis以其超快的速度而
    的頭像 發(fā)表于 08-19 15:31 ?704次閱讀

    如何使用httpclient.c中的ESP8266和http_post將文件上傳到服務器?

    我想使用 httpclient.c 中的ESP8266和http_post將文件上傳到服務器。 為了節(jié)省內存,文件(約 200KB)將存儲在 SPI 閃存中。您能告訴我如何在不將文件復制到 RAM 等的情況下發(fā)送文件嗎?
    發(fā)表于 07-12 09:47

    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

    前言 Redis 是在開發(fā)過程中經(jīng)常用到的緩存中間件,為了考慮在生產(chǎn)環(huán)境中穩(wěn)定性和高可用,Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略時,常規(guī)部署在虛擬機上的方式配置繁瑣
    的頭像 發(fā)表于 07-03 15:30 ?1099次閱讀
    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 <b class='flag-5'>Redis</b> 集群

    esp32c2同時開啟wifi藍牙內存ram會有點不夠用,如何能夠多節(jié)省點ram空間出來嗎?

    如題 esp32c2 同時開啟wifi藍牙 內存ram會有點不夠用,有大佬知道如何能夠多節(jié)省點ram空間出來嗎
    發(fā)表于 06-05 06:48