String 类型为什么不好用了?
- String 类型可以保存二进制字节流,只要把数据转成二进制字节数组,就可以保存了。
- String 类型并不是适用于所有场合的,它有一个明显的短板,就是它保存数据时所消耗的内存空间较多。
为什么 String 类型内存开销大?
- 除了记录实际数据,String 类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫作元数据。
- 当实际保存的数据较小时,元数据的空间开销就显得比较大了。
- 当你保存 64 位有符号整数时,String 类型会把它保存为一个 8 字节的 Long 类型整数,这种保存方式通常也叫作 int 编码方式。
-
当你保存的数据中包含字符时,String 类型就会用简单动态字符串(Simple Dynamic String,SDS)结构体来保存。
- buf:字节数组,保存实际数据。为了表示字节数组的结束,Redis 会自动在数组最后加⼀个“”,这就会额外占用 1 个字节的开销。
- len:占 4 个字节,表示 buf 的已用长度。
- alloc:也占个 4 字节,表示 buf 的实际分配长度,一般大于 len。
- 对于 String 类型来说,除了 SDS 的额外开销,还有一个来自于 RedisObject 结构体的开销。
- Redis 的数据类型有很多,而且,不同数据类型都有些相同的元数据要记录(比如最后一次访问的时间、被引用的次数等)。
- Redis 会用一个 RedisObject 结构体来统一记录这些元数据,同时指向实际数据。
- 一个 RedisObject 包含了 8 字节的元数据和一个 8 字节指针,这个指针再进一步指向具体数据类型的实际数据所在,例如指向 String 类型的 SDS 结构所在的内存地址。
- Redis 会使用一个全局哈希表保存所有键值对,哈希表的每一项是一个 dictEntry 的结构体,用来指向一个键值对。
- dictEntry 结构中有三个 8 字节的指针,分别指向 key、value 以及下一个 dictEntry,三个指针共 24 字节。
- Redis 使用的内存分配库 jemalloc 在分配内存时,会根据我们申请的字节数 N,找一个比 N 大,但是最接近 N 的 2 的幂次数作为分配的空间,这样可以减少频繁分配的次数。
用什么数据结构可以节省内存?
-
Redis 有一种底层数据结构,叫压缩列表(ziplist),这是一种非常节省内存的结构。
- 表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量,以及列表中的 entry 个数。
- 压缩列表尾还有一个 zlend,表示列表结束。
-
压缩列表之所以能节省内存,就在于它是用一系列连续的 entry 保存数据。
- prev_len
- 表示前一个 entry 的长度。
- prev_len 有两种取值情况:1 字节或 5 字节。
- 当上一个 entry 长度小于 254 字节时,prev_len 取值为 1 字节,否则,就取值为 5 字节。
- len
- 表示自身长度,4 字节;
- encoding
- 表示编码方式,1 字节;
- content
- 保存实际数据。
- prev_len
- 这些 entry 会挨个儿放置在内存中,不需要再用额外的指针进行连接,这样就可以节省指针所占用的空间。
-
Redis 基于压缩列表实现了 List、Hash 和 Sorted Set 这样的集合类型,这样做的最大好处就是节省了 dictEntry 的开销。
- 当你用 String 类型时,一个键值对就有一个 dictEntry,要用 32 字节空间。
- 但采用集合类型时,一个 key 就对应一个集合的数据,能保存的数据多了很多,但也只用了一个 dictEntry,这样就节省了内存。
如何用集合类型保存单值的键值对?
-
在保存单值的键值对时,可以采用基于 Hash 类型的二级编码方法。
- 这里说的二级编码,就是把一个单值的数据拆分成两部分,前一部分作为 Hash 集合的 key,后一部分作为 Hash 集合的 value。
- 这样一来,我们就可以把单值数据保存到 Hash 集合中了。
- 二级编码方法中采用的 ID 长度是有讲究的。
- Hash 类型设置了用压缩列表保存数据时的两个阈值,一旦超过了阈值,Hash 类型就会用哈希表来保存数据了。
- hash-max-ziplist-entries:表示用压缩列表保存时哈希集合中的最大元素个数。
- hash-max-ziplist-value:表示用压缩列表保存时哈希集合中单个元素的最大长度。
- 为了能充分使用压缩列表的精简内存布局,我们一般要控制保存在 Hash 集合中的元素个数。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 滤镜大师Polarr5.11.4泼辣修图2023免费版
你的滤镜大师Polarr5.11.4 泼辣修图2023免费版是由北京泼辣熊科技有限公司研发推出的一款功能非常专业的图像处理软件,功能非常的丰富,包含了包括曲线、HSL、高低光、色调分离、选色调整、线性调整等上百种调整工具,还支持无限历史记录、自定义滤镜、高像素…