玩转Redis-删除了两百万key,为什么内存依旧未释放?

本文探讨了Redis中删除大量key后内存未释放的原因,主要涉及Redis内存碎片和释放机制。文章介绍了如何查看Redis内存数据,分析了内存为何不释放,包括内存碎片的形成和内存分配器的作用。并提供了释放内存的策略,如重启Redis、使用备用实例迁移和手动/自动碎片整理。最后,提到了生产环境清理内存碎片的注意事项。
摘要由CSDN通过智能技术生成

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【12】篇,最新系列文章请前往公众号“zxiaofan”(点我点我)查看,或百度搜索“玩转Redis zxiaofan”即可。

往期精选:《玩转Redis-Redis中布隆过滤器的使用及原理》

本文关键字:玩转Redis、Redis内存碎片、Redis内存释放;

大纲

  • 背景
  • 如何查看Redis内存数据
  • 内存为何不释放
    • 什么是内存碎片
    • Redis的内存碎片是如何形成的
  • 如何释放内存
  • 生产环境整理内存碎片的注意事项

1、背景

  公司某业务使用的Redis集群是自建的,前段时间计划将自建Redis集群迁移到购买的阿里云集群。
  老集群共有 350W key,占用内存 8.8 G,DTS迁移前分析发现有近两百万的key无需迁移,于是提前删除了这两百万key。
  删除key后发现redis内存竟然几乎无变化,350W key删除了两百万,怎么也得释放几G内存吧。难道删除失败了?通过比对数据发现,计划被删除的数据确实已经删除了。
  为什么删除了两百万key,内存未释放呢?这个问题一直困扰着我,通过查阅资料终于弄明白了。

2、如何查看Redis内存数据

2.1、info memory

  进入Redis命令行界面后,使用 info memory 命令(集群使用 cluster info 命令) 即可查看当前Redis相关内存信息,部分信息展示如下:

127.0.0.1:6379> info memory
# Memory

# Redis 保存数据申请的内存空间
used_memory:9469412118
used_memory_human:8.82G

# 操作系统分配给 Redis 进程的内存空间
used_memory_rss:11351138316
used_memory_rss_human:10.57G

# Redis 进程在运行过程中占用的内存峰值
used_memory_peak:12618222522
used_memory_peak_human:11.75G

# 内存碎片率,used_memory_rss / used_memory
mem_fragmentation_ratio:1.20

# Redis 最大可用内存,0表示不限制
maxmemory:0
maxmemory_human:0B

# 内存分配器
mem_allocator:jemalloc-5.1.0

我们来解释下每个属性的含义:

used_memory:Redis 保存数据申请的内存空间,包含Redis进程及数据占用内存,单位 Byte;

used_memory_rss:操作系统分配给 Redis 进程的内存空间(包含内存碎片占用的空间),是从操作系统角度看的数据;此数据结果约等于top、ps命令看到的数据结果。

used_memory_peak:Redis 进程在运行过程中占用的内存峰值,used_memory_peak >= used_memory;

maxmemory:Redis 最大可用内存,0表示不限制。可以方便的实现对一台服务器部署多个Redis进程的内存控制;防止所用内存超过服务器物理内存;便于数据超出内存限制时执行LRU等删除策略。

XXX_human:表示以可读的方式返回XXX。

mem_fragmentation_ratio:内存碎片率,used_memory_rss / used_memory。大于1的部分为redis碎片占用的大小,建议值 大于 1 但小于 1.5,大于1.5说明碎片过多需要清理了。

  需要注意的是,通常情况下 used_memory_rss 是大于 used_memory 的;但也有例外,当used_memory_rss 小于 used_memory 时,说明 操作系统分配给Redis进程的数据,不足以满足实际存储数据的需求,此时Redis部分内存数据会转换到Swap中,随之引发的问题是,当Redis访问Swap中的数据时,性能会下降

2.2、memory xxx 指令

2.2.1、memory doctor

  列出 Redis 服务器遇到的不同类型的内存相关问题,并提供相应的解决建议

127.0.0.1:6379> memory doctor
Hi Sam, I can't find any memory issue in your instance. I can only account for what occurs on this base.

2.2.2、memory malloc-stats

  提供内存分配情况的内部统计报表,(目前只支持jemalloc内存分配器)。通过该命令可以看出jemalloc对于所有对象进行分配时,各具体分区的内存详细状况。
  memory malloc-stats 命令返回信息较多,此处暂不做详细分析,感兴趣的同学可以自行执行命令分析。

2.2.3、memory purge

  手动整理内存碎片,会阻塞主进程。

127.0.0.1:6379> memory purge
OK

2.2.4、memory stats

  以数组形式返回服务器的内存使用情况;

127.0.0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值