Redis內(nèi)存優(yōu)化實驗

1、實驗環(huán)境

硬件:4C/1G/20G

軟件:Centos7/Docker19/Redis6

2入问、實驗步驟

2.1 初始準備

$ swapoff -a     # 臨時關(guān)閉交換內(nèi)存
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled  # 臨時禁用 THP
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
$ mkdir -p /usr/local/redis && chmod 666 /usr/local/redis && cd /usr/local/redis
$ vi redis.conf    # 添加如下內(nèi)容
appendonly no                 # 不開戶實例化匾灶,以提高性能
maxmemory  8M                 # 最大使用內(nèi)存
maxmemory-policy  allkeys-lru  # 當used_memory達到maxmemory時的數(shù)據(jù)驅(qū)逐策略颊糜,刪除最近最少用數(shù)據(jù)
protected-mode no               # 開啟其他機器訪問
$ vi import.lua    # 批量添加數(shù)據(jù)Lua腳本
local count = tonumber(ARGV[1])
local expire_time = tonumber(ARGV[2])  -- 過期時間(秒)
redis.call("SELECT", 0)  -- 確保選擇數(shù)據(jù)庫 0

for i = 1, count do
    local key = "key" .. i
    local value = "value" .. i
    redis.call("SET", key, value)
    redis.call("EXPIRE", key, expire_time)
    if i % 10000 == 0 then
        redis.log(redis.LOG_NOTICE, "Inserted and set expiration for " .. i .. " keys")
    end
end
1730647086230.png

2.2 運行docker

$ docker run --name redis  --restart=always -d \
-p 6379:6379 \
-v /usr/local/redis/redis.conf:/usr/local/etc/redis/redis.conf  \
-v /usr/local/redis/import.lua:/data/import.lua \
-v /usr/local/redis/data:/data   redis:6.0.8 \
redis-server /usr/local/etc/redis/redis.conf 
$ docker ps
\CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d007736e7bdd        redis:6.0.8         "docker-entrypoint.s…"   16 seconds ago      Up 15 seconds       0.0.0.0:6379->6379/tcp   redis

2.3 實驗1:設(shè)置最大內(nèi)存與數(shù)據(jù)過期時間

使用top命令 憔杨,看一下當前內(nèi)存占用情況


1730647355669.png

再開一個SSH窗口,檢查一下配置參數(shù)是否生效

$ docker exec -it redis  /bin/bash
root@d007736e7bdd:/data# redis-cli config get maxmemory
1) "maxmemory"
2) "8000000"
root@d007736e7bdd:/data# redis-cli config get maxmemory-policy 
1) "maxmemory-policy"
2) "allkeys-lru"

檢查一下初始內(nèi)存分配情況

root@d007736e7bdd:/data# redis-cli info memory | grep used_memory|grep human 
used_memory_human:844.73K
used_memory_rss_human:4.26M
used_memory_peak_human:844.73K
used_memory_lua_human:37.00K
used_memory_scripts_human:0B

參數(shù)說明:

used_memory:Redis 分配器分配的內(nèi)存總量

used_memory_rss:進程從操作系統(tǒng)分配的內(nèi)存總量

used_memory_peak:Redis 分配器分配的內(nèi)存峰值

寫20萬數(shù)據(jù),設(shè)置10分鐘過期

root@d007736e7bdd:/data# redis-cli info keyspace   # 當前數(shù)據(jù)庫為空
# Keyspace
root@d007736e7bdd:/data# redis-cli --eval import.lua , 200000 600
(nil)
1730647709116.png
root@a3222c70b966:/data# redis-cli info memory | grep used_memory|grep human 
used_memory_human:7.63M               # 應該內(nèi)存已經(jīng)用盡了
used_memory_rss_human:30.89M          # 實際占用內(nèi)存已經(jīng)遠超8M了   
used_memory_peak_human:215.92M
used_memory_lua_human:74.00K
used_memory_scripts_human:552B
root@a3222c70b966:/data# redis-cli info keyspace 
# Keyspace
db0:keys=30625,expires=30625,avg_ttl=538500   # 已經(jīng)觸發(fā)清除策略怀读,只剩下3萬條

過10分鐘后再檢查

root@a3222c70b966:/data# redis-cli info keyspace # 數(shù)據(jù)已完全過期
# Keyspace
root@a3222c70b966:/data# redis-cli info memory | grep used_memory|grep human 
used_memory_human:846.61K
used_memory_rss_human:9.52M  # 實際占用內(nèi)存已經(jīng)下降了  
used_memory_peak_human:215.92M
used_memory_lua_human:74.00K
used_memory_scripts_human:552B

從下圖可以看到苍糠,雖然數(shù)據(jù)都被清理了拥娄,但實際占用內(nèi)存還是增長了


1730648322305.png

2.4 實驗2:設(shè)置最大內(nèi)存,不設(shè)置數(shù)據(jù)過期時間

$ docker stop redis && docker rm redis
redis
redis
$ rm -f import.lua 
$ vi import.lua 
for i = 1, count do
    redis.call("SET", "key" .. i, "value" .. i)
end
$ docker run --name redis ........ (參考前面)
1730649547617.png

回到第2個窗口

$  docker exec -it redis  /bin/bash
root@0fce85341f7e:/data# redis-cli --eval import.lua , 200000
(nil)
root@0fce85341f7e:/data#  redis-cli info memory | grep used_memory|grep human 
used_memory_human:7.63M
used_memory_rss_human:20.59M     # 實際占用內(nèi)存比有過期設(shè)置的要少  
used_memory_peak_human:16.55M
used_memory_lua_human:60.00K
used_memory_scripts_human:216B
root@0fce85341f7e:/data#  redis-cli info keyspace
# Keyspace
db0:keys=70001,expires=0,avg_ttl=0     # 剩下7萬條
1730649873166.png

因為沒有設(shè)置過期時間摊欠,這里將數(shù)據(jù)庫手動清空

root@0fce85341f7e:/data# redis-cli FLUSHALL
OK
root@0fce85341f7e:/data#  redis-cli info keyspace
# Keyspace
root@0fce85341f7e:/data#  redis-cli info memory | grep used_memory|grep human 
used_memory_human:845.52K         # used_memory 恢復了
used_memory_rss_human:7.55M       # 系統(tǒng)分配內(nèi)存也降下來了 
used_memory_peak_human:16.55M
used_memory_lua_human:60.00K
used_memory_scripts_human:216B
1730650045039.png

2.5 實驗3:不設(shè)置最大內(nèi)存與數(shù)據(jù)過期時間

$ docker stop redis && docker rm redis
redis
redis
$ sed -i "s/max/#max/" redis.conf 
[root@localhost redis]# cat redis.conf 
appendonly no
#maxmemory  8M
#maxmemory-policy  allkeys-lru
protected-mode no
$ docker run --name redis ........ (參考前面)
1730650542028.png

再到第二個窗口

$ docker exec -it redis  /bin/bash
root@8e6f924f76df:/data#  redis-cli info memory | grep used_memory|grep human 
used_memory_human:844.73K
used_memory_rss_human:4.25M
used_memory_peak_human:844.73K
used_memory_lua_human:37.00K
used_memory_scripts_human:0B
root@8e6f924f76df:/data# redis-cli --eval import.lua , 200000  # 寫20萬條
(nil)
root@8e6f924f76df:/data#  redis-cli info memory | grep used_memory|grep human 
used_memory_human:16.55M
used_memory_rss_human:21.59M
used_memory_peak_human:16.55M
used_memory_lua_human:60.00K
used_memory_scripts_human:216B
root@8e6f924f76df:/data#  redis-cli info keyspace
# Keyspace
db0:keys=200000,expires=0,avg_ttl=0    # 全部定入
1730650751817.png

直接寫200萬條試下

root@8e6f924f76df:/data# redis-cli --eval import.lua , 2000000                
(nil)
root@8e6f924f76df:/data#  redis-cli info keyspace             
# Keyspace
db0:keys=2000000,expires=0,avg_ttl=0
root@8e6f924f76df:/data#  redis-cli info memory | grep used_memory|grep human 
used_memory_human:154.15M
used_memory_rss_human:161.43M
used_memory_peak_human:154.15M
used_memory_lua_human:58.00K
used_memory_scripts_human:216B
1730650830982.png

寫2000萬條

[root@localhost ~]# docker ps   # 可以看到docker已經(jīng)重啟了( Up 7 seconds )
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8e6f924f76df        redis:6.0.8         "docker-entrypoint.s…"   8 minutes ago       Up 7 seconds        0.0.0.0:6379->6379/tcp   redis

3说墨、實驗結(jié)論

由上述實驗可以看出:

  1. 不設(shè)置maxmemory時可以最大保證數(shù)據(jù)的完整性,但有可能導致docker程序因內(nèi)存占用過大而被系統(tǒng)重置棺棵;
  2. 在已經(jīng)設(shè)置了maxmemory的情況下,不主動配置數(shù)據(jù)過期時間可以較完整地保存數(shù)據(jù)缚柏,若配置了配置數(shù)據(jù)過期時間則可以減少內(nèi)存開銷币喧;
  3. maxmemory并不等于redis占用系統(tǒng)實際內(nèi)存的值,當有大批量數(shù)據(jù)寫入時史翘,后者的值有可能比前者大得多,因此這個值要合理設(shè)置跨琳。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滚澜,更是在濱河造成了極大的恐慌设捐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岗钩,居然都是意外死亡,警方通過查閱死者的電腦和手機周蹭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宛畦,你說我怎么就攤上這事次和》蠢撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵踏施,是天一觀的道長石蔗。 經(jīng)常有香客問我,道長畅形,這世上最難降的妖魔是什么养距? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任日熬,我火速辦了婚禮棍厌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竖席。我一直安慰自己定铜,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布怕敬。 她就那樣靜靜地躺著揣炕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪东跪。 梳的紋絲不亂的頭發(fā)上畸陡,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音虽填,去河邊找鬼丁恭。 笑死,一個胖子當著我的面吹牛斋日,可吹牛的內(nèi)容都是我干的牲览。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恶守,長吁一口氣:“原來是場噩夢啊……” “哼第献!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兔港,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤庸毫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衫樊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飒赃,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡利花,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了载佳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒事。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔫慧,靈堂內(nèi)的尸體忽然破棺而出挠乳,到底是詐尸還是另有隱情,我是刑警寧澤藕漱,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布欲侮,位于F島的核電站崭闲,受9級特大地震影響肋联,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刁俭,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一橄仍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牍戚,春花似錦侮繁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至第晰,卻和暖如春锁孟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茁瘦。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工撒遣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惨远,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像宠纯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子隧哮,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容