Redis 内存碎片原因及清理

 更新时间:2024年06月28日 10:32:29   作者:_江屿_  
内存碎片是指在内存分配的时候,产生的不能重复利用的空间,本文主要介绍了Redis 内存碎片原因及清理,具有一定的参考价值,感兴趣的可以了解一下

一、Redis 内存碎片

内存碎片是指在内存分配的时候,产生的不能重复利用的空间。例如,内存空间还有3K,应用程序想申请连续的3K空间,虽然内存空间够,但是空间分配为2K,1K,总空间够,但是不连续,导致应用程序申请失败,这种无法利用的内存空间称之为"内存碎片"。内存分片会占用操作系统分配给redis的内存空间,严重影响redis性能。

二、内存碎片形成原因

1.内因
内存分片策略引发:redis默认使用jemalloc分配器分配内存。jemalloc每次分配2*N固定空间,例如写入数据申请10K空间,jemalloc会分配16K空间,优点:下次写入>=6K数据不需要申请内存空间,缺点造成内存浪费。

2.外因
修改内存中数据:修改包括增加和减少内存占用,例如原来的16K空间数据,增加或减少1K都会造成内存浪费。大量内存碎片的存在,会造成redis实际内存使用率降低,影响性能。

三、查看内存碎片

info memory 查看redis内存使用情况,主要关注以下参数

used_memory:                 redis分配的内存总量单位为b
used_memory_human:      redis分配的内存总量单位为M
used_memory_rss:           redis向操作系统申请的内存总量单位为b
used_memory_rss_human: redis向操作系统申请的内存总量单位为M
mem_fragmentation_ratio:     内存碎片率
mem_allocator:jemalloc-5.1.0 内存分配器

mem_fragmentation_ratio计算公式为:used_memory_rss/used_memory 该值大于1但小于1.5。这种情况是合理的。该值过高时考虑清理内存,例如该值大于1.5表示有50%空间浪费,需要清理内存碎片。

四、内存碎片清理

内存碎片清理,就是将不连续的内存空间重新整理为连续空间,由于redis是单线程,在清理过程中会造成堵塞,降低性能。可通过以下三种方式清理:

1.手动清理内存碎片

memory purge 只支持jemalloc内存分配器

2.自动清理

修改redis.conf配置文件

activedefrag yes 开启自动清理内存碎片,命令开启:config set activedefrag yes
active-defrag-ignore-bytes 100mb 内存碎片的字节数达到100M时开始清理
active-defrag-threshold-lower 10 内存碎片空间占操作系统分配给redis的总空间比例达到 10% 时开始清理
active-defrag-ignore-bytes与active-defrag-threshold-lower 两个条件同时满足会触发内存碎片清理,当有一个不满足则停止清理
active-defrag-threshold-upper 100 内存碎片超过 100%,则尽最大努力整理
active-defrag-cycle-min 1 自动清理过程所用CPU时间的比例不低于1%,保证能正常清理
active-defrag-cycle-max 25 自动清理过程所用CPU时间的比例不高于25%,超过25%停止清理,避免redis主线程阻塞
active-defrag-max-scan-fields 1000 自动清理过程中长度小于1000的set/hash/zset/list才会进行自动清理

----以上参数默认注释----

3.重启redis

到此这篇关于Redis 内存碎片原因及清理的文章就介绍到这了,更多相关Redis 内存碎片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈redis的maxmemory设置以及淘汰策略

    浅谈redis的maxmemory设置以及淘汰策略

    下面小编就为大家带来一篇浅谈redis的maxmemory设置以及淘汰策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Redis有序集合类型的操作_动力节点Java学院整理

    Redis有序集合类型的操作_动力节点Java学院整理

    今天通过本文给大家说一下Redis中最后一个数据类型 “有序集合类型”,需要的的朋友参考下吧
    2017-08-08
  • 使用Redis实现实时排行榜的示例

    使用Redis实现实时排行榜的示例

    为了实现一个实时排行榜系统,我们可以使用Redis的有序集合,本文主要介绍了使用Redis实现实时排行榜的示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 基于redis实现定时任务的方法详解

    基于redis实现定时任务的方法详解

    这篇文章主要给大家介绍了基于redis实现定时任务的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 一起raid数据恢复及回迁成功的案例

    一起raid数据恢复及回迁成功的案例

    这篇文章主要介绍了一起raid数据恢复及回迁成功的案例,需要的朋友可以参考下
    2017-04-04
  • Redis实现分布式锁的实例讲解

    Redis实现分布式锁的实例讲解

    在本篇文章里小编给大家整理了一篇关于Redis实现分布式锁的实例讲解内容,有兴趣的朋友们可以学习参考下。
    2021-12-12
  • Redis缓存更新策略详解

    Redis缓存更新策略详解

    本文介绍了4种核心缓存更新策略(Cache-Aside、Write-Through、Write-Behind、Refresh-Ahead),并讨论了3种补充策略(Read-Through、最终一致性、过期淘汰),感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • Redis中的String类型及使用Redis解决订单秒杀超卖问题

    Redis中的String类型及使用Redis解决订单秒杀超卖问题

    这篇文章主要介绍了Redis中的String类型及使用Redis解决订单秒杀超卖问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • RedisDesktopManager 连接redis的方法

    RedisDesktopManager 连接redis的方法

    这篇文章主要介绍了RedisDesktopManager 连接redis,需要的朋友可以参考下
    2023-08-08
  • 从原理到实践分析 Redis 分布式锁的多种实现方案

    从原理到实践分析 Redis 分布式锁的多种实现方案

    在分布式系统中,为了保证多个进程或线程之间的数据一致性和正确性,需要使用锁来实现互斥访问共享资源,然而,使用本地锁在分布式系统中存在问题,这篇文章主要介绍了从原理到实践分析 Redis 分布式锁的多种实现方案,需要的朋友可以参考下
    2024-07-07

最新评论