一、redis缓存介绍
redis虽然是内存数据库,但它的数据依然保存在物理内存中,redis会更具持久化配置每隔一段时间就会往磁盘写入数据,在写入数据时会覆盖磁盘中相同的key。redis当前的缓存数据是保存在cached里面的,通过free -mh查看【-/+ buffers/cache: 16g 46g】,16g里面保存的就是redis的当前缓存数据。
举例:
这是一台redis服务器,可以看到物理内存的使用量已经达到57g,但是redis的真正使用量其实最多只有16g
从这里【-/+ buffers/cache: 16g 46g】可以看到redis当前最多使用了16g,当前内存可用空间还有46g(前提是这台服务器只运行了redis服务)
[root@jxq-c2-16-3 ~]# /alidata/redis/bin/redis-cli 127.0.0.1:6379> info # memory used_memory:15128469488 #redis数据占用了多少内存(字节显示) used_memory_human:14.09g #redis数据占用了多少内存(g显示,便于可读性) used_memory_rss:15497564160 #redis进程占用了多少内存(字节) used_memory_peak:15164396944 #redis的峰值,最高运行到多大内存(字节) used_memory_peak_human:14.12g #redis的峰值,最高运行到多大内存(g显示,便于可读性) used_memory_lua:33792 #lua引擎所占用的内存大小(字节) mem_fragmentation_ratio:1.02 #内存碎片率 mem_allocator:jemalloc-3.2.0 #redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。
二、redis内存释放
注意:不要使用#echo 3 > /proc/sys/vm/drop_caches 这条命令释放内存,可能会造成redis数据丢失
主要有以下几种方法:
修改redis.conf中的maxmemory-policy选项
- 加内存
- 缩短(或设置)数据过期时间,以释放内存
- redis集群
1、如果数据是不怕丢的缓存数据,那么可以在redis.conf里,配置如下两项,进行内存数据淘汰(需要重启redis):
#设置redis最大内存限制单位是字节1024b=1kb(这里我设置为64m): maxmemory 64000000 #这个值应该设置为物理内存的50% #超过内存限制后的处理策略(这里我使用的策略为从内存中迁出(其实就是删除)不常用的key): maxmemory-policy allkeys-lfu 淘汰策略有以下几种可选: lru算法表示最近最少使用的,lfu算法表示最不常用的: #volatile-lru - >在设置了过期的key中,删除最近最少使用的key,直到空间足够为止 #allkeys-lru - >从所有key里删除最近最少使用的key,不管有没设置过期,直到空间足够为止 #volatile-lfu - >在设置了过期的key中,删除最少使用的key,直到空间足够为止 #allkeys-lfu - >从所有key里删除最少使用的key,不管有没设置过期,直到空间足够为止 #volatile-random - >删除一个过期集合中的随机key。 #allkeys-random - >删除一个随机key,不管有没设置过期。 #volatile-ttl - >删除即将过期的key(次ttl) #noviction - >不删除,拒绝写入,写入操作时返回错误。
2、看看如何动态添加redis最大内存限制以及相关策略(无需重启redis):
#当前的redis最大内存是没有限制的(0表示不限制) [root@jxq-c2-16-3 ~]# /alidata/redis/bin/redis-cli 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "0" #由于我的物理内存是8g,我这里配置redis的最大内存限制为4g 127.0.0.1:6379> config set maxmemory 4294967296 ok #再次查看是否生效 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "4294967296" 我们看看那些参数 redis可以动态设置 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"结论:如果redis数据中,存的是关键数据,怕丢失的数据,那么,redis数据占用的内存,不要超过内存大小的70%(保险起见不要超过55%),以免内存不足!不要期望什么内存淘汰策略!它所做的居然是删数据!lru, lfu 迁出都是!如果一个项目的数据量比较大,就要经常用info来看内存的使用量,这样才能让项目更稳定。 具体redis内存优化请参考 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"
到此这篇关于防止redis内存溢出优化方法的文章就介绍到这了,更多相关防止redis内存溢出优化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论