Redis的两种内存清理策略及其描述

Redis的两种内存清理策略及其描述

  • 惰性清理:访问设置了ttl的key前判断此key是否已经过期,如何判断呢,在未过期时的每一次访问都会更新key的时间戳,当前时间减key的时间戳的结果和key的过期时间比较,判断key是否过期

  • 定时清理:Redis定期(默认每100ms)从dict中取20个ttl key(也可能不止20个,大多数情况是≥20个),然后到expire中的ttl key按这20个ttl key,用它们的超时时间做计算以此判定是否已过期。如果过期的总量占从dict中取的ttl key的总量的百分比超过25%(默认值,可配),重复此流程。

    为啥说从dict中取的ttl key大概率不止20个呢,因为redis是以hash+链表的结构存储键值对的,每个hash元素称为一个桶,这个桶下有一串链表,链表的每个节点数据就是键值对,假设第一个桶里有15个ttl key,第二个桶里有10个ttl key,那么是不是将第一个桶里的15个ttl key拿到后再去第二个桶里取5个ttl key就OK了呢?redis作者并没有这样设计,虽然取到第二个桶的一部分ttl key,总量已经满足20个ttl key的条件,但是redis会把第二个桶扫描完,就是说会把第二个桶里的全部10个ttl key全部拿出来,如此拿到的ttl key总量是25个。

    🔔 dict区

    dict区中存所有的当前库的key,包括ttl key和普通key

    ttl key:即设置了过期时间的key

    🔔 expires区

    expires区中仅保存ttl key的key值和过期时间TTL,不保存value值,所以上述流程中key需要拿到expires中作比较是否过期

    ⚠️

    内存清理是清理已经过期的内存数据,并不会伤害未过期和未设置过期时间的数据,这和内存淘汰是最本质的区别。

posted @   勤匠  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示