返回
Redis底层数据结构P2之String结构之性能优化
后端
2023-12-31 21:32:26
Redis 由 Salavtore Sanfilippo 大神用 C 语言开发,在 C 语言里字符串通常以空字符 \0 作为结束符,但由于 Redis 的字符串是二进制安全的,因此不需要以 \0 结尾,这可以节省一个字节空间,在 Redis 里字符串是以两种方式来存储的,一种是使用 embstr 类型的内部表示,另一种是使用 raw 类型的内部表示。
**embstr 类型的内部表示:**
- 大小:在 embstr 类型的内部表示中,字符串的长度在 39 字节以内,如果超过 39 个字节,那么将会使用 raw 类型来表示。字符串长度与数据一起被保存,以便可以快速地进行检索。
- 内存分配:embstr 类型的数据结构位于一个连续的内存块中,该内存块的大小为 40 字节。当创建一个新的 embstr 类型时,Redis 会从一个预分配的内存池中分配一块 40 字节的内存。
- 查找速度:由于字符串的长度与数据一起被保存,因此可以使用二分查找法来快速地查找字符串。
- 插入和删除操作:当对 embstr 类型的数据结构进行插入或删除操作时,Redis 会在内存池中分配或释放一块 40 字节的内存。
- 空间利用率:embstr 类型的数据结构的优点是空间利用率高,因为字符串的长度与数据一起被保存,并且不需要使用额外的空间来存储字符串的结束符。
**raw 类型的内部表示:**
- 大小:raw 类型的内部表示用于存储超过 39 个字节的字符串。raw 类型的数据结构由两个部分组成,第一部分是字符串的长度,第二部分是字符串的数据。字符串的长度以一个 32 位的整数来存储,而字符串的数据则以一个字节数组来存储。
- 内存分配:raw 类型的的数据结构位于一个连续的内存块中,该内存块的大小由字符串的长度决定。当创建一个新的 raw 类型的数据结构时,Redis 会从一个预分配的内存池中分配一块内存,该内存块的大小等于字符串的长度加上 5 字节(用于存储字符串的长度)。
- 查找速度:由于 raw 类型的数据结构的字符串长度与数据分开存储,因此不能使用二分查找法来快速地查找字符串。
- 插入和删除操作:当对 raw 类型的数据结构进行插入或删除操作时,Redis 会在内存池中分配或释放一块内存,该内存块的大小等于字符串的长度加上 5 字节(用于存储字符串的长度)。
- 空间利用率:raw 类型的数据结构的优点是空间利用率高,因为字符串的长度与数据分开存储,并且不需要使用额外的空间来存储字符串的结束符。
Redis 通过对字符串结构进行性能优化,提高了字符串操作的效率,从而使 Redis 能够处理更多的请求和存储更多的数据。
字符串结构是 Redis 的核心数据结构之一,它在 Redis 的各种操作中都扮演着重要的角色。通过对字符串结构进行性能优化,可以提高 Redis 的整体性能。