Redis内存

内存消耗

  1. Redis里面内存统计指标

    属性名 属性说明
    used_memory Redis分配器分配的内存总量,也就是内部存储的所有数据的内存占用量
    used_memory_human used_memory的可读形式
    used_memory 操作系统角度显示Redis进程占用的内存总量
    used_memory_peak 内存使用的最大值,表示used_memory的峰值
    used_memory_peak_human 以可读的形式表示used_memory_peak
    used_memory_lua Lua引擎消耗的内存
    mem_fragmentation_ratio used_memory_rss/used_memory比值,表示内存碎片率
    mem_allocator Redis使用的内存分配器。默认为jemalloc

    mem_fragmentation_ratio>1表示有部分内存没有存储数据,而是被内存碎片所消耗,值越大,表示内存碎片化越严重。
    mem_fragmentation_ratio<1一般出现在操作系统把Redis内存交换到硬盘导致,这个时候Redis性能会很差。

  2. 内存组成
    Redis内存包括四个部分

    • 自身内存
    • 对象内存 对象内存包括sizeof(key)+sizeof(value)注意应该避免使用过长的key
    • 缓冲内存 包括客户端缓冲区、复制积压缓冲区以及AOF缓冲区。
    • 内存碎片 在下列场景下容易出现高内存碎片问题。
      • 频繁地做更新操作。例如频繁的对已存在的key执行appendsetrange等操作。
      • 大量过期的key被删除。key对象过期删除后,释放的空间无法得到充分的利用,导致碎片率上升。 出现高内存碎片率问题是常见的解决方法有:
      • 数据对齐。在条件允许的情况下尽量做到数据对齐,比如数据尽量采用数字型或者固定长度字符串等。
      • 安全重启。
  3. 子进程内存消耗
    Redis在进行RDB或者AOF的时候会从fork出一个子进程。Linux采用Copy On Write技术,新fork出的子进程与父进程共享一块内存空间,当有其中一个需要对共享内存作出修改的时候会对需要修改的内存页复制出一份副本完成写操作。
    如果Linux开启了Transparent Huge Page(THP)技术,有可能会加重内存拷贝量,从而造成过度内存的消耗。
    建议关闭THP功能。

内存管理

  1. 设置内存上限
    Redis使用maxmemory参数来限制最大可用内存。
    可以使用下面的命令设置内存上限。

    config set maxmemory 2GB
    
  2. 内存回收策略
    Redis的内存回收机制主要体现在下面两个方面:

    • 删除到达过期时间的key对象。

      惰性删除

      惰性删除用于客户端读取带有超市属性的key的时候。如果已经超过key设置的过期时间,会执行删除操作并返回空。

      定时任务删除

      Redis内部维持一个定时任务,每10s跑一次。定时任务中删除过期key采用自适应算法,根据key的过期比例、使用快吗两种速率模式回收。流程图为:

      流程说明:

      1. 定时任务在每个数据库空间随机检查20个key,当发现过期时删除对应的key.
      2. 如果超过检查数25%的key过期,循环执行回收逻辑知道不足25%或运行超时为止。慢模式下超时时间为25ms 。
      3. 如果之前回收逻辑超时,则在Redis触发内部事件之前以快模式运行和回收过期key任务。快模式下超时时间为1毫秒且2秒内只能运行一次。
      4. 快慢两种模式内部删除逻辑相同,只是执行超时时间不同。

    内存溢出控制策略

    内存使用到达maxmemory上限时触发内存溢出控制策略。
    Redis内部支持一下6种溢出控制策略。
    1. noeviction:默认策略,不会删除任何数据,拒绝所有写入操作操作并返回客户端错误信息,此时Redis只响应读操作。
    2. volatile-lru:根据LRU算法删除设置了超时时间属性的key,知道腾出足够空间为止。如果没有任何可删除的key对象,则会退到noeviction策略。
    3. allkeys-lru:根据LRU算法删除key,不管数据有没有设置超时属性,知道腾出足够的空间为止。
    4. allkeys-random:随机删除所有key,直到腾出了足够的空间为止。
    5. volatile-random:随机删除过期key,直到腾出了足够的空间为止。
    6. volatile-ttl:根据key对象的ttl属性,删除最近将要过期数据。如果没有,则回退到noeviction策略。

2017-05-16 23:4773