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导致系统内存爆满的主要内容,如果未能解决你的问题,请参考以下文章