Redis内存管理

在这里插入图片描述

Redis使用Jemalloc(默认编译)来进行内存的管理:

Jemalloc将内存分成许多不同的区域,每个区域成为arena,areana之间相互独立。Jemalloc通过创建多个arena来减少线程申请内存的操作冲突。一般arena数量为cpu数量*4.

arena以chunk为单位向操作系统申请空间,默认为2MB。Jemalloc会把chunk分割成多个run。run里面有多个page,其默认大小为4kb。run必须是page的整数倍大小。(mysql的page为16kb大小,页 →区(1MB)→段(256MB))

Jemalloc会将run划分成若干个大小相同的region,并将region分配给应用使用。按大小region分为small、large、huge三类。

Jemalloc使用bin来管理small region,large region直接从chunk中申请,对于huge region,Jemalloc直接向系统申请内存,Jemalloc使用红黑树管理huge region。

Jemalloc在arena分配内存时,需要对arena或者region对应的bin进行加锁(通过划分不同区域,来最小化锁的竞争,这一点在mysql上也很常见,比如mysql的undo表有多个undo段,可以支持数量极多的并发)。为了减少同步,Jemalloc会为每个线程分配一个私有缓存tcache,缓存当前线程已申请的内存块(small/large)。在线程申请内存块时,Jemalloc会优先查找私有缓存空间对应的内存块,避免到arena中申请内存导致线程同步。

用户每次请求的内存大小会被向上对齐最接近的region:
1. 将应用申请的内存大小向上对齐最接近的region
2. 如果申请的是small region或小于私有缓存(tcache)的large region,则尝试先从large region开始分配,分配成功则结束
3. 如果申请的是small region,则从对应的bin找一块合适的run,从run中划分一块region(对bin加锁)
4. 如果申请的是large region,则从对应的chunk中申请相应大小的run并返回(对arena加锁)
5. 如果申请是huge region,直接向下同申请内存,并添加到对应的红黑树进行管理

如果arena中没有可用的chunk了,Jemalloc会向操作系统申请chunk。如果一个chunk的所有内存已经释放,Jemalloc会将chunk归还给系统。

Jemalloc会统计脏页(待回收)的数量,当脏页的数量超过一定的比例,会启动GC清除脏页,并尝试合并相邻的空间,将其返回给系统或者可用区域。Redis的碎片整理机制就是通过Jemalloc来进行的。

Redis数据过期机制

redis有两种机制删除过期数据:定时删除和惰性删除,无论是定时删除还是惰性删除,都需将命令传播给AOF文件和从节点。

  1. 定时删除
    1. 遍历指定数量的数据库
    2. 获取数据库,记录当前正处理的的数据库
    3. 处理该数据库中的过期字典
    4. 执行一次删除采样操作,通过采样数据量中已过期健的比例,预估整个数据库中的过期健比例
    5. 计算待处理的Hash表数组索引,按顺序处理
    6. 检查索引上所有的健,删除过期健,每次检查一个健,采样健加一
    7. 没执行16次采样操作删除动作,就检查处理时间是否超出限制
    8. 根据采样结果统计已过期健所占比例,若小于配置,则不再处理
  2. 惰性删除
    1. 获取当前内存使用量并判断是否需要淘汰数据
    2. 处理LRU、LFU算法
    3. 从给定的数据集(数据字典或过期字典)采集样本填充到样本池。样本池中的数据按淘汰优先级排序,越优先淘汰的数据放到最后。
    4. 从样本池中获取淘汰优先级最高的数据作为待淘汰健
    5. 如果使用的是随机淘汰算法,则从指定的数据集里随机选择一个健作为淘汰健
    6. 删除前面选择的淘汰健
  • 32
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑笑布丁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值