reids数据结构学习总结

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值