《Redis开发与运维》学习第八章

第八章 理解内存


Redis的所有数据都是保存在内存中的,因此了解内存至关重要!
我们需要了解Redis内存消耗在哪里?如何管理内存?最后考虑如何优化内存?


8.1 内存消耗
内存消耗可以分为:进程自身消耗和子进程消耗

8.1.1 内存使用统计
执行命令 info memory获取内存相关指标
需要重点关注的指标有:

used_memory_rss
used_memory
mem_fragmentation_ratio

mem_fragmentation_ratio>1时,说明used_memory_rss - used_memory多出的部分内存没有用于数据存储,而是被内存碎片所消耗,如果二者差距较大,说明碎片化严重。
mem_fragmentation_ratio<1时,这种情况主要出现在操作系统把Redis内存交换到硬盘所致,这种情况下,由于硬盘速度远远慢于内存,Redis的性能会变得很差,甚至僵死。

8.1.2 内存消耗划分
1 对象内存
Redis内存占用最大的一部分,存储着用户所有的信息。
2 缓冲内存
主要包括:客户端缓冲 复制积压缓冲区 AOF缓冲区
3 内存碎片

8.1.3 子进程内存消耗

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


8.2 内存管理

Redis主要通过控制内存上限和回收策略实现内存管理。

8.2.1 设置内存上限
使用maxmemory参数限制最大可用内存
8.2.2 动态调整内存上限
通过config set maxmemory 动态修改

Redis-1>config set maxmemory 6GB
Redis-2>config set maxmemory 2GB
在这里插入代码片

8.2.3 内存回收策略
指:
删除到达过期时间的键对象
内存使用达到maxmemory上限时触发内存溢出控制策略

1 删除过期键对象
惰性删除
定时任务删除:自适应算法
2 内存溢出控制策略


8.3 内存优化
深入理解Redis的一些细节:

8.3.1 redisObject对象
在这里插入图片描述在这里插入图片描述在这里插入图片描述


8.3.3 共享对象池

共享对象池指Redis内部维护一个[0-9999]的整数对象池,用于节约内存。

对比发现:使用整数对象池之后,内存使用降低30%以上。

在使用共享对象池应注意:
1.共享内存池和maxmemory_LRU策略冲突。

2.一个问题:为什么Redis只保留整数对象池?

  1. 整数对象池复用的几率最大
    2)对象共享时一个关键操作是判断相等性,而整数比较算法的时间复杂度为O(1)最低。

8.3.4 字符串优化
字符串对象是Redis内部最常用的数据类型,因此了解字符串的细节对节约内存十分重要。
1 字符串结构
在这里插入图片描述

2 预分配机制

3 字符串重构
在这里插入图片描述


8.3.5 编码优化 需要时详细查看课本
1 了解编码
2 控制编码类型
3 ziplist编码
4 intset编码


8.3.6 控制键的数量 需要时详细查看

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.liang呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值