跳至主要內容

Redis-内存管理

HFwas约 529 字大约 2 分钟

Redis-内存管理

Redis 的内存管理主要从以下两个方面入手:

  • 内存上限
  • 回收策略

内存上限

Redis 提供了 maxmemory 参数来限制最大可用内存,限制的目的有:

  • 用于缓存场景,当超出内存上限时使用 LRU 等删除策略释放空间
  • 防止使用量超过服务器物理内存

更改内存上限:

  • 可以通过命令config set maxmemory进行动态修改最大可用内存

回收策略

Redis 当中可以对所有的键设置过期属性,内部保存在过期字典当中。

内存回收:

  • 惰性删除:用于客户端读取带有超时属性的键时,如果已经超过键的过期时间,会执行删除操作并返回空,
    • 优点有:
      • 可以节省 cpu 成本
      • 不需要单独维护 ttl 链表来处理过期键的删除
    • 缺点:
      • 存在内存泄漏的风险,如果键过期,但是一直没有访问,会导致内存不能及时释放
  • 定时任务删除:Redis 内部维护了一个定时任务,默认每秒运行十次

内存溢出控制策略

当内存使用超过 maxmemory 上限时会触发相应的溢出控制策略

具体的溢出控制策略受 maxmemory-policy 参数控制,Redis 支持6种策略:

  • noevication:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息,此时 Redis 只响应读操作
  • volatile-lru:根据 lru 算法删除设置了超时属性的键,直到腾出空间为止,如果没有可删除的键对象,回退到 noevication
  • allkeys-lru:根据 lru 算法删除键,不管数据有没有设置超时属性,直到腾出空间为止
  • allkeys-random:随机删除所有键,直到腾出空间为止
  • volatile-random:随机删除过期键,直到腾出空间为止
  • volatile-ttl:根据键值对象的ttl属性,删除最近快要过期数据。如果没有,回到到noevication

参考

  • Redis 开发与运维
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3