Redis读书笔记(六)理解内存

首先要了解Redis内存使用的情况:
通过info memory命令获取内存相关指标。
在这里插入图片描述
重点关注的指标有:used_memory_rss 和 used_memory 以及他们的比值mem_fragmentation_ration。

当mem_fragmentation_ration > 1时,说明used_memory_rss-used_memory多出的部分并没有用于数据存储,而是被内存碎片消耗,两者相差很大,说明碎片率严重。

当mem_fragmentation_ration < 1时,这种情况一般出现在操作系统把Redis内存交换到硬盘导致的,这种感觉情况要格外关注。

内存消耗划分
Redis进程消耗的内存主要包括:自身内存+对象内存+缓冲内存+内存碎片。
在这里插入图片描述

对象内存是Redis占用内存最大的一块,存储着所有的用户数据。
缓冲内存主要包括:客户端缓冲,复制积压缓冲区,AOF缓冲区。
客户端缓冲指的是所有接入到Redis服务器的TCP连接的输入缓冲。输入输出缓冲区在大流量的场景容易失控,造成Redis内存不稳定,需要重点监控。
AOF缓冲区用于在Redis重写期间保存最近写入的命令。
Redis默认的内存分配策略采用jemalloc。当存储的数据长短差异较大时,容易出现高内存碎片。

子进程内存消耗
指的是在执行RDB/AOF重写时Redis创建的子进程内存消耗。

Redis使用maxmemory参数限制最大可用内存,限制内存的目的主要有:
1)用于缓存场景,当超出内存上限maxmemory时使用LRU等删除策略释放空间。
2)防止所用内存超过服务器物理内存。

maxmemeory限制的是Redis实际使用的内存,也就是used_memory统计项对应的内存,由于内存碎片的存在,实际消耗的可能会比maxmemoery设置的更大。
比如有一台24GB的内存的服务器,为系统预留4GB内存,预留4GB空闲内存给其他进程或Redis fork进程,这样可以部署4个maxmemory=4GB的Redis进程。

Redis内存回收策略
1)删除到达过期时间的键对象。
惰性删除,当客户端读取带有超时属性的键时,会执行删除并返回空。
定时任务删除,Redis内部维护一个定时任务,默认每秒运行10次。
2)内存使用达到maxmemory上限时触发内存溢出的控制策略。Redis支持6中策略。
默认策略:不会删除任何数据,拒绝写入并返回客户端错误信息。 OOM commmand not allowed when used memory。
volatile-lru:根据LRU算法删除设置了超时属性的键,知道腾出足够的空间。如果没有可删除的键对象,回退到默认属性。
allkeys-lru:根据LRU算法删除,知道腾出足够空间。
allkeys-random:随机删除。
volatile-random:随机删除过期键。
volatile-ttl:根据ttl属性删除最近要过期的数据。如果没有,回退到默认策略。

内存管理
降低Redis内存使用的最直接方式就是缩减键和值的长度。比如value,常见需求是把业务对象序列化成二进制数组放入Redis,java内置的序列化方式不尽如人意,可以选择protostuff,kryo等工具。
Redis内部维护了一个【0-9999】的整数对象池,避免了内存开销。

Redis中的主存节点中的主节点发生故障时,可以用哨兵Redis Sentinel自动完成故障发现和转移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值