为什么redis内存不宜过大

redis的效率问题是毋庸置疑的,简直甩了mysql几百条街。导致现在很多的接口,为了追求性能问题,都开始滥用redis。在目前主流的redis分布式系统中,一般一个redis集群有多个redis分片,而一个redis分片是由一个主库和多个从库组成。其实当一个redis分片有太多的内存是不友好。接下来从几个方面讲解为什么不好的原因:

一、过期数据太多容易导致操作超时

当你的redis中存在大量的过期数据的时候。redis会启用两种清理方式:

  • 1、惰性删除:放任键过期不管,但是每次从键空间获取键的时候,如果该键存在,再去expires字典判断这个键是不是超时。如果超时则返回空,并删除该键。
  • 2、定期删除:通过redis架构中的时间事件,每隔一段时间后,在规定的时间内,会主动去检测expires字典中包含的key进行检测,发现过期的则删除。

1.1、定期删除机制

定期删除的机制,是根据hz这个配置参数有很大的关系,hz默认是10,代表redis每秒执行10次定期删除的操作。定期删除是在规定的时间内(time_limit)尽可能删除多的过期数据。而规定的的时间是time_limit = 25000/hz/100。所以默认是25ms。

1.2、内存大、过期数据多导致耗时严重

为什么会有这种后果呢?

  • 就是因为当一个redis的分片过大的时候。那么他分配的过期数据就会变多。
  • 过期的数据多的时候,定期删除机制就会一直进行,因为一直删不完呀。
  • 当然redis集群只有主库才会有定期删除机制,从库只需要同步。
  • 但是主库是有读写流量的,所以会导致有一部分流量会在25ms之后才会执行。
  • 因为redis是但线程但进程的呀,当线程正在执行定期删除的时候,其他操作需要等待。

1.3、解决方法;

当你的过期数据大的时候,可以两种方法:

  • 增大hz。这样time_limit = 25000/hz/100。hz变大,time_limit就会变小。超时就不会这么严重
  • 定时清理过期数据。通过脚本,在请求量少的时候,主动去清理过期的数据。
  • 增加分片,减少每个分片的数据量。这样每个分片的过期数据量就会变小,就不需要一直执行定期删除了。

二、主库宕机

2.1、主从架构:


当一个分片中,主库挂了。我们常见的容灾策略是“切主”,也就是

  • 从从库中挑选一个,升级为主库。
  • 然后再将剩下的从库挂载到新的主库成为其从库,最终恢复整个主从集群结构。

上述的过程中,最难的不是主库的切换,而是从库的重新挂载。

这是因为redis无法像mysql、mongodb那样基于同步的点位在主库发生变化后从新的主库继续同步数据。 在redis集群中一旦从库换主,redis的做法是将更换主库的从库清空然后从新主库完整同步一份数据再进行续传

整个从库重做流程是这样的:

  • 1.主库bgsave自身数据到磁盘
  • 2.主库发送rdb文件到从库
  • 3.从库开始加载
  • 4.加载完毕开始续传,同时开始提供服务

很明显,在这个过程中redis的内存体积越大以上每一个步骤的时间都会被拉长,实际测试的数据如下(我们自认我们的机器性能比较好):

可以看到,当数据达到20G的时候,一个从库的恢复时间已经被拉长到了将近20分钟,如果有10个从库那么如果依次恢复则共需200分钟,而如果此时该从库承担着大量的读取请求你能够忍受这么长的恢复时间吗?

2.2、为什么不能同时重做所有从库?

如果所有从库同时向主库请求rdb文件,那么主库的网络将会被阻塞,一样无法提供正常服务。

三、扩容问题:

当一个分片的数据量太大,我们需要对其进行扩容,增加从库。把一个从库挂载到主库上,20G的数据可是要20分钟呀;

四、解决方法;

4.1、增加分片,降低每个分片的内存大小

废话,redis内存过大当然是降低每个内存的大小了。

4.2、及时清理过期的数据、无用的数据

定时流量少的时候清理过期数据、业务下线后也及时清理相关数据。

4.3、设置过期时间

对不需要一直存在的数据设置过期的时间

4.4、及时info关注redis内存的使用情况

文章目录
  1. 1. 一、过期数据太多容易导致操作超时
    1. 1.0.1. 1.1、定期删除机制
    2. 1.0.2. 1.2、内存大、过期数据多导致耗时严重
    3. 1.0.3. 1.3、解决方法;
  • 2. 二、主库宕机
    1. 2.0.1. 2.1、主从架构:
    2. 2.0.2. 2.2、为什么不能同时重做所有从库?
  • 3. 三、扩容问题:
  • 4. 四、解决方法;
    1. 4.0.1. 4.1、增加分片,降低每个分片的内存大小
    2. 4.0.2. 4.2、及时清理过期的数据、无用的数据
    3. 4.0.3. 4.3、设置过期时间
    4. 4.0.4. 4.4、及时info关注redis内存的使用情况
  • ,