防止redis内存溢出优化方法

 更新时间:2025年03月18日 10:25:38   作者:会飞的爱迪生  
本文主要介绍了防止redis内存溢出优化方法,包括使用maxmemory-policy选项、设置数据过期时间和配置Redis集群等,具有一定的参考价值,感兴趣的可以了解一下

一、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内存溢出优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • Windows系统安装Redis的详细图文教程

    Windows系统安装Redis的详细图文教程

    但有时候想在windows下折腾下Redis,那么就可以参考下面的方法了,虽然脚本之家小编以前整理了一些,发现这篇做的比较详细,下载也给出来了
    2018-08-08
  • Redis+aop实现接口防刷(幂等)的解决方案

    Redis+aop实现接口防刷(幂等)的解决方案

    在高并发场景下,可能会因为网络或者服务器原因,造成延迟,同时就是有可能会有人用脚本大量访问你的接口,造成资源崩溃,所以本文给大家介绍了Redis+aop实现接口防刷(幂等)的解决方案,需要的朋友可以参考下
    2024-03-03
  • 5分钟搭建redis集群(redis5.0.5)

    5分钟搭建redis集群(redis5.0.5)

    本文主要介绍了5分钟搭建redis集群,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Redis实现分布式锁详解

    Redis实现分布式锁详解

    这篇文章主要介绍了redis如何实现分布式锁,文章中有详细的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-04-04
  • redis和redisson实现分布式锁的操作方法

    redis和redisson实现分布式锁的操作方法

    使用 Redis 实现分布式锁,最直接的想法是利用 setnx 和 expire 命令实现加锁,这篇文章主要介绍了redis和redisson实现分布式锁的操作方法,需要的朋友可以参考下
    2024-03-03
  • 利用Redis实现防止接口重复提交功能

    利用Redis实现防止接口重复提交功能

    大家好,本篇文章主要讲的是利用Redis实现防止接口重复提交功能,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • redis中RDB(Redis Data Base)的机制

    redis中RDB(Redis Data Base)的机制

    本文主要介绍了redis中RDB(Redis Data Base)的机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 解决redis修改requirepass后不生效的问题

    解决redis修改requirepass后不生效的问题

    今天小编就为大家分享一篇解决redis修改requirepass后不生效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Redis如何实现投票功能

    Redis如何实现投票功能

    这篇文章主要介绍了Redis如何实现投票功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Jedis操作Redis实现模拟验证码发送功能

    Jedis操作Redis实现模拟验证码发送功能

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家介绍Jedis操作Redis实现模拟验证码发送功能,感兴趣的朋友一起看看吧
    2021-09-09

最新评论