redis的string为何内存消耗大
【摘要】 说到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)