2024-05-02  阅读(115)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1513167926

回答

Redis 的 key 是可以设置过期时间的,但是 key 过期后,内存不一定会被立刻释放,主要是 Redis 采取了一种“延迟释放”的策略。针对这种策略, Redis 有两种方案:

  • 惰性删除:当你尝试访问一个 Key 时,Redis 会首先检查这个 Key 是否过期,如果过期则返回 null 并删除它,如果没有过期则返回数据。
  • 定期删除:Redis 每隔一段时间随机抽取一部分过期数据,然后删除这些过期数据。

详解

惰性删除

所谓惰性删除就是指客户端在访问这个 key 的时候,Redis 会对该 key 进行检查,如果过期则立刻删除同时返回 nil,如果没有过期则返回数据。

采用这种策略,可以节约 CPU 成本,因为它不需要单独维护 TTL 表来处理过期 key 的删除。但是这种方式会存在内存泄露的风险。如果某些已过期的 key 一直都没有被访问的话,那么这些 key 就不会被删除了,他们占用的内存也就得不到释放了。

为了解决这个问题,Redis 提供还提供了定期删除来补充。

定期删除

Redis 每隔一段时间(默认100ms)会随机抽取 20 个过期 key,删除 20 个过期 key,如果过期的 key 比率超过 25%,则继续。

除了比例低于 25% 会退出外,还有一种情况会退出这个循环,单次删除任务超过 25ms,增加这个控制主要是为了保证过期扫描不会出现循环过度,导致线程卡死。

使用这种定期删除的方式可以避免一些过期 key 因长期未被访问而导致内存无法释放的问题。

我们思考一个问题,如果有大批量的 key 在同一时间过期,会导致什么问题?会导致定期删除操作很频繁,直到过期字典中的过期 key 比例低于 25%,这个过程会对 Redis 整体性能有一定的影响。

所以,在实际开发过程中,我们是需要分散我们的 key,采取的措施是在 key 的过期时间上面增加一个随机时间。

阅读全文
  • 点赞