Redis数据结构

Redis的五种基础数据类型&对应的底层数据结构

在这里插入图片描述

Redis key 数据结构

1、key 是用什么数据结构存储的?
Redis采用哈希表来存储所有的键值对,在redis的全局哈希表中,每个哈希桶保存了对应的键值对数据,每个桶中的entry元素实际上保存了key和value指针,分别指向了对应的键和值,键的类型为String,而value则对应多种不同的数据结构。
在这里插入图片描述

2、hash 冲突是怎样解决的?
使用hash存储键值对不可避免会产生哈希冲突,也就是当两个不同的key经过计算后落到了同一个哈希桶上,Redis解决哈希冲突采用了最常见的链式哈希方式,也就是当key冲突时,同一个哈希桶中的元素用链表来保存,他们之间使用指针顺序连接。如下图所示:entry1,entry2, entry3 经过计算后落到了同一hash桶3中,之间用*next 指针指向下一个。
在这里插入图片描述
3、rehash 是如何解决哈希冲突链过长的问题?
链式哈希虽然可以解决哈希冲突问题,但随着key越来越多,冲突发生次数也会越来越多,意味着同一桶下的冲突链表会越来越长,而要访问链表只能顺序来遍历,显然会拖慢redis 的访问速度。这时候就得想办法缩短这种链表。redis 提供了rehash机制,如下图所示:redis 实际上保存了两个全局哈希表,哈希表1 和 哈希表2 ,哈希表2通常是哈希表1的两倍,当哈希表1中的桶不够用或者桶上链表太长时,就会通过rehash机制把表1上的数据迁移到表2上来,缩短哈希链。当然,迁移过程不是一次性完成的,大量的迁移会阻塞redis ,所以采用渐进式rehash,即redis 仍然处理客户端请求,,每处理一个请求时顺带从哈希表1中迁移一部分key至哈希表2, 将迁移分摊到每次的数据请求,直到哈希表1上的数据全部迁移完。哈希表1会预留作为下次rehash扩容备用。
在这里插入图片描述

Redis value 数据结构

String 简单动态字符串

hash 哈希表

list 双向链表

ziplist 压缩列表
在这里插入图片描述
skiplist 跳表
在这里插入图片描述
intarray 整数数组

本文插图来自:https://time.geekbang.org/column/article/270474?cid=100056701

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值