Redis需要预留多少内存才是安全的

Redis需要预留多少内存才是安全的

一、前言

最近在正式环境频繁出现redis进程被linux服务器误杀的情况,最终排查原因发现是redis占用的总内存过高,导致被系统误杀。

二、配置多大Redis内存才是安全的

这个没有一个定论,需要根据具体的业务场景来设置,一般的情况需要预留redis内存的一倍才安全,例如:你的redis数据占用了4G内存,那么你至少还需要预留4G的空闲内存,也就是内存需求量是8G。内存利用率低于50%才是安全的。可能大家会有以下疑问:

1.为什么需要预留这么多的内存?

重写AOF文件和RDB文件。大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内存数据库,它的操作都几乎基于内存。但是内存型数据库有一个很大的弊端,就是当数据库进程崩溃或系统重启的时候,如果内存数据不保存的话,里面的数据就会丢失不见了。所以数据的持久化是内存型数据库的重中之重。Redis对于数据持久化提供了两种持久化的方案,RDB与AOF,这里就不做过多介绍。

当重写AOF文件和RDB文件redis会fork出一条新进程来。如果父进程的内存没被修改,子进程与父进程共享Page。如果父进程的Page被修改, 会复制一份改动前的内容给新进程,在系统繁忙时,如果父进程的所有Page在子进程写RDB过程中都被修改过了,就需要两倍内存。

2.如何配置Redis内存上限

如果服务器资源不多的情况,或者我们需要做深度优化就需要设置Redis内存上限,作为一个内存型数据库,Redis 经常会遇到内存满的问题。

Redis 服务器的最大占用内存量由配置项 maxmemory 决定,我们可以通过 config set maxmemory 2GB 的格式来配置。一旦 Redis 内存满,所有引起内存增加的操作都会被返回 error。

但通常正式环境下我们不可能只限制maxmemory的大小,因为不可能使内存达到上限后就不能在执行写操作,我们一般配合maxmemory-policy来配置,当redis内存数据集快到达maxmemory时,redis会实行数据淘汰策略。Redis提供6种数据淘汰策略:

  • noeviction 不回收;
  • allkeys-lru 从所有键中删除最近最少使用的键;
  • volatile-lru 从设置了过期时间的键中删除最近最少使用的键;
  • allkeys-random 从所有键中随机删除;
  • volatile-random 从设置了过期时间的键中随机删除;
  • volatile-ttl 从设置了过期时间的键中选择存活时间最短的键删除;
  • 如果我们只是用Redis做数据的缓存我们可以采用allkeys-lru策略。

    三,Redis日常使用建议

    我们即使配置了大内存,配置了回收策略,如果不规范Redis日常操作,那么内存使用依然是个无底洞。关于Redis的使用主要有以下几点建议:

    1.命名规范。命名需要有相应的含义做到有据可查方便后期人工排错和清除数据的判断依据。

    2.使用 HashSet 替代 Key-Value。将业务中某一类的键以 HashSet 的方式存储,以替代普通的 key-value 类型。不仅可以省去为每个键设置前缀以节约内存,也便于统一管理。

    3.注意设置过期时间。对于有时效性的key一定要设置过期时间,避免产生脏数据。

    4.定期清理过期的键值。

    5.做好日常redis的监控工作。


    分享到:


    相關文章: