一 内存消耗

1.1 内存使用统计

used_memory: Redis分配的内存总量,即存储的所有数据占用的内存

used_memory_human: 以可读格式返回使用的内存量

used_memory_rss:从系统角度,显示Redis进程占用的物理内存总量

used_memory_rss_human:以可读格式返回Redis进程占用的物理内存总量

used_memory_peak:内存使用的最大值,表示used_memory峰值

used_memory_peak_human:以可读格式返回内存使用的最大值

total_system_memory:系统总内存

total_system_memory_human:以可读格式返回系统总内存

used_memory_lua:Lua进程使用内存

used_memory_lua_human:以可读格式返回Lua进程使用内存

mem_fragmentation_ratio:内存碎片率,等价于(used_memory_rss /used_memory)

mem_allocator:redis使用的内存分配器

重点关注used_memory以及used_memory_rss和碎片率mem_fragmentation_ratio

mem_fragmentation_ratio > 1: used_memory_rss -used_memory 多出部分没有存储数据,而是被内存碎片消耗了,如果差的很大,说明碎片很严重

mem_fragmentation_ratio < 1: 一般出现在操作系统把Redis内存交换到硬盘导致。

1.2 内存消耗划分

Redis进程内的内存主要包括:

自身内存 + 对象内存 + 缓冲内存+ 内存碎片,其中Redis自身内存消耗的很少,通常used_memory_rss在3MB左右,used_memory在800k左右。

1.2.1 对象内存

对象内存是Redis中最占内存的一块,存储着用户所有数据。Redis所有数据都采用key-value,每次你创建key-value,都是创建2个对象,即key对象和value对象,即 key的size + value的size. Key对象都是字符串,我们应当避免使用过长的key. Value对象根据使用情况不同占用内存也不尽相同,注意监控。

1.2.2 缓冲内存

缓冲内存涉及到客户端缓冲区,复制积压缓冲区和AOF缓冲区

客户端缓冲:指的是所有连接到Redis的服务器tcp连接输入输出缓冲,输入缓冲无法控制,最大空间1G;输出缓冲可通过client-output-buffer-limit控制。

# 普通客户端:client-output-buffer-limit normal 0 0 0

普通客户端默认并没有对输出缓冲区做限制。但是如果当有大量的慢连接客户端接入时,这部分消耗就不能忽略了,因为消费的很慢,在成输出缓冲区数据积压。所以可以设置maxclients做限制。

# 从客户端:client-output-buffer-limit slave 256mb 64mb 60

主节点会每一个从节点单独建立一条连接用于命令复制。当主节点网络延迟较高或主节点挂载大量的从节点时,这部分内存消耗将占用很大一部分,建议主节点挂载从节点最好不要超过2个。

# 订阅客户端:client-output-buffer-limit pubsub 32mb 8mb 60 当生产消息的速度快于消费的速度时,输出缓冲区容易积压消息

复制积压缓冲区:一个可重用的固定大小缓冲区用于实现部分复制功能,根据repl-backlog-size参数控制,默认1MB. 对于复制积压缓区,主节点有一个,所有从节点啊共享这个缓冲区,因此可以设置较大的值,比如100MB,这部分投入是有价值的,可以有效避免全量复制。

AOF缓冲区:用于AOF重写期间保存最近写入的命令,等待被刷到磁盘

1.2.3 内存碎片

Redis默认的内存分配器是jemalloc,内存分配器的作用就是为了更好的管理和重复利用内存。但是当存储的数据长短差异较大的时候,以下场景容易出现高内存碎片问题:

# 频繁更新,对已经存在的key进行append setrange操作

# 大量过期键删除,键对象过期删除后,释放的 空间无法得到拆分利用

解决办法:

# 尽量数据对齐,视业务情况而定

# 安全重启:重启可以做到内存碎片重新整理

1.3 子进程内存消耗

子进程内存主要是指AOF/RDB重写时Redis创建的子进程内存消耗。Redis执行fork操作产生子进程内存占用对外表现为与父进程相同,理论上需要一倍的相同物理内存来完成重写操作。但是Linux的copy-on-write机制使得父子进程共享相同的物理内存页,当父进程处理写请求时会对需要修改的页复制出一份副本完成写操作,而子进程依旧读取fork时整个父进程内存快照。

# Redis子进程并不需要消耗1倍 的父进程内存,但是依然要预留一些内存防止内存溢出

# 需要设置sysctl vm.overcommit_memory=1允许内核可以分配所有的物理内存,防止Redis进程执行fork时因系统剩余内存不足而失败。

# 排查当前系统是否支持并开启THP,如果开启,建议关闭。

二 内存管理

2.1 设置内存上限

Redis通过maxmemory参数限制最大可用内存。限制内存目的主要有:

# 用于缓存场景,当超出内存上限maxmemory时候使用LRU等删除策略释放空间

# 防止所用内存超过服务器物理内存

需要注意的是,maxmeory限制的是Redis实际使用的内存量,也就是used_memory统计项对应的内存。通过设置上限,可以方便实现一台服务器部署多个Redis进程的内存控制。比如一台32G的内存的服务器,预留4GB内存给系统,预留4GB给Redis fork进程,留给Redis24GB内存,这样就可以部署3个maxmemory=8GB的redis进程。

2.2 动态调整内存上限

可以通过命令config set maxmemory8GB

2.3 内存回收策略

内存回收机制主要体现在以下两个方面:

2.3.1删除过期的key

Redis采用惰性删除和定时任务删除机制实现过期key的内存回收

# 惰性删除

用于当客户端读取带有超时属性的key的时候,如果已经超过设置的过期时间,会执行删除操作并返回空。但是有一个问题,当过期键一直没有访问将无法得到及时删除,从而导致内存 不能及时释放

# 定时任务删除

Redis内部维护一个定时任务,默认每秒运行10次,通过配置hz属性控制。

2.3.2 内存使用达到maxmeory上限时触发内存溢出的控制策略

当Redis所用内存达到maxmeory上限时,会触发相应的溢出控制策略。具体策略受maxmeory-policy参数控制,Redis支持6种策略:

# volatile-lru -> 根据LRU算法删除设置了超时属性的键,直到腾出足够空间为止

# allkeys-lru -> 根据LRU算法删除键,不管有没有设置超时属性,直到腾出足够空间为止

# volatile-random -> 随即删除过期键,直到腾出足够空间为止

# allkeys-random -> 随即删除所有键,直到腾出足够空间为止

# volatile-ttl -> 根据ttl属性,删除最近将要过期的数据,如果没有回退到noeviction策略

# noeviction -> 不会删除任何数据,拒绝所有写入操作,并返回错误信息,此时只是响应读

三 内存优化

3.1 redisObject对象

3.2 缩减键值对象

降低Redis内存使用最直接的方式就是缩减key和value的长度

# key的设计:越短越好,如user:{userid}:friends:notify:{fid},可以简化为u:{uid}:fs:nt:{fid}

# value: 值对象缩减比较复杂,常见的需求是把业务对象序列化放入Redis。

3.3 共享对象池

3.4 字符串优化

3.5 编码优化

3.6 控制键的数量

比如通过hash数据结构就可以减少key的数量,从而减少了RTT的时间,还可以减少key,这样也节约了内存

Redis之内存分析相关推荐

  1. redis的内存分析

    RDR 简介 RDR 是解析 redis rdbfile 工具.与redis-rdb-tools相比,RDR 是由golang 实现的,速度更快(5GB rdbfile 在我的PC上大约需要2分钟). ...

  2. golang 编写的在线redis 内存分析工具 rma4go

    redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...

  3. redis 内存分析工具 `rma4go`

    redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...

  4. 一个golang编写的redis内存分析工具rma4go

    redis 内存分析工具 rma4go 简介 redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个red ...

  5. 有了这篇你还说你不会redis性能优化、内存分析及优化

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源: https://bl ...

  6. Redis内存分析工具

    2019独角兽企业重金招聘Python工程师标准>>> RdbTools是一个由于分析Redis dump.rdb文件的工具,有以下功能: 生成所有数据库和key的内存分析报告 把d ...

  7. 内存分析_Redis内存爆炸增长?你需要知道这一套Redis内存分析方法

    Redis Redis介绍 NoSQL Redis是当前比较热门的NOSQL数据库之一,和Memcache一样,数据都是缓存在计算机内存中.完全开源免费,遵守BSD协议,是一个高性能的key-valu ...

  8. redis内存分析工具rdbtools

    当Redis的内存已经快满的时候,我们能做什么呢? 最直接的方法就是分析一下Redis内存的构成,看是哪些键比较大,或者比较多,然后考虑一下对应的功能能不能优化,例如减少超时时间,例如不必要的数据不用 ...

  9. redis 键值占用内存分析 RDR(Redis Data Reveal)

    简单描述一下我这边的情况,这边参与的一个项目使用的是docker 项目,然后呢项目中有个业务需要将大量数据存在内存里或者缓存里,然后呢最近数据量上来之后,redis 内存占用过大,所以需要一个工具来分 ...

最新文章

  1. mysql物理文件组成
  2. HTML URL 统一资源定位器
  3. iis设置服务器文件权限设置,iis7如何配置写入权限以上传文件---急急急
  4. java设计是什么软件下载_用Java设计下载软件
  5. 2020年Deribit成交量达2110亿美元 同比增长82%
  6. 详解Angular开发中的登陆与身份验证
  7. 集成稳压电源的分类及特性
  8. mumu模拟器Android版本才6,MuMu模拟器官方下载
  9. Android 获取手机分辨率
  10. 咸鱼Maya笔记—Maya 平滑多边形
  11. 路由器与交换机的基本工作原理
  12. 知道打印机的IP地址,win10怎样连接打印机?
  13. WEB前端面试2014阿里旺旺
  14. 【散文】 如果今生我是你梦中的蝴蝶
  15. 学术研究入门,如何下载论文?
  16. 微软CEO萨提亚·纳德拉:强化技术密集度,加速转向新经济
  17. 微服务网关搭建(podman+kong+konga)
  18. LitePal 数据库基本操作
  19. CCF CSP认证 难度及经历
  20. TypeScript 类型声明书写踩坑全解析

热门文章

  1. 统计词语出现次数python_Python实战教程:如何统计序列中元素的出现频度
  2. Onedark风格配色方案
  3. ARM汇编加载/存储指令
  4. VS2010安装MSDN Library
  5. mysql静默安装_oracle静默安装文件db_install.rsp详解
  6. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务使用Hystrix熔断器
  7. java中attribute用法_Java FieldPosition getFieldAttribute()用法及代码示例
  8. Linux终端嵌套桌面里,linux下终端分屏使用的两种方法(screen和tmux)
  9. Mac typora自定义编辑界面的配置
  10. Networdx小案例学习