Redis理解内存《Redis开发与运维读书笔记》

文章目录

    • 内存的消耗
      • 内存划分
      • 内存管理
      • 内存优化

内存的消耗

可以使用info memory 查看内存消耗。

内存划分

  • 对象内存 = sizeof(key) + sizeof(value) 应避免使用过长的key
  • 缓冲内存
    * Redis自身内存:消耗比较小可忽略不计
    * 客户端缓存:所有接入Reids服务器的TCP连接的输入输出缓存
    * 复制积压缓存区:可以有效避免全两复制
    * AOF缓存:用户Redis重写期间保存最近的写入命令
    * 内存碎片: 这里是重点需要注意的
    * 子进程内存消耗:AOF/RDB重写时Redis创建的子进程消耗的内存。

内存管理

Redis主要通过设置内存上限和回收策略实现内存管理

  • 设置内存上限
    1)当内存超过上限时会通过LRU等策略释放空间
    2)防止所有内存超过服务器的物理内存

  • 回收策略
    1)删除过期键对象
    * 惰性删除:客户端读取对象时发现过期了才删除。
    * 定时任务删除:
    Redis自己维护的定时任务,默认每秒运行10次。从每个数据库随机检查20个键如果超过25%的键过期了则循环执行回收逻辑直到不足25%或者运行超时为止
    2)内存溢出的控制策略

    策略 说明
    noeviction 默认策略,拒绝写入单不删除,只响应读操作
    volatitle-LRU 根据LRU算法删除过期的键,直到腾出足够空间,如果没有可删除的键则会退到默认策略
    allkeys-LRU 根据LRU算法删除键,不管是否超时,直到腾出足够空间
    allkeys-random 随机删除所有键,直到腾出足够空间为止
    volatitle-random 随机删除过期键,直到腾出足够空间
    volatitle-ttl 根据键对象的TTL,删除最近要过期的键。如果没有可删除的键则会退到默认策略

    Redis4之后支持的内存策略
    |volatile-LFU|根据LFU算法来淘汰过期键。 |
    |allkeys-LFU| 根据LFU算法删除键,不管是否超时,直到腾出足够空间 |

  • LRU 算法:
    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
    实现 LRU 算法除了需要 key/value 字典外,还需要附加一个链表,链表中的元素按照一定的顺序进行排列。当空间满的时候,会踢掉链表尾部的元素。当字典的某个元素被访问时,它在链表中的位置会被移动到表头。所以链表的元素排列顺序就是元素最近被访问的时间顺序。位于链表尾部的元素就是不被重用的元素,所以会被踢掉。位于表头的元素就是最近刚刚被人用过的元素,所以暂时不会被踢。

  • LFU算法
    LFU 的全称是Least Frequently Used,表示按最近的访问频率进行淘汰,它比 LRU 更加精准地表示了一个 key 被访问的热度

内存优化

  • 精简键值对的大小
  • 使用高效二进制序列化工具
  • 使用对象共享池(0-9999的对象池)优化小整数对象
  • 数据优先使用整数,比字符串省空间
  • 根据不同数据类型的内部编码优化内存

https://cachecloud.github.io/2017/02/16/Redis%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96/

你可能感兴趣的:(redis)