专栏名称: Java专栏
一个Java、Python、数据库、中间件、业内资讯、面试、学习资源等干货的知识分享社区。
目录
相关文章推荐
51好读  ›  专栏  ›  Java专栏

败家玩意儿!Redis 竟然浪费了这么多内存!

Java专栏  · 公众号  ·  · 2020-12-04 12:20

正文

击上方 Java专栏”,选择“置顶或者星标”


第一时间阅读精彩文章!


点击这段文字获取:5个可以写到简历的项目实战视频教程(含源码)

作者|莱乌


先提前预告下,文末给大家准备了一点小福利!


作为内存数据库,内存空间大小对于 Redis 来说是至关重要的。内存越多,意味着存储的数据也会越多。但是不知道你有没有遇到过这样的情况,明明空间很大,但是内存的使用却不是很理想。


为什么会出现这样的情况呢?这期我们就来看看这个"诡异"的事件。


坐好了,准备发车!


- 思维导图 -




查看内存使用情况


首先想要知道 Redis 内存的使用情况,我们就需要获取相关的信息。


Redis 中查看内存相关信息是很简单的,只需要在命令行输入『info memory』就可以看到各种相关数据。在这里我罗列了一些较为重要的参数:


  • used_memory 已经使用了的内存大小。

  • used_memory_rss redis 物理内存的大小。

  • mem_fragmentation_ratio :内存碎片率。


这里有一个内存碎片率的名词需要关注下,它可以用来表示当前的内存使用情况。


具体计算方式:


对于内存碎片率,一般保持在 1~1.5 之间是最合理的。




什么是内存碎片


了解了内存碎片率,那什么是内存碎片呢?


定义是这样的 :由于一块连续空闲的空间比所要申请的空间小,导致这块空间不可用,对于内存整体来说就是内存碎片。


举个例子:


假设有一块 100MB 的连续空闲内存空间,你每次都会从中申请一块 30MB 的内存。那么当你申请了 3 次后,这块内存就只剩下了 10MB 的空间,第 4 次申请的时候就会失败。如果没有其它的空间释放并且每次申请的空间都比 10MB 大,那么剩下的空间对于整块内存来说就是内存碎片。





内存碎片导致的原因


Redis 中,最常用的是写入、修改、删除数据。这些操作在执行后都会产生 一定程度的内存碎片。


写入数据


Redis 中分配内存是根据固定的大小来划分内存空间的。为了减少分配次数,Redis 会根据申请的内存最接近的固定值分配相应大小的空间。


什么意思呢,假如 Redis 按照 8 字节、16 字节、32 字节、48 字节等来分配内存。当你想要存储一个 18 字节的数据时,此时 Redis 就会分配 32 字节 (因为 32 是与 18 最接近的固定值) 。如果这时候,再写入的数据需要的内存空间在 14 个字节内,那 Redis 就无需再进行分配了。


这就像你有不同的箱子,为了装东西,你需要找一个体积最接近的箱子来装。但是装进去后,你发现还有空间可以放一些小东西,就无需再找箱子了。


但是,这种分配空间的方式会带来一定程度的内存碎片。我们可以把固定大小的划分空间看成不同体积的箱子,每种箱子里的空间不同程度上都会有剩余。这些剩余的空间就是内存碎片。


修改数据


键值对进行修改时,可能会变大也会变小,相应的就会占用额外空间或者释放不用的空间。



如图中所示,当前 A、B、C 分别占用了 3、2、4 个字节,将 A 从 3 字节修改为 2 字节时,此时就会有 1 个字节的空间空了出来,这时就会出现 1 个字节的碎片。








请到「今天看啥」查看全文


推荐文章
CQ现代通信  ·  当SpaceX遇上了业余无线电?
8 年前
开言英语OpenLanguage  ·  本周会员新课&试听
8 年前
乐趣微生活  ·  老婆怀孕了,老公比老婆还能吃【NO7】
7 年前