第一时间阅读精彩文章!
点击这段文字获取: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 个字节的碎片。