admin管理员组

文章数量:1655334

  《玩转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

本文标签: 玩转内存RedisKey