Redis内存满了怎么办,Redis导致系统内存爆满

Posted G佳伟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis内存满了怎么办,Redis导致系统内存爆满相关的知识,希望对你有一定的参考价值。

一、修改配置文件

Redis长期使用,不设置过期时间,导致内存爆满,可以修改Redis的配置文件redis.conf 文件中,配置参数 maxmemory 的大小。一般的项目maxmemory设置为3~5G即可,也可以根据自己服务器内存大小进行配置。

maxmemory 4G

二、命令

通过命令修改,链接redis服务通过命令动态修改内存大小。

1 //设置Redis最大占用内存大小为100M
2 127.0.0.1:6379> config set maxmemory 100mb
3 //获取设置的Redis能使用的最大内存大小
4 127.0.0.1:6379> config get maxmemory

三、修改Redis淘汰策略

Redis 6种的淘汰策略:

策略说明
noeviction(默认策略)若是内存的大小达到阀值的时候,所有申请内存的指令都会报错;
allkeys-lru所有key都是使用LRU算法进行淘汰;
volatile-lru所有设置了过期时间的key使用LRU算法进行淘汰;
allkeys-random所有的key使用随机淘汰的方式进行淘汰;
volatile-random所有设置了过期时间的key使用随机淘汰的方式进行淘汰;
volatile-ttl所有设置了过期时间的key根据过期时间进行淘汰,越早过期就越快被淘汰

allkeys-lru策略使用场景:

项目内有一部分是热点数据,而剩下的数据是冷门数据,或者我们不太清楚我们应用的缓存访问分布状况,这时使用allkeys-lru。
Redis淘汰策略也可以通过命令的方式进行配置:

1 // 获取maxmemory-policy配置
2 127.0.0.1:6379> config get maxmemory-policy
3 // 设置maxmemory-policy配置为allkeys-lru
4 127.0.0.1:6379> config set maxmemory-policy allkeys-lru

redis内存满了怎么办

redis内存满了解决方法:

1,增加内存。

2,使用内存淘汰策略。

3,Redis集群。

重点介绍下2、3:

第二点:

我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节)。

那么当所需内存,超过maxmemory怎么办?

这个时候就该配置文件中的maxmemory-policy出场了。

其默认值是noeviction。

下面我将列出当可用内存不足时,删除redis键具有的淘汰规则。

规则说明:

1、volatile-lru

使用LRU算法删除一个键(只对设置了生存时间的键)

2、allkeys-lru

使用LRU算法删除一个键

3、volatile-random

随机删除一个键(只对设置了生存时间的键)

4、allkeys-random

随机删除一个键

5、volatile-ttl

删除生存时间最近的一个键

6、noeviction

不删除键,只返回错误

LRU算法,least RecentlyUsed,最近最少使用算法。也就是说默认删除最近最少使用的键。

但是一定要注意一点!redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。

那么3这个数字也是可以设置的,对应位置是配置文件中的maxmeory-samples.

三、集群怎么做

Redis仅支持单实例,内存一般最多10~20GB。对于内存动辄100~200GB的系统,就需要通过集群来支持了。

Redis集群有三种方式:客户端分片、代理分片、RedisCluster(在之后一篇文章详细说一下。)

1、客户端分片

通过业务代码自己实现路由

优势:可以自己控制分片算法、性能比代理的好

劣势:维护成本高、扩容/缩容等运维操作都需要自己研发

2、代理分片

代理程序接收到来自业务程序的数据请求,根据路由规则,将这些请求分发给正确的Redis实例并返回给业务程序。使用类似Twemproxy、Codis等中间件实现。

优势:运维方便、程序不用关心如何链接Redis实例

劣势:会带来性能消耗(大概20%)、无法平滑扩容/缩容,需要执行脚本迁移数据,不方便(Codis在Twemproxy基础上优化并实现了预分片来达到Auto Rebalance)。

3、Redis Cluster

优势:官方集群解决方案、无中心节点,和客户端直连,性能较好

劣势:方案太重、无法平滑扩容/缩容,需要执行相应的脚本,不方便、太新,没有相应成熟的解决案例
参考技术A 1。可以在配置文件中配置Redis可使用的内存的大小:
修改配置文件 :
可以在Redis的安装目录中的redis.conf文件中设置内存大小 , 例如 :
maxmemory 100mb //这是设置Redis最大可以占用的内存为100M.
或通过Redis命令来修改可用内存大小 :
在Redis运行时可以通过命令来动态地修改可用内存的大小 , 例如 :
127.0.0.1 : 6379 > config set maxmemory 100MB //这是设置Redis最大可以占用的内存为100M

127.0.0.1 : 6379 > config get maxmemory //这是获取刚才设置的Redis可用的最大内存
2。内存淘汰机制
以下是可以通过配置文件设置的内存淘汰策略 :

1. noeviction(默认):不再提供写请求服务,返回错误

2. allkeys-lru:在所有的key中使用LRU算法对数据进行淘汰

3. volatile-lru:在设置了"过期时间 "的过期key中用LRU算法对数据进行淘汰

4. allkeys-random:随机进行数据淘汰

5. volatile-random:在有" 过期时间 "的key中随机进行数据淘汰

6. volatile-ttl:依据key的已经设置的过期时间进行数据淘汰,最早过期的数据最早被淘汰

以上是关于Redis内存满了怎么办,Redis导致系统内存爆满的主要内容,如果未能解决你的问题,请参考以下文章

redis内存满了怎么办

面试官问:Redis 内存满了怎么办?我想不到!

Redis内存满了怎么办?

redis内存满了怎么办?让你玩懂8种内存淘汰策略

我:Redis内存数据满了导致宕机。CTO:你太无知了....一脸懵

Redis内存满了会怎么样?