卖不甜枣 发表于 2024-8-17 16:18:19

【Redis】Redis 数据类型与结构—(二)

https://img-blog.csdnimg.cn/9633f3bb7c3643d0a6989e51c0470ac6.gif#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center
https://img-blog.csdnimg.cn/img_convert/7b0d6ba5dcce6ce6b2e732fdffde6496.gif#pic_center#pic_center#pic_center#pic_center#pic_center#pic_center
一、值的数据类型

Redis “快”取决于两方面,一方面,它是内存数据库,另一方面,则是高效的数据结构。
Redis 键值对中值的数据类型,也就是数据的生存形式有5种:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。这5种数据类型由6种底层结构实现:简朴动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。
String 类型的底层实现只有一种数据结构,简朴动态字符串,而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构,这四种类型称为集合类型,特点是一个键对应了一个集合的数据
https://i-blog.csdnimg.cn/direct/2ebec031257d4c6cb6acf823395cafd1.png
二、键值对数据结构

Redis 使用哈希表来生存所有键值对,实现从键到值的快速访问。哈希表就是一个数组,每个元素称为一个哈希桶,哈希桶中的元素生存的并不是值本身,而是指向具体值的指针。哈希表生存了所有的键值对,也称为全局哈希表,时间复杂度为O(1)
https://i-blog.csdnimg.cn/direct/17095b9c1c0546da9f1971bc1af309da.png
当 Redis 中写入大量数据后,哈希表的辩论标题和 rehash 大概导致操纵变慢。
哈希辩论是指,两个 key 的哈希值落在了同一个哈希桶中,究竟,哈希桶的个数通常要少于 key 的数量。
Redis 通过链式哈希办理哈希辩论,就是指同一个哈希桶中的多个元素用一个链表来生存,它们之间依次用指针毗连。
https://i-blog.csdnimg.cn/direct/22d1f18da42340c19f170903e2198eb9.png
随着数据量增大,哈希辩论大概也会越来越多,这就会导致某些哈希辩论链过长,链上的元素只能通过指针逐一查找再操纵,进而导致查询效率低落。
Redis 会对哈希表做 rehash 操纵来办理这个标题,也就是增长现有的哈希桶数量,让逐渐增多的 entry 元素能在更多的桶之间分散生存,减少单个桶中的元素数量,从而减少单个桶中的辩论。
Redis 会将哈希表的数据拷贝到另一个容量更大的哈希表,清空原来的准备下一次 rehash,这样依然会有标题,由于在数据量大的基础上拷贝会造成 Redis 线程阻塞。为了避免这个标题,Redis 接纳了渐进式 rehash,就是将拷贝过程的开销分摊到每次请求时进行,从而包管查询效率。
https://i-blog.csdnimg.cn/direct/7699561616cd4b16940715381d88dfef.png
三、集合数据操纵效率

对于 String 类型来说,找到哈希桶就能直接增删改查了,所以,哈希表的 O(1) 操纵复杂度也就是它的复杂度了。对于集合类型来说,找到哈希桶后,增删改查都是对集合操纵的,不同的集合类型时间复杂度是不一样的。
哈希表的特点上面提到了,复杂度是O(1),整数数组和双向链表也很常见,通过数组下标或者链表的指针逐个元素访问,操纵复杂度根本是 O(N),操纵效率比较低。压缩列表和跳表是 Redis 重要的数据结构,下面先容一下。
压缩列表类似于一个数组,不同之处在于表头有三个字段 zlbytes、zltail 和 zllen,分别表现列表长度、列表尾的偏移量和列表中的 entry 个数,压缩列表在表尾另有一个 zlend,表现列表结束。
https://i-blog.csdnimg.cn/direct/6f190d7ff9d74866ab08d71a688bd988.png
查找第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。而查找其他元素时,复杂度就是 O(N) 了
跳表在链表的基础上,增长了多级索引,通过索引位置的几个跳转,实现数据的快速定位,当数据量很大时,跳表的查找复杂度就是 O(logN)
按照查找的时间复杂度,这些数据结构分类如下:
https://i-blog.csdnimg.cn/direct/2bc742696b5d4154b076bba42c1cf287.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Redis】Redis 数据类型与结构—(二)