栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

reids数据结构学习总结

Java 更新时间:发布时间: 百科书网 趣学号

1、键和值用什么结构组织?
Redis 使用了一个哈希表来保存所有键值对。因为这个哈希表保存了所有的键值对,所以,我也把它称为全局哈希表。(O(1) 的时间复杂度来快速查找到键值对)如图所示:

2、为什么哈希表操作变慢了?(哈希表的冲突问题和 rehash 可能带来的操作阻塞。)
2.1、链式哈希(解决Hash冲突)就是指同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。链表元素只能通过一个节点一个节点一次查找,如果链过长,查询到对应key的时间过长。

2.2、解决链表过长问题,对hash表进行rehash操作(增加现有的hash桶的数量,让entry存储的更加分散)redis进行rehash操作过程如下:
a、redis默认使用两个全局hash表,hash1和hash2
b、开始插入数据默认使用hash1,hash2并不分配空间
c、rehash开始,给hash2分配更到的空间,比如hash2=2*hash1
d、把hash1中的数据重新映射并拷贝到hash2
e、释放hash1空间
f、hash1用来下一次rehash操作用
在rehash时,会阻塞线程,导致redis不能处理客户端请求,所以redis在处理copy的时候使用了渐进式rehash,(redis在copy数据的时候正常处理客户端请求,没处理一个请求,就从hash1中的第一个位置开始将该位置的entry顺势copy到hash2,第二次请求处理第二个位置,将一次copy过程分布到多个请求中,避免耗时操作。如下图所示:

3、不同数据结构类型的redis操作(数据类型和底层数据结构对应关系)

3.1、String类型,找到hash桶就可以进行操作,时间复杂度O(1)
3.2、双向链表和数组,根据下标顺序读写或者链表指针逐个访问,操作复杂度O(n)
3.3、压缩列表,实际主体还是一个数组,和数组不同的是,压缩列表在表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量和列表中的 entry 个数;压缩列表在表尾还有一个 zlend,表示列表结束。查找第一个和最后一个元素,时间复杂度O(1),其余元素还是O(n),如图所示:

3.4、跳表,在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位,跳表的查找复杂度就是 O(logN)。查找过程如图所示:

3.5、整体时间复杂度统计如图所示:

4、不同操作的复杂度
4.1、单元素操作,是指每一种集合类型对单个数据实现的增删改查操作(例如,Hash 类型的 HGET、HSET 和 HDEL,Set 类型的 SADD、SREM、SRANDMEMBER 等由集合采用的数据结构决定)
4.2、范围操作,是指集合类型中的遍历操作,可以返回集合中的所有数据(例如,Hash 类型的 HGETALL 和 Set 类型的 SMEMBERS,List 类型的 LRANGE 和 ZSet 类型的 ZRANGE。)
4.3、统计操作,是指集合类型对集合中所有元素个数的记录(例如 LLEN 和 SCARD。)
4.4、例外情况,是指某些数据结构的特殊记录,例如压缩列表和双向链表都会记录表头和表尾的偏移量(例如 List 类型的 LPOP、RPOP、LPUSH、RPUSH)
5、为何数组和链表时间负责度很高redis还是使用这两种数据结构:
1、内存利用率,数组和压缩列表都是非常紧凑的数据结构,它比链表占用的内存要更少。Redis是内存数据库,大量数据存到内存中,此时需要做尽可能的优化,提高内存的利用率。

学习Redis链接:https://time.geekbang.org/column/article/268253?cid=100056701

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/602341.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号