Redis-内存管理
约 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