新聞中心
Redis內(nèi)存淘汰的探究

公司主營業(yè)務(wù):網(wǎng)站制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出和平免費(fèi)做網(wǎng)站回饋大家。
Redis是一款常見的開源內(nèi)存數(shù)據(jù)庫,常被用于緩存、消息隊(duì)列等場景。由于其采用了內(nèi)存存儲,因此在使用時需要注意內(nèi)存的使用情況。
為了避免內(nèi)存溢出,Redis提供了多種內(nèi)存淘汰策略。本文將系統(tǒng)地探究Redis內(nèi)存淘汰策略的相關(guān)知識,并通過代碼實(shí)踐加深理解。
一、Redis內(nèi)存淘汰策略介紹
1.1 noeviction
noeviction表示不進(jìn)行內(nèi)存淘汰,當(dāng)內(nèi)存占用達(dá)到maxmemory限制時,后續(xù)寫入操作會返回錯誤信息。這種策略一般用于保證數(shù)據(jù)的完整性,但不利于系統(tǒng)的穩(wěn)定性和可用性。
1.2 allKEYs-lru
allkeys-lru表示對所有key進(jìn)行LRU淘汰操作。它會按照鍵的最后一次使用時間順序淘汰掉訪問時間最早的key,直到騰出足夠的內(nèi)存空間。
1.3 volatile-lru
volatile-lru表示對過期鍵中最長時間未使用的key進(jìn)行LRU淘汰操作。它會按照鍵的最后一次使用時間順序淘汰掉訪問時間最早的key,直到騰出足夠的內(nèi)存空間。
1.4 allkeys-random
allkeys-random表示隨機(jī)淘汰所有key,它并不考慮每個key的使用情況。這種策略在持久化存儲過程中難以保證一致性,因此不被推薦使用。
1.5 volatile-random
volatile-random表示隨機(jī)淘汰過期鍵中的key,它并不考慮每個key的使用情況。和allkeys-random策略一樣,不利于保證一致性。
1.6 volatile-ttl
volatile-ttl表示淘汰剩余有效期最短的key。將剩余有效期最短的key作為優(yōu)先考慮對象,直到騰出足夠的內(nèi)存空間。
二、Redis內(nèi)存淘汰的實(shí)踐
下面我們通過代碼實(shí)踐來加深對Redis內(nèi)存淘汰的理解。
假設(shè)我們有一個Redis實(shí)例,maxmemory設(shè)置為2MB。現(xiàn)在我們向Redis中寫入一些數(shù)據(jù),每個key大小為100KB。具體代碼如下所示:
import redis
client = redis.Redis()
key_size = 1024 * 100 # 100KB
total_size = 1024 * 1024 * 2 # 2MB
write_size = 0
while write_size
key = "key_" + str(write_size)
value = "value" + str(write_size)
client.set(key, value)
write_size += key_size
運(yùn)行以上代碼后,我們可以通過如下命令查看內(nèi)存使用情況:
redis-cli info memory
其中,used_memory_peak記錄當(dāng)前內(nèi)存使用峰值;maxmemory指定的最大內(nèi)存限制。
開啟Redis的maxmemory-policy設(shè)置為volatile-lru,即采用LRU淘汰過期鍵中最長時間未使用的key。
client.config_set("maxmemory-policy", "volatile-lru")
接著,我們向Redis中寫入一些數(shù)據(jù),每個key的有效期為60s。
key_size = 1024 * 100 # 100KB
total_size = 1024 * 1024 * 2 # 2MB
write_size = 0
while write_size
key = "key_" + str(write_size)
value = "value" + str(write_size)
client.setex(key, 60, value)
write_size += key_size
等待60s后,Redis的內(nèi)存淘汰策略生效,我們可以查看系統(tǒng)日志,發(fā)現(xiàn)Redis按照LRU策略淘汰掉了最久未被使用的key。
如下所示:
2021-12-20T09:12:16.585807393Z [160] 20 Dec 09:12:16.585 # Redis is now ready to exit, bye bye...
2021-12-20T09:12:16.681584335Z [160] 20 Dec 09:12:16.680 * Running mode=standalone, port=6379.
2021-12-20T09:12:16.681601956Z [160] 20 Dec 09:12:16.680 # Server initialized
2021-12-20T09:12:16.682593737Z [160] 20 Dec 09:12:16.682 # WARNING overcommit_memory is set to 0! Background save may fl under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
2021-12-20T09:12:16.682647838Z [160] 20 Dec 09:12:16.682 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retn the setting after a reboot. Redis must be restarted after THP is disabled.
2021-12-20T09:12:16.683406032Z [160] 20 Dec 09:12:16.683 # Server running in protected mode (pid=160)
2021-12-20T09:12:16.683423874Z [160] 20 Dec 09:12:16.683 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2021-12-20T09:12:16.683430985Z [160] 20 Dec 09:12:16.683 # Server initialized and ready to accept connections
2021-12-20T09:12:16.683438676Z [160] 20 Dec 09:12:16.683 # Server listening on 0.0.0.0:6379
2021-12-20T09:12:16.683445987Z [160] 20 Dec 09:12:16.683 # Server started, Redis version 6.2.6
2021-12-20T09:12:16.689878958Z [160] 20 Dec 09:12:16.689 # *** Overcommit on memory (-o bytes): FALSE ***
2021-12-20T09:13:16.306625381Z [160] 20 Dec 09:13:16.306 * 1 changes in 900 seconds. Saving...
2021-12-20T09:13:16.306702818Z [160] 20 Dec 09:13:16.306 * Background saving started by pid 186
2021-12-20T09:13:16.963921423Z [186] 20 Dec 09:13:16.963 * DB saved on disk
2021-12-20T09:13:16.964287960Z [186] 20 Dec 09:13:16.963 * RDB: 0 MB of memory used by copy-on-write
2021-12-20T09:13:16.964294332Z [160] 20 Dec 09:13:16.964 * Background saving terminated with success
2021-12-20T09:13:17.307347063Z [160] 20 Dec 09:13:17.307 # Redis is now ready to exit, bye bye...
2021-12-20T09:13:19.831007485Z [160] 20 Dec 09:13:19.831 * Running mode=standalone, port=6379.
2021-12-20T09:13:19.831147840Z [160] 20 Dec 09:13:19.831 # Server initialized
2021-12-20T09:13:25.545417915Z [160] 20 Dec 09:13:25.545 # WARNING overcommit_memory is set to 0! Background save may fl under low memory condition. To fix this issue add 'vm.overcommit_memory =
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計和制作領(lǐng)域具有豐富的經(jīng)驗(yàn)。
文章標(biāo)題:Redis內(nèi)存淘汰的探究(redis的內(nèi)存淘汰策論)
標(biāo)題路徑:http://www.5511xx.com/article/dpiiheg.html


咨詢
建站咨詢
