Redis的内存淘汰机制

专题文章 云天 10个月前 (09-15) 609次浏览 0个评论

Redis的内存淘汰机制

Redis是一种基于内存的键值对数据库,当Redis内存用量达到上限时,如果不清理,会导致Redis不能提供服务。

Redis内部提供了三种内存清理策略,用来处理此场景。

  1. 定时清理:即在Redis创建一个定时器,定时清理内存中失效的键。在进行定时清理时,如果一次性清理所有失效的键,会导致长时间的cpu占用,影响Redis工作效率,所以定时器清理时每次只会获取内存中的一部分键值对进行清理,但是这种清理机制也会导致失效的键不能及时被清理。Redis定时清理具体规则如下:每次定时任务启动时,先从内存中拿20个键,判断其中失效键的占比,如果没有超过25%,则在清理已失效键值之后,接触任务,如果失效键占比超过25%,则继续从内存中获取20个键值对,继续进行失效键占比和清理工作,同时,如果本次任务执行时间超过25ms,即使失效键占比超过25%,为了不影响Redis正常服务,也会结束本次清理任务。
  2. 懒惰清理:是指在键失效后,不立刻清理,而是在该键值对被访问到的时候才清理。懒惰清理会带来一个问题,就是那些不经常被访问到的数据,会一直积累在内存中,不被清理,如果长时间不清理,会导致内存泄漏。
  3. 内存清理机制:除了以上两种清理策略之外,Redis还提供了一种基于不同算法的内存清理策略,共提供了8种不同的策略
    • noeviction:该策略下,不进行内存清理,适用于需要保证Redis中所有数据都要落库的情况。
    • allkeys-random:指对于Redis中所有的键,随机进行清理,适用于不需要关注缓存优先性的情况。
    • allkeys-lru:指对于Redis中所有的键,基于最近访问时间,优先清理长时间未被访问的键。适用于例如电商网站,我们会希望保留近期总被访问的数据以提高数据库访问效率。
    • allkeys-lfu:指对于Redis中所有的键,基于访问频率,优先清理访问频次较低的键。适用于例如社交网站,点击频次较多的内容,说明数据访问的多,此类数据不应该被优先清理。
    • volatile-random:用于对Redis中设定了过期时间的键进行随机清理。
    • volatile-lru:用于对Redis中设定了过期时间的键基于最近访问时间进行清理,长时间未被访问的优先清理。
    • volatile-lfu:用于对Redis中设定了过期时间的键基于访问频次进行清理,低频访问的键将被优先清理。
    • volatile-ttl:用于对Redis中设定了过期时间的键中,距离过期时间最近的键优先清理,适用于保持会话的场景

Redis提供了以上3种清理策略和8中清理机制,对Redis内存进行清理,每种清理策略都有合适的使用场景,具体生产上一般使用定时清理+懒惰清理的方式,另外使用8种内存清理机制中的某种作为兜底策略。

喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址