redis的string为何内存消耗大

举报
芥末拌个饭吧 发表于 2022/11/11 17:33:00 2022/11/11
1.4k+ 0 0
【摘要】 说到redis的数据类型,常用的有string、list、set等。在我们使用string类型时,如果你注意过,会发现string类型有个明显的缺点:string的数据保存占用的空间较多。接下来就来了解下string为何占用那么多内存吧。

前言

说到redis的数据类型,常用的有string、list、set等。在我们使用string类型时,如果你注意过,会发现string类型有个明显的缺点:string的数据保存占用的空间较多。接下来就来了解下string为何占用那么多内存吧。

Redis string的数据结构

要知道string为何占用那么多内存,首先我们得清楚Redis的存储原理。先来个结论:string除了要记录我们写入的数据外,还需要记录数据长度、空间使用量等信息(元数据),记录这些都要消耗额外空间。当我们用string存储很小的数据时,元数据的开销对比起来就显得很大了。

来看看string的数据结构,如下图:

 除了上图的开销,还要考虑到RedisObject结构体的开销。RedisObject包含了8字节的元数据和一个指向具体数据类型的实际数据的8字节指针。

最后,Redis还有一个全局哈希表保存所有键值对。哈希表的每一个数据都记录了键值对的信息,分别记录key、value和下个数据的指针,每个占用8字节,总共24字节。

由此可见,string类型除了要保存实际数据外,还要记录元数据、redisObject结构体以及全局哈希表的数据。如果实际数据很小,用string的性价比就很低了。

用什么数据类型更省空间

既然string占用的内存空间很多,那什么数据类型可以作为替代项呢?压缩列表是一个好的选择。

压缩列表的数据结构如下图:

prev_len表示前一个数据的长度,len表示自身长度(4字节),encoding表示编码方式(1字节),content用来保存实际数据。 这些数据会放置在连续的内存空间,不用额外指针指向,因此比较省空间。Redis的list、hash、sorted set底层数据结构都用到了压缩列表。我们可以考虑用这些数据类型去存储数据。

小结

redis的string在内存消耗方面没有优势,如果你有大量的数据首先想到的是string来存储,那么得好好考量一下这样做预计会产生的内存消耗,以及使用其他数据类型如list去替代string类型。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。