色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

redis工作原理

數據分析與開發 ? 來源:數據分析與開發 ? 作者:數據分析與開發 ? 2020-09-24 15:57 ? 次閱讀

Redis作為內存數據庫,擁有非常高的性能,單個實例的QPS能夠達到10W左右。但我們在使用Redis時,經常時不時會出現訪問延遲很大的情況,如果你不知道Redis的內部實現原理,在排查問題時就會一頭霧水。

很多時候,Redis出現訪問延遲變大,都與我們的使用不當或運維不合理導致的。

這篇文章我們就來分析一下Redis在使用過程中,經常會遇到的延遲問題以及如何定位和分析。

使用復雜度高的命令

如果在使用Redis時,發現訪問延遲突然增大,如何進行排查?

首先,第一步,建議你去查看一下Redis的慢日志。Redis提供了慢日志命令的統計功能,我們通過以下設置,就可以查看有哪些命令在執行時延遲比較大。

首先設置Redis的慢日志閾值,只有超過閾值的命令才會被記錄,這里的單位是微秒,例如設置慢日志的閾值為5毫秒,同時設置只保留最近1000條慢日志記錄:

# 命令執行超過5毫秒記錄慢日志 CONFIG SET slowlog-log-slower-than 5000 # 只保留最近1000條慢日志 CONFIGSETslowlog-max-len1000

設置完成之后,所有執行的命令如果延遲大于5毫秒,都會被Redis記錄下來,我們執行SLOWLOG get 5

查詢最近5條慢日志

127.0.0.1:6379> SLOWLOG get5 1)1)(integer)32693# 慢日志ID 2)(integer)1593763337# 執行時間 3)(integer)5299# 執行耗時(微秒) 4)1)"LRANGE"# 具體執行的命令和參數 2)"user_list_2000" 3)"0" 4)"-1" 2)1)(integer)32692 2)(integer)1593763337 3)(integer)5044 4)1)"GET" 2)"book_price_1000" ...

通過查看慢日志記錄,我們就可以知道在什么時間執行哪些命令比較耗時,如果你的業務經常使用O(n)

以上復雜度的命令,例如sort、sunion、zunionstore
,或者在執行O(n)命令時操作的數據量比較大,這些情況下Redis處理數據時就會很耗時。

如果你的服務請求量并不大,但Redis實例的CPU使用率很高,很有可能是使用了復雜度高的命令導致的。

解決方案就是, 不使用這些復雜度較高的命令,并且一次不要獲取太多的數據,每次盡量操作少量的數據,讓Redis可以及時處理返回

存儲大key

如果查詢慢日志發現,并不是復雜度較高的命令導致的,例如都是SET、DELETE操作出現在慢日志記錄中,那么你就要懷疑是否存在Redis寫入了大key的情況。

Redis在寫入數據時,需要為新的數據分配內存,當從Redis中刪除數據時,它會釋放對應的內存空間。

如果一個key寫入的數據非常大,Redis在分配內存時也會比較耗時
同樣的,當刪除這個key的數據時,釋放內存也會耗時比較久
你需要檢查你的業務代碼,是否存在寫入大key的情況,需要評估寫入數據量的大小,業務層應該避免一個key存入過大的數據量

那么有沒有什么辦法可以掃描現在Redis中是否存在大key的數據嗎?

Redis也提供了掃描大key的方法:

redis-cli -h $host -p $port --bigkeys -i 0.01

使用上面的命令就可以掃描出整個實例key大小的分布情況,它是以類型維度來展示的。

需要注意的是當我們在線上實例進行大key掃描時,Redis的QPS會突增,為了降低掃描過程中對Redis的影響,我們需要控制掃描的頻率,使用-i參數控制即可,它表示掃描過程中每次掃描的時間間隔,單位是秒。

使用這個命令的原理,其實就是Redis在內部執行scan命令,遍歷所有key,然后針對不同類型的key執行strlen、llen、hlen、scard、zcard來獲取字符串的長度以及容器類型(list/dict/set/zset)的元素個數。

而對于容器類型的key,只能掃描出元素最多的key,但元素最多的key不一定占用內存最多,這一點需要我們注意下。不過使用這個命令一般我們是可以對整個實例中key的分布情況有比較清晰的了解。

針對大key的問題,Redis官方在4.0版本推出了lazy-free的機制,用于異步釋放大key的內存,降低對Redis性能的影響。即使這樣,我們也不建議使用大key,大key在集群的遷移過程中,也會影響到遷移的性能,這個后面在介紹集群相關的文章時,會再詳細介紹到。

集中過期

有時你會發現,平時在使用Redis時沒有延時比較大的情況,但在某個時間點突然出現一波延時,而且報慢的時間點很有規律,例如某個整點,或者間隔多久就會發生一次。

如果出現這種情況,就需要考慮是否存在大量key集中過期的情況。

如果有大量的key在某個固定時間點集中過期,在這個時間點訪問Redis時,就有可能導致延遲增加。

Redis的過期策略采用主動過期+懶惰過期
兩種策略:

? 主動過期:Redis內部維護一個定時任務,默認每隔100毫秒會從過期字典中隨機取出20個key,刪除過期的key,如果過期key的比例超過了25%,則繼續獲取20個key,刪除過期的key,循環往復,直到過期key的比例下降到25%或者這次任務的執行耗時超過了25毫秒,才會退出循環

? 懶惰過期:只有當訪問某個key時,才判斷這個key是否已過期,如果已經過期,則從實例中刪除

注意,Redis的主動過期的定時任務,也是在Redis主線程中執行的
,也就是說如果在執行主動過期的過程中,出現了需要大量刪除過期key的情況,那么在業務訪問時,必須等這個過期任務執行結束,才可以處理業務請求。此時就會出現,業務訪問延時增大的問題,最大延遲為25毫秒。

而且這個訪問延遲的情況,不會記錄在慢日志里。慢日志中只記錄真正執行某個命令的耗時,Redis主動過期策略執行在操作命令之前,如果操作命令耗時達不到慢日志閾值,它是不會計算在慢日志統計中的,但我們的業務卻感到了延遲增大。

此時你需要檢查你的業務,是否真的存在集中過期的代碼,一般集中過期使用的命令是expireat或pexpireat命令,在代碼中搜索這個關鍵字就可以了。

如果你的業務確實需要集中過期掉某些key,又不想導致Redis發生抖動,有什么優化方案?

解決方案是,在集中過期時增加一個隨機時間,把這些需要過期的key的時間打散即可。

偽代碼可以這么寫:

# 在過期時間點之后的5分鐘內隨機過期掉 redis.expireat(key, expire_time + random(300))

這樣Redis在處理過期時,不會因為集中刪除key導致壓力過大,阻塞主線程。

另外,除了業務使用需要注意此問題之外,還可以通過運維手段來及時發現這種情況。

做法是我們需要把Redis的各項運行數據監控起來,執行info可以拿到所有的運行數據,在這里我們需要重點關注expired_keys這一項,它代表整個實例到目前為止,累計刪除過期key的數量。

我們需要對這個指標監控,當在很短時間內這個指標出現突增時,需要及時報警出來,然后與業務報慢的時間點對比分析,確認時間是否一致,如果一致,則可以認為確實是因為這個原因導致的延遲增大。

實例內存達到上限

有時我們把Redis當做純緩存使用,就會給實例設置一個內存上限maxmemory,然后開啟LRU淘汰策略。

當實例的內存達到了maxmemory后,你會發現之后的每次寫入新的數據,有可能變慢了。

導致變慢的原因是,當Redis內存達到maxmemory后,每次寫入新的數據之前,必須先踢出一部分數據,讓內存維持在maxmemory之下。

這個踢出舊數據的邏輯也是需要消耗時間的,而具體耗時的長短,要取決于配置的淘汰策略:


? allkeys-lru:不管key是否設置了過期,淘汰最近最少訪問的key

? volatile-lru:只淘汰最近最少訪問并設置過期的key

? allkeys-random:不管key是否設置了過期,隨機淘汰

? volatile-random:只隨機淘汰有設置過期的key

? allkeys-ttl:不管key是否設置了過期,淘汰即將過期的key

? noeviction:不淘汰任何key,滿容后再寫入直接報錯

? allkeys-lfu:不管key是否設置了過期,淘汰訪問頻率最低的key(4.0+支持)

? volatile-lfu:只淘汰訪問頻率最低的過期key(4.0+支持)

備注:allkeys-xxx表示從所有的鍵值中淘汰數據,而volatile-xxx表示從設置了過期鍵的鍵值中淘汰數據。

具體使用哪種策略,需要根據業務場景來決定。

我們最常使用的一般是allkeys-lru或volatile-lru策略,它們的處理邏輯是,每次從實例中隨機取出一批key(可配置),然后淘汰一個最少訪問的key,之后把剩下的key暫存到一個池子中,繼續隨機取出一批key,并與之前池子中的key比較,再淘汰一個最少訪問的key。以此循環,直到內存降到maxmemory之下。

如果使用的是allkeys-random或volatile-random策略,那么就會快很多,因為是隨機淘汰,那么就少了比較key訪問頻率時間的消耗了,隨機拿出一批key后直接淘汰即可,因此這個策略要比上面的LRU策略執行快一些。

但以上這些邏輯都是在訪問Redis時,真正命令執行之前執行的,也就是它會影響我們訪問Redis時執行的命令。

另外,如果此時Redis實例中有存儲大key,那么在淘汰大key釋放內存時,這個耗時會更加久,延遲更大,這需要我們格外注意。

如果你的業務訪問量非常大,并且必須設置maxmemory限制實例的內存上限,同時面臨淘汰key導致延遲增大的的情況,要想緩解這種情況,除了上面說的避免存儲大key、使用隨機淘汰策略之外,也可以考慮拆分實例的方法來緩解,拆分實例可以把一個實例淘汰key的壓力分攤到多個實例上,可以在一定程度降低延遲。

fork耗時嚴重

如果你的Redis開啟了自動生成RDB和AOF重寫功能,那么有可能在后臺生成RDB和AOF重寫時導致Redis的訪問延遲增大,而等這些任務執行完畢后,延遲情況消失。

遇到這種情況,一般就是執行生成RDB和AOF重寫任務導致的。

生成RDB和AOF都需要父進程fork出一個子進程進行數據的持久化,在fork執行過程中,父進程需要拷貝內存頁表給子進程,如果整個實例內存占用很大,那么需要拷貝的內存頁表會比較耗時,此過程會消耗大量的CPU資源,在完成fork之前,整個實例會被阻塞住,無法處理任何請求,如果此時CPU資源緊張,那么fork的時間會更長,甚至達到秒級。這會嚴重影響Redis的性能。

我們可以執行info命令,查看最后一次fork執行的耗時latest_fork_usec,單位微秒。這個時間就是整個實例阻塞無法處理請求的時間。

除了因為備份的原因生成RDB之外,在主從節點第一次建立數據同步時,主節點也會生成RDB文件給從節點進行一次全量同步,這時也會對Redis產生性能影響。

要想避免這種情況,我們需要規劃好數據備份的周期,建議在從節點上執行備份,而且最好放在低峰期執行。如果對于丟失數據不敏感的業務,那么不建議開啟AOF和AOF重寫功能。

另外,fork的耗時也與系統有關,如果把Redis部署在虛擬機上,那么這個時間也會增大。所以使用Redis時建議部署在物理機上,降低fork的影響。

綁定CPU

很多時候,我們在部署服務時,為了提高性能,降低程序在使用多個CPU時上下文切換的性能損耗,一般會采用進程綁定CPU的操作。

但在使用Redis時,我們不建議這么干,原因如下:

綁定CPU的Redis,在進行數據持久化時,fork出的子進程,子進程會繼承父進程的CPU使用偏好,而此時子進程會消耗大量的CPU資源進行數據持久化,子進程會與主進程發生CPU爭搶,這也會導致主進程的CPU資源不足訪問延遲增大。

所以在部署Redis進程時,如果需要開啟RDB和AOF重寫機制,一定不能進行CPU綁定操作!

開啟AOF

上面提到了,當執行AOF文件重寫時會因為fork執行耗時導致Redis延遲增大 ,除了這個之外,如果開啟AOF機制,設置的策略不合理,也會導致性能問題。

開啟AOF后,Redis會把寫入的命令實時寫入到文件中,但 寫入文件的過程是先寫入內存,等內存中的數據超過一定閾值或達到一定時間后,內存中的內容才會被真正寫入到磁盤中。

AOF為了保證文件寫入磁盤的安全性,提供了3種刷盤機制:


?appendfsync always:每次寫入都刷盤,對性能影響最大,占用磁盤IO比較高,數據安全性最高

?appendfsync everysec:1秒刷一次盤,對性能影響相對較小,節點宕機時最多丟失1秒的數據

?appendfsync no:按照操作系統的機制刷盤,對性能影響最小,數據安全性低,節點宕機丟失數據取決于操作系統刷盤機制

當使用第一種機制appendfsync always時,Redis每處理一次寫命令,都會把這個命令寫入磁盤,而且這個操作是在主線程中執行的。

內存中的的數據寫入磁盤,這個會加重磁盤的IO負擔,操作磁盤成本要比操作內存的代價大得多。如果寫入量很大,那么每次更新都會寫入磁盤,此時機器的磁盤IO就會非常高,拖慢Redis的性能,因此我們不建議使用這種機制。

與第一種機制對比,appendfsync everysec會每隔1秒刷盤,而appendfsync no取決于操作系統的刷盤時間,安全性不高。因此我們推薦使用appendfsync everysec這種方式,在最壞的情況下,只會丟失1秒的數據,但它能保持較好的訪問性能。

當然,對于有些業務場景,對丟失數據并不敏感,也可以不開啟AOF。

使用Swap

如果你發現Redis突然變得非常慢,每次訪問的耗時都達到了幾百毫秒甚至秒級,那此時就檢查Redis是否使用到了Swap,這種情況下Redis基本上已經無法提供高性能的服務。

我們知道,操作系統提供了Swap機制,目的是為了當內存不足時,可以把一部分內存中的數據換到磁盤上,以達到對內存使用的緩沖。

但當內存中的數據被換到磁盤上后,訪問這些數據就需要從磁盤中讀取,這個速度要比內存慢太多!

尤其是針對Redis這種高性能的內存數據庫來說,如果Redis中的內存被換到磁盤上,對于Redis這種性能極其敏感的數據庫,這個操作時間是無法接受的。

我們需要檢查機器的內存使用情況,確認是否確實是因為內存不足導致使用到了Swap。

如果確實使用到了Swap,要及時整理內存空間,釋放出足夠的內存供Redis使用,然后釋放Redis的Swap,讓Redis重新使用內存。

釋放Redis的Swap過程通常要重啟實例,為了避免重啟實例對業務的影響,一般先進行主從切換,然后釋放舊主節點的Swap,重新啟動服務,待數據同步完成后,再切換回主節點即可。

可見,當Redis使用到Swap后,此時的Redis的高性能基本被廢掉,所以我們需要提前預防這種情況。

我們需要對Redis機器的內存和Swap使用情況進行監控,在內存不足和使用到Swap時及時報警出來,及時進行相應的處理。

網卡負載過高

如果以上產生性能問題的場景,你都規避掉了,而且Redis也穩定運行了很長時間,但在某個時間點之后開始,訪問Redis開始變慢了,而且一直持續到現在,這種情況是什么原因導致的?

之前我們就遇到這種問題,特點就是從某個時間點之后就開始變慢,并且一直持續。這時你需要檢查一下機器的網卡流量,是否存在網卡流量被跑滿的情況。

網卡負載過高,在網絡層和TCP層就會出現數據發送延遲、數據丟包等情況。Redis的高性能除了內存之外,就在于網絡IO,請求量突增會導致網卡負載變高。

如果出現這種情況,你需要排查這個機器上的哪個Redis實例的流量過大占滿了網絡帶寬,然后確認流量突增是否屬于業務正常情況,如果屬于那就需要及時擴容或遷移實例,避免這個機器的其他實例受到影響。

運維層面,我們需要對機器的各項指標增加監控,包括網絡流量,在達到閾值時提前報警,及時與業務確認并擴容。

總結

以上我們總結了Redis中常見的可能導致延遲增大甚至阻塞的場景,這其中既涉及到了業務的使用問題,也涉及到Redis的運維問題。

可見,要想保證Redis高性能的運行,其中涉及到CPU、內存、網絡,甚至磁盤的方方面面,其中還包括操作系統的相關特性的使用。

作為開發人員,我們需要了解Redis的運行機制,例如各個命令的執行時間復雜度、數據過期策略、數據淘汰策略等,使用合理的命令,并結合業務場景進行優化。

作為DBA運維人員,需要了解數據持久化、操作系統fork原理、Swap機制等,并對Redis的容量進行合理規劃,預留足夠的機器資源,對機器做好完善的監控,才能保證Redis的穩定運行。

責任編輯:xj

原文標題:天啊,為什么我的 Redis 如此的慢?

文章出處:【微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

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

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • Redis
    +關注

    關注

    0

    文章

    374

    瀏覽量

    10871

原文標題:天啊,為什么我的 Redis 如此的慢?

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Redis緩存與Memcached的比較

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

    母線工作原理

    電子發燒友網站提供《母線工作原理.pdf》資料免費下載
    發表于 10-26 11:08 ?0次下載
    母線<b class='flag-5'>工作原理</b>

    輔助電源的工作原理

     輔助電源的工作原理主要涉及在主電源發生故障或不穩定時,自動切換到備用電源,以保證設備的持續供電。以下是關于輔助電源工作原理的詳細解釋:
    的頭像 發表于 10-21 14:56 ?370次閱讀

    鋅銀電池的工作原理

    鋅銀電池的工作原理主要基于鋅和銀兩種金屬之間的氧化還原反應。以下是鋅銀電池工作原理的詳細解釋:
    的頭像 發表于 10-03 14:59 ?1208次閱讀

    串行接口的工作原理和結構

    串行接口(Serial Interface)的工作原理和結構是理解其在計算機與外部設備之間數據傳輸方式的重要基礎。以下將詳細闡述串行接口的工作原理及其典型結構。
    的頭像 發表于 08-25 17:01 ?1665次閱讀

    VCO的工作原理是什么

    VCO(Voltage-Controlled Oscillator,電壓控制振蕩器)的工作原理是基于電子器件的非線性特性,通過改變輸入電壓來調整輸出信號的頻率。以下是對VCO工作原理的詳細闡述,包括其電路結構、工作機制、性能參數
    的頭像 發表于 08-20 17:16 ?1709次閱讀

    Redis 開源協議調整,我們怎么辦?

    2 024 年 3 月 20 日, Redis 官方宣布,從 Redis 7.4 版本開始,Redis 將獲得源可用許可證 ( RSALv2 ) 和服務器端公共許可證 ( SSPLv1 ) 的雙重
    的頭像 發表于 05-09 22:59 ?429次閱讀
    <b class='flag-5'>Redis</b> 開源協議調整,我們怎么辦?

    霍爾開關的工作原理及應用

    霍爾開關的工作原理及應用
    的頭像 發表于 04-09 10:29 ?3119次閱讀
    霍爾開關的<b class='flag-5'>工作原理</b>及應用

    Redis開源版與Redis企業版,怎么選用?

    點擊“藍字”關注我們數以千計的企業和數以百萬計的開發人員Redis開源版來構建應用程序。但隨著用戶數量、數據量和地區性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業版
    的頭像 發表于 04-04 08:04 ?1047次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?

    GaussDB(for Redis) 特性揭秘:大 key 治理

    ? 從 DBA 的視角看,大 Key 無疑是引起 Redis 線上問題的常見原因。為了解決大 Key 隱患,業務首先要遵守合理的開發規范,減少大 Key 的產生和訪問依賴。但有時大 Key 是在程序
    的頭像 發表于 03-28 22:06 ?663次閱讀
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理

    新版 Redis 不再“開源”,對使用者都有哪些影響?

    2024 年 3 月 20 日,Redis Labs 宣布從 Redis 7.4 開始,將原先比較寬松的 BSD 源碼使用協議修改為 RSAv2和 SSPLv1協議。該變化意味著 Redis
    的頭像 發表于 03-27 22:30 ?488次閱讀
    新版 <b class='flag-5'>Redis</b> 不再“開源”,對使用者都有哪些影響?

    Redis官方搜索引擎來了,性能炸裂!

    RediSearch 是一個 Redis 模塊,為 Redis 提供查詢、二級索引和全文搜索功能。
    的頭像 發表于 02-21 10:01 ?2321次閱讀
    <b class='flag-5'>Redis</b>官方搜索引擎來了,性能炸裂!

    IGBT器件的結構和工作原理

    IGBT器件的結構和工作原理
    的頭像 發表于 02-21 09:41 ?1798次閱讀
    IGBT器件的結構和<b class='flag-5'>工作原理</b>

    ev電機的工作原理是什么

    作為電動汽車的核心部件,電動機(EV電機)的工作原理是實現車輛驅動力的轉換,將電能轉變為機械能。EV電機的工作原理主要包括電磁感應定理、電磁場、電流控制等方面。下面將從原理、結構和工作過程三個方面來
    的頭像 發表于 01-08 10:04 ?1508次閱讀

    linux下Redis常用命令使用

    redis重啟,緩存數據還在,redis清緩存數據
    的頭像 發表于 12-27 09:56 ?6511次閱讀
    linux下<b class='flag-5'>Redis</b>常用命令使用
    主站蜘蛛池模板: 北条麻妃夫の友人196| 欧美大片xxxxbbbb| 亚洲卫视论坛| 精品综合久久久久久8888| 亚洲精品在看在线观看| 黑色丝袜美女被网站| 亚洲精品电影久久久影院| 很黄很色60分钟在线观看| 亚洲精品视频在线播放| 久久AAAA片一区二区| 在线少女漫画| 麻美ゆま夫の目の前で犯 | 久久精品电影院| 1313久久国产午夜精品理论片| 老师那里好大又粗h男男| 4hu四虎免费影院www| 女人色极品影院| 办公室里呻吟的丰满老师电影| 日韩欧美1区| 国产精品无码亚洲网| 亚洲黄色免费在线观看| 九九99热久久999精品| 51xx午夜影视福利| 欧洲最强rapper潮水喷视频 | 99国产精品久久人妻无码| 欧洲兽交另类AVXXX| 国产精品久久久久久精品...| 亚洲精品无夜久久久久久久久| 久久精品国产清白在天天线 | 日韩亚洲不卡在线视频| 国产精品外围在线观看| 亚洲欧美精品无码大片在线观看| 久久有码中文字幕| www黄色com| 小SAO货水真多把你CAO烂| 久久高清内射无套| 99久久麻豆AV色婷婷综合| 少妇高潮A视频| 黄得让人湿的片段| 91视频3p| 四虎影视国产精品亚洲精品|