防止redis內(nèi)存溢出優(yōu)化方法
一、redis緩存介紹
redis雖然是內(nèi)存數(shù)據(jù)庫(kù),但它的數(shù)據(jù)依然保存在物理內(nèi)存中,redis會(huì)更具持久化配置每隔一段時(shí)間就會(huì)往磁盤寫入數(shù)據(jù),在寫入數(shù)據(jù)時(shí)會(huì)覆蓋磁盤中相同的key。redis當(dāng)前的緩存數(shù)據(jù)是保存在cached里面的,通過free -mh查看【-/+ buffers/cache: 16G 46G】,16G里面保存的就是redis的當(dāng)前緩存數(shù)據(jù)。
舉例:
這是一臺(tái)redis服務(wù)器,可以看到物理內(nèi)存的使用量已經(jīng)達(dá)到57G,但是redis的真正使用量其實(shí)最多只有16G
從這里【-/+ buffers/cache: 16G 46G】可以看到redis當(dāng)前最多使用了16G,當(dāng)前內(nèi)存可用空間還有46G(前提是這臺(tái)服務(wù)器只運(yùn)行了redis服務(wù))
[root@jxq-c2-16-3 ~]# /alidata/redis/bin/redis-cli 127.0.0.1:6379> info # Memory used_memory:15128469488 #redis數(shù)據(jù)占用了多少內(nèi)存(字節(jié)顯示) used_memory_human:14.09G #redis數(shù)據(jù)占用了多少內(nèi)存(G顯示,便于可讀性) used_memory_rss:15497564160 #redis進(jìn)程占用了多少內(nèi)存(字節(jié)) used_memory_peak:15164396944 #redis的峰值,最高運(yùn)行到多大內(nèi)存(字節(jié)) used_memory_peak_human:14.12G #redis的峰值,最高運(yùn)行到多大內(nèi)存(G顯示,便于可讀性) used_memory_lua:33792 #lua引擎所占用的內(nèi)存大?。ㄗ止?jié)) mem_fragmentation_ratio:1.02 #內(nèi)存碎片率 mem_allocator:jemalloc-3.2.0 #redis內(nèi)存分配器版本,在編譯時(shí)指定的。有l(wèi)ibc、jemalloc、tcmalloc這3種。
二、redis內(nèi)存釋放
注意:不要使用#echo 3 > /proc/sys/vm/drop_caches 這條命令釋放內(nèi)存,可能會(huì)造成redis數(shù)據(jù)丟失
主要有以下幾種方法:
修改redis.conf中的maxmemory-policy選項(xiàng)
- 加內(nèi)存
- 縮短(或設(shè)置)數(shù)據(jù)過期時(shí)間,以釋放內(nèi)存
- redis集群
1、如果數(shù)據(jù)是不怕丟的緩存數(shù)據(jù),那么可以在redis.conf里,配置如下兩項(xiàng),進(jìn)行內(nèi)存數(shù)據(jù)淘汰(需要重啟redis):
#設(shè)置redis最大內(nèi)存限制單位是字節(jié)1024B=1kb(這里我設(shè)置為64M): maxmemory 64000000 #這個(gè)值應(yīng)該設(shè)置為物理內(nèi)存的50% #超過內(nèi)存限制后的處理策略(這里我使用的策略為從內(nèi)存中遷出(其實(shí)就是刪除)不常用的key): maxmemory-policy allkeys-lfu 淘汰策略有以下幾種可選: LRU算法表示最近最少使用的,LFU算法表示最不常用的: #volatile-lru - >在設(shè)置了過期的key中,刪除最近最少使用的key,直到空間足夠?yàn)橹? #allkeys-lru - >從所有key里刪除最近最少使用的key,不管有沒設(shè)置過期,直到空間足夠?yàn)橹? #volatile-lfu - >在設(shè)置了過期的key中,刪除最少使用的key,直到空間足夠?yàn)橹? #allkeys-lfu - >從所有key里刪除最少使用的key,不管有沒設(shè)置過期,直到空間足夠?yàn)橹? #volatile-random - >刪除一個(gè)過期集合中的隨機(jī)key。 #allkeys-random - >刪除一個(gè)隨機(jī)key,不管有沒設(shè)置過期。 #volatile-ttl - >刪除即將過期的key(次TTL) #noviction - >不刪除,拒絕寫入,寫入操作時(shí)返回錯(cuò)誤。
2、看看如何動(dòng)態(tài)添加redis最大內(nèi)存限制以及相關(guān)策略(無需重啟redis):
#當(dāng)前的redis最大內(nèi)存是沒有限制的(0表示不限制) [root@jxq-c2-16-3 ~]# /alidata/redis/bin/redis-cli 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "0" #由于我的物理內(nèi)存是8G,我這里配置redis的最大內(nèi)存限制為4G 127.0.0.1:6379> config set maxmemory 4294967296 OK #再次查看是否生效 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "4294967296" 我們看看那些參數(shù) redis可以動(dòng)態(tài)設(shè)置 redis 127.0.0.1:6379> config get * 1) "dbfilename" 2) "dump.rdb" 3) "requirepass" 4) "" 5) "masterauth" 6) "" 7) "bind" 8) "" 9) "unixsocket" 10) "" 11) "logfile" 12) "" 13) "pidfile" 14) "/usr/local/redis/var/run/redis.pid" 15) "maxmemory" 16) "4294967296" 17) "maxmemory-samples" 18) "3" 19) "timeout" 20) "0" 21) "tcp-keepalive" 22) "60" 23) "auto-aof-rewrite-percentage" 24) "100" 25) "auto-aof-rewrite-min-size" 26) "67108864" 27) "hash-max-ziplist-entries" 28) "512" 29) "hash-max-ziplist-value" 30) "64" 31) "list-max-ziplist-entries" 32) "512" 33) "list-max-ziplist-value" 34) "64" 35) "set-max-intset-entries" 36) "512" 37) "zset-max-ziplist-entries" 38) "128" 39) "zset-max-ziplist-value" 40) "64" 41) "lua-time-limit" 42) "5000" 43) "slowlog-log-slower-than" 44) "10000" 45) "slowlog-max-len" 46) "128" 47) "port" 48) "6379" 49) "databases" 50) "32" 51) "repl-ping-slave-period" 52) "10" 53) "repl-timeout" 54) "60" 55) "maxclients" 56) "10000" 57) "watchdog-period" 58) "0" 59) "slave-priority" 60) "100" 61) "hz" 62) "10" 63) "no-appendfsync-on-rewrite" 64) "no" 65) "slave-serve-stale-data" 66) "yes" 67) "slave-read-only" 68) "yes" 69) "stop-writes-on-bgsave-error" 70) "yes" 71) "daemonize" 72) "yes" 73) "rdbcompression" 74) "yes" 75) "rdbchecksum" 76) "yes" 77) "activerehashing" 78) "yes" 79) "repl-disable-tcp-nodelay" 80) "no" 81) "aof-rewrite-incremental-fsync" 82) "yes" 83) "appendonly" 84) "no" 85) "dir" 86) "/usr/local/redis/db" 87) "maxmemory-policy" 88) "volatile-lru" 89) "appendfsync" 90) "everysec" 91) "save" 92) "900 1 300 10 60 10000" 93) "loglevel" 94) "notice"結(jié)論:如果redis數(shù)據(jù)中,存的是關(guān)鍵數(shù)據(jù),怕丟失的數(shù)據(jù),那么,redis數(shù)據(jù)占用的內(nèi)存,不要超過內(nèi)存大小的70%(保險(xiǎn)起見不要超過55%),以免內(nèi)存不足!不要期望什么內(nèi)存淘汰策略!它所做的居然是刪數(shù)據(jù)!LRU, LFU 遷出都是!如果一個(gè)項(xiàng)目的數(shù)據(jù)量比較大,就要經(jīng)常用info來看內(nèi)存的使用量,這樣才能讓項(xiàng)目更穩(wěn)定。 具體redis內(nèi)存優(yōu)化請(qǐng)參考 https://www.cnblogs.com/susufufu/p/7875210.html 95) "client-output-buffer-limit" 96) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60" 97) "unixsocketperm" 98) "0" 99) "slaveof"
到此這篇關(guān)于防止redis內(nèi)存溢出優(yōu)化方法的文章就介紹到這了,更多相關(guān)防止redis內(nèi)存溢出優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程
但有時(shí)候想在windows下折騰下Redis,那么就可以參考下面的方法了,雖然腳本之家小編以前整理了一些,發(fā)現(xiàn)這篇做的比較詳細(xì),下載也給出來了2018-08-08Redis+aop實(shí)現(xiàn)接口防刷(冪等)的解決方案
在高并發(fā)場(chǎng)景下,可能會(huì)因?yàn)榫W(wǎng)絡(luò)或者服務(wù)器原因,造成延遲,同時(shí)就是有可能會(huì)有人用腳本大量訪問你的接口,造成資源崩潰,所以本文給大家介紹了Redis+aop實(shí)現(xiàn)接口防刷(冪等)的解決方案,需要的朋友可以參考下2024-03-03redis和redisson實(shí)現(xiàn)分布式鎖的操作方法
使用 Redis 實(shí)現(xiàn)分布式鎖,最直接的想法是利用 setnx 和 expire 命令實(shí)現(xiàn)加鎖,這篇文章主要介紹了redis和redisson實(shí)現(xiàn)分布式鎖的操作方法,需要的朋友可以參考下2024-03-03利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能
大家好,本篇文章主要講的是利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12redis中RDB(Redis Data Base)的機(jī)制
本文主要介紹了redis中RDB(Redis Data Base)的機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能
Redis是一個(gè)著名的key-value存儲(chǔ)系統(tǒng),也是nosql中的最常見的一種,這篇文章主要給大家介紹Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能,感興趣的朋友一起看看吧2021-09-09