欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis內(nèi)存碎片處理實例詳解

 更新時間:2022年05月31日 08:57:49   作者:Java面試365  
內(nèi)存碎片是redis服務(wù)中分配器分配存儲對象內(nèi)存的時產(chǎn)生的,下面這篇文章主要給大家介紹了關(guān)于Redis內(nèi)存碎片處理的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

Redis內(nèi)存碎片處理

不知道我們在執(zhí)行刪除操作時有沒有注意過這樣一個現(xiàn)象,刪除一些bigkey后內(nèi)存分配器分配的容量并沒有減少,實際容量減少了,這是為什么呢?演示如下

模擬bigkey刪除

創(chuàng)建生成bigkey的腳本文件createdata.sh

#!/bin/bash
cd /opt/redis/redis-6.0.6/bin/

for i in {1..10000}
do
  echo "key${i} ${i}"
  redis-cli  hset obj  key${i} ${i}
done

賦執(zhí)行權(quán)限

[root@zzf993 redis-6.0.6]# chmod +x createdata.sh
### 執(zhí)行權(quán)限如果分不清可以賦予所有權(quán)限
[root@zzf993 redis-6.0.6]# chmod 777 createdata.sh

執(zhí)行createdata.sh腳本,等待執(zhí)行完畢

查看內(nèi)存容量

########## 執(zhí)行createdata.sh腳本前的內(nèi)存容量
127.0.0.1:6379> info memory
# Memory
used_memory:864192
used_memory_human:843.94K
used_memory_rss:4681728
used_memory_rss_human:4.46M

########## 執(zhí)行createdata.sh腳本后的內(nèi)存容量
# Memory
used_memory:1565384
used_memory_human:1.49M
used_memory_rss:5992448
used_memory_rss_human:5.71M

將key為obj的鍵值刪除后,查看內(nèi)存容量

127.0.0.1:6379> info memory
# Memory
used_memory:896416
used_memory_human:875.41K
used_memory_rss:5746688
used_memory_rss_human:5.48M

刪除bigkey后used_memory_rss波動很小,而used_memory波動很大,因為used_memory_rss是系統(tǒng)向redis分配的內(nèi)存空間,而used_memory是redis實際使用的內(nèi)存空間,上述實驗表明redis刪除鍵值后并沒有馬上的將內(nèi)存空間回收,所以即使刪除了一些bigkey的鍵值,redis占用的空間依然還是那么大,這些空間后續(xù)還會不會使用呢?這個需要分情況

  • 如果刪除的鍵值空間是連續(xù)的那么后續(xù)新增鍵值還是可以用來存儲數(shù)據(jù)。

  • 如果刪除的鍵值空間不連續(xù)那么這就有可能形成的內(nèi)存碎片。

那么這些內(nèi)存碎片能不能重復(fù)利用呢?我們可以接著往下面思考。

什么是內(nèi)存碎片

內(nèi)存碎片一句話描述就是有那么多內(nèi)存但是放不下那么多數(shù)據(jù),我們以高鐵買票為例解釋,張三、李四、王五去訂票這三個人想訂連在一起的三個座位,而最近一趟車有100個座位,已售97個,剩余三個座位并不相鄰,那么他們?nèi)齻€只能改換下一趟高鐵,因為座位不符合他們的預(yù)期,那么這趟車就有三個座位空閑,這就是座位碎片。

將碎片概念放到內(nèi)存中就是連續(xù)空閑的空間放不下那么多數(shù)據(jù),如下圖,需要向內(nèi)存中放入一個3字節(jié)的數(shù)據(jù),雖然內(nèi)存中存在3字節(jié)空閑的內(nèi)存,但空閑內(nèi)存不連續(xù)所以無法存放,這就是內(nèi)存碎片

內(nèi)存碎片如何產(chǎn)生

內(nèi)存分配器

在Redis中有多種內(nèi)存分配策略如libc、jemalloc、tcmalloc,默認(rèn)使用jemalloc,操作系統(tǒng)的內(nèi)存分配器根據(jù)這些分配策略分配內(nèi)存,但是內(nèi)存分配器無法做到按需分配,一般按照固定大小分配,以默認(rèn)分配策略jemalloc為例,一般按照2的整數(shù)次冪分配如2、4、8、16、32等等,如redis申請一個6字節(jié)的內(nèi)存,操作系統(tǒng)就會分配一個8字節(jié)的內(nèi)存給redis使用,那么多出來的2個字節(jié)空間,如果后續(xù)沒有其它操作,那么這2個字節(jié)就是內(nèi)存碎片。

那這樣分配是不是完全沒有優(yōu)勢呢?顯然不是,如redis第一次向操作系統(tǒng)申請了24字節(jié)的內(nèi)存,分配器給redis分配了32字節(jié)的空間,當(dāng)下次redis寫入需要8字節(jié)以內(nèi)的空間就不需要再次向操作系統(tǒng)申請了,現(xiàn)有的內(nèi)存空間完全可以滿足要求,所以這樣的分配方式可以減少向操作系統(tǒng)申請空間分配。

鍵值大小不同

因為內(nèi)存分配器不是按需分配,而不同的鍵值大小也就會給redis帶來不一樣的碎片,如鍵值key1占用內(nèi)存5個字節(jié),鍵值key2占用內(nèi)存7個字節(jié),向操作系統(tǒng)申請時都會給分配8個字節(jié),key1鍵值的碎片就是3個字節(jié),而key2鍵值的碎片就是1個字節(jié)。

鍵值的操作

鍵值的修改、刪除也會造成碎片如下所示

碎片信息如何查看

碎片信息redis提供了info memory命令給用戶監(jiān)控碎片情況

127.0.0.1:6379> info memory
# Memory
used_memory:917256
used_memory_human:895.76K
used_memory_rss:5488640
used_memory_rss_human:5.23M
.......
mem_fragmentation_ratio:6.26

內(nèi)存信息中mem_fragmentation_ratio指標(biāo)就是內(nèi)存的碎片率,碎片率計算如下

mem_fragmentation_ratio = used_memory_rss/used_memory

used_memory_rss:表示是由操作系統(tǒng)分配的內(nèi)存大小。

used_memory:表示Redis實例占用的內(nèi)存大小。

如redis向操作系統(tǒng)申請100字節(jié)的內(nèi)存這就是used_memory,操作系統(tǒng)為redis分配128字節(jié)的內(nèi)存這就是used_memory_rss,碎片率就是mem_fragmentation_ratio=1.28。

當(dāng)mem_fragmentation_ratio<=1.5時,因為操作系統(tǒng)的分配器緣故碎片率避免不了,而且鍵值的修改,刪除也會導(dǎo)致碎片率,所以這算是一個正常范疇。

當(dāng)mem_fragmentation_ratio>1.5時,相當(dāng)于碎片率超過了實際占用內(nèi)存的50%,這就造成了內(nèi)存的浪費,需要采取一些措施降低碎片率。

注意:如果線上數(shù)據(jù)顯示mem_fragmentation_ratio<1,證明碎片率低,是不是碎片率越低就越好呢?顯然不是,碎片率小于1說明used_memory_rss操作系統(tǒng)分配的內(nèi)存少了,也就是說Redis能使用的物理內(nèi)存不夠了,這就會觸發(fā)swap,將內(nèi)存的數(shù)據(jù)換到磁盤中,后續(xù)客戶端如果訪問了磁盤中的數(shù)據(jù)將產(chǎn)生延遲。

碎片率如何降低

當(dāng)Redis版本是4.0以下,那么我們只能通過重啟實例解決問題,但需要注意的是重啟會有部分?jǐn)?shù)據(jù)丟失,即使開啟了持久化。

當(dāng)Redis版本是4.0以上,我們可以通過配置activedefrag yes自動碎片清理來完成,簡單形容就是零換整的思想,將空閑內(nèi)存碎片合并到一起,形成一片連續(xù)的空間,如下所示

不過萬事都有兩面性,開啟自動碎片清理后,會阻塞主線程,所以需要注意清理參數(shù)控制,參數(shù)如下

  • active-defrag-ignore-bytes 100mb:碎片清理的最小碎片內(nèi)存,碎片內(nèi)存到達100mb后開始清理。

  • active-defrag-threshold-lower 10:表示內(nèi)存碎片空間占分配給redis總空間的10%開始清理和active-defrag-ignore-bytes必須同時滿足,有一個不滿足停止自動清理。

  • active-defrag-cycle-min 25:表示碎片清理占用CPU最少的比例,保證碎片清理可以正常運行。

  • active-defrag-cycle-max 75:表示碎片清理占用CPU最大的比例,不能讓碎片清理影響業(yè)務(wù)正常處理。

如果碎片清理期間阻塞了主線程的業(yè)務(wù)處理,一般需要將active-defrag-cycle-max占用CPU的最大比例調(diào)小。

總結(jié)

到此這篇關(guān)于Redis內(nèi)存碎片處理的文章就介紹到這了,更多相關(guān)Redis內(nèi)存碎片處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Redis對于過期鍵的三種清除策略

    淺談Redis對于過期鍵的三種清除策略

    本文主要介紹了Redis對于過期鍵的三種清除策略,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Windows下Redis安裝配置教程

    Windows下Redis安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Windows下Redis安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Redis如何正確關(guān)閉和開啟持久化

    Redis如何正確關(guān)閉和開啟持久化

    本文主要介紹了Redis如何正確關(guān)閉和開啟持久化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Redis的RDB持久化與AOF持久化詳解

    Redis的RDB持久化與AOF持久化詳解

    這篇文章主要介紹了Redis的RDB持久化與AOF持久化詳解,Redis是許多公司都在使用的一款高性能、非關(guān)系型數(shù)據(jù)庫,其中最為重要的一個特性就是它支持持久化,本文將深入介紹Redis持久化原理,包括RDB和AOF兩種方式的實現(xiàn),需要的朋友可以參考下
    2023-07-07
  • 大家都應(yīng)該知道的Redis過期鍵與過期策略

    大家都應(yīng)該知道的Redis過期鍵與過期策略

    這篇文章主要給大家介紹了一些應(yīng)該知道的Redis過期鍵與過期策略的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Redis過期刪除策略與內(nèi)存淘汰策略

    Redis過期刪除策略與內(nèi)存淘汰策略

    這篇文章主要介紹了Redis過期刪除策略與內(nèi)存淘汰策略,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 淺談Redis中的緩存更新策略

    淺談Redis中的緩存更新策略

    這篇文章主要介紹了淺談Redis中的緩存更新策略,CacheAsidePatter是我們比較常用的緩存更新策略,其由緩存調(diào)用者在更新數(shù)據(jù)庫時,在業(yè)務(wù)邏輯中設(shè)置緩存更新,需要的朋友可以參考下
    2023-08-08
  • 如何監(jiān)聽Redis中Key值的變化(SpringBoot整合)

    如何監(jiān)聽Redis中Key值的變化(SpringBoot整合)

    測試過程中我們有一部分常量值放入redis,共大部分應(yīng)用調(diào)用,但在測試過程中經(jīng)常有人會清空redis,回歸測試,下面這篇文章主要給大家介紹了關(guān)于如何監(jiān)聽Redis中Key值變化的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Redis 執(zhí)行性能測試

    Redis 執(zhí)行性能測試

    這篇文章主要介紹了Redis 執(zhí)行性能測試的方法,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)redis,感興趣的朋友可以了解下
    2020-08-08
  • 淺談Redis?中的過期刪除策略和內(nèi)存淘汰機制

    淺談Redis?中的過期刪除策略和內(nèi)存淘汰機制

    本文主要介紹了Redis?中的過期刪除策略和內(nèi)存淘汰機制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論