redis数据结构汇总

在这里插入图片描述
redis每个【数据类型】所对应的【数据结构】

小结:

String
主要是SDSLong
1、基本编码方式是RAW,value = SDS
2EMBSTR编码  value = SDS  并且SDS长度小于44字节,只需要调用一次内存分配函数,效率更高
3INT编码:value = 整数值, 从⽽减少内存的使用。
如何追加字符串? 如何扩容? 如何缩容?


List
主要是LinkedListZipList(3.2以前)QuickList3.2以后)

3.2以前
ZipList编码: 当元素数量小于512, 并且元素大小小于64字节时
LinkedList: 默认都用这个

3.2以后
QuickList



Set
主要采用:dict+IntSet
IntSet:当存储数据都是【整数】,并且元素数量不超过【set-max-intset-entries】时,Set会采用IntSet编码,以节省内存
Dict:默认都用这个



Zset
主要采用:【SkipList+Dict】 或者 【ZipListZipList需要满足下面条件
1、元素【数量】小于zset_max_ziplist_entries,默认值128
2、每个元素【长度】都小于zset_max_ziplist_value字节,默认值64

ziplist如何排序?
ziplist本身没有排序功能,而且没有键值对的概念,因此需要有ZSet通过编码实现:ZipList是连续内存,
因此score和element是紧挨在一起的两个entry, element在前,score在后
score越小越接近队首,score越大越接近队尾,按照score值升序排列。



Hash
主要:【ziplist】 或者 【dict】
ziplist:数据项比较少,节省内存
条件:
1ZipList中的元素【数量】超过了hash-max-ziplist-entries( 默认为512)
2ZipList中的任意【Entry大小】超过了hash-max-ziplist-value (默认为64字节)

否则使用dict

关于几种数据结构的特点:

ZipList :压缩列表,可以从双端访问,内存占用低,存储上限低
LinkedList :普通链表,可以从双端访问,内存占用较高,内存碎片较多
QuickListLinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高

1、资深面试-实现原理

zipList和skipList的区别可以参考:跳转

关于dict的数据结构图可以看这个跳转

关于SkipList的实现原理和区别 跳转

什么是redisObject:

Redis中的任意【数据类型】的数据,所对应的value的值会被封装为一个【RedisObject】。

从Redis的使用者的角度来看,⼀个Redis节点包含多个database,而一个database维护了从key space到
object space的映射关系。这个映射关系的key是string类型,⽽value可以是多种数据类型,比如:string, 
list, hash、set、sorted set等。

我们可以看到,key的类型固定是string,而value可能的类型是多个。
⽽从Redis内部实现的⾓度来看,database内的所有【映射关系】都是用⼀个【dict】来维护的。

dict{
	sds key;//动态字符串sds
	redisObject value;
}


dict的key固定用⼀种数据结构来表达就够了,这就是【动态字符串sds】。
而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,
这个通用的数据结构就是robj,全名是【redisObject】
看下redisObject的结构

在这里插入图片描述

一、String

String的value一共有三种类型,RAW、Embstr、INT

在这里插入图片描述

关于String里面追加字符串是如何操作的,或者String里面扩容,以及缩容问题可以看这个: 跳转

二、List

在这里插入图片描述

三、set

SetRedis中的单列集合,满足下列特点:
1、不保证有序性
2、保证元素唯一
3、可以求2个set集合之间的:交集、并集、差集

SetRedis中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求极高。
为了查询效率和唯一性,set采用HT编码(Dict)。Dict中的key用来存储元素,value统一为null

可以看出,Set对查询元素的效率要求非常高,思考一下,什么样的数据结构可以满足?
HashTable,也就是Redis中的Dict,不过Dict是双列集合(可以存键、值对)
当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entries时,Set会采用IntSet编码,以节省内存

在这里插入图片描述

四、ZSet

ZSet也就是SortedSet,其中每一个元素都需要指定一个score值和member值
1、可以根据score值排序后
2、member必须唯一
3、可以根据member查询分数

哪种编码结构可以满足?
SkipList:可以排序,并且可以同时存储score和ele值(member), 没办法实现高效的键唯一性检查
HTDict):可以键值存储,并且可以根据key找value, 不能排序

在这里插入图片描述

五、Hash

Hash结构与Redis中的Zset非常类似:
1、都是键值存储
2、都需求根据键获取值
3、键必须唯一

区别如下:
1、zset的键是member,值是score;hash的键和值都是任意值
2、zset要根据score排序;hash则无需排序


底层实现方式:压缩列表ziplist 或者 字典dict
当Hash中数据项比较少的情况下,Hash底层才⽤压缩列表ZipList进⾏存储数据以节省内存,ZipList中相邻的两个entry,分别保存field和value

随着数据的增加,底层的ziplist就可能会转成dict,触发条件有两个:
	ZipList中的元素数量超过了hash-max-ziplist-entries( 默认为512)
	ZipList中的任意Entry大小超过了hash-max-ziplist-value (默认为64字节)
当满足上面两个条件其中之⼀的时候,Redis就使⽤dict字典来实现hash



Redis的hash之所以这样设计,是因为当ziplist变得很⼤的时候,它有如下几个缺点:
1、每次插⼊或修改引发的realloc操作会有更⼤的概率造成内存拷贝,从而降低性能。
2、⼀旦发生内存拷贝,内存拷贝的成本也相应增加,因为要拷贝更⼤的⼀块数据。
3、当ziplist数据项过多的时候,在它上⾯查找指定的数据项就会性能变得很低,因为ziplist上的查找需要进行遍历。

在这里插入图片描述

文章地址:跳转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis使用多种数据结构来实现不同的功能。如果只使用字符串类型,并且不使用Redis的持久化功能,那么Redis与Memcache非常相似,它们都可以用作缓存。 除了字符串类型,Redis还支持其他数据结构,如列表(List)、哈希(Hash)、集合(Set)和有序集合(Sorted Set)。 对于数据量较少的情况,Redis 3.0的List对象会使用压缩列表(ziplist)作为底层数据结构,它具有节省内存空间和紧凑的特点。 有序集合(Zset)是Redis中唯一一个同时使用两种数据结构来实现的对象,它使用跳表(Skip List)和哈希表(Hash Table)来实现高效的范围查询和单点查询。 通过选择合适的数据结构Redis可以提供高效的数据存储和查询能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [redis数据结构及用法汇总](https://blog.csdn.net/qq_42671928/article/details/123677676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis数据结构](https://blog.csdn.net/mz474920631/article/details/125200050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值