Redis中set,zset的数据结构以及java中的hashSet和LinkHashSet的数据结构

9 篇文章 1 订阅
4 篇文章 0 订阅

Redis

set

set为无序的,自动去重的集合数据类型,其底层实现一个value为null的字典(dict)。
当数据可以用整形表示时,set集合将用intset数据结构。
当元素个数大于set-max-intset-entries,元素无法用整形表示这俩个满足任何一个将用hashtable存储数据。
intset数据格式
在这里插入图片描述
在这里插入图片描述
encoding: 编码类型
length:元素个数
contents[]: 元素存储

hashtable
跟前面讲的类似

ZSet

ZSet为有序的,自动去重的集合数据类型,ZSet数据结构底层实现为字典+跳表(skiplist)和ziplist
zset-max-ziplist-entries 128 元素个数超过128
zset-max-ziplist-value 64 单个元素大小超过64byte,
满足上面将由ziplist换成skiplist编码
跳表中原路及实现
https://blog.csdn.net/u013592964/article/details/85766096
在这里插入图片描述
在这里插入图片描述

java

HashSet

HashSet的底层是采用HashMap实现的。
没有重复元素的集合。
不能保证元素的顺序,元素是无序的,因为Map是无序的,因此HashSet也无法保证顺序。
HashSet不是同步的,需要外部保持线程之间的同步问题
集合元素值允许为null
注意:
集合所说的序,是指元素存入集合的顺序,当元素存储顺序和取出顺序一致时就是有序,否则就是无序。

LinkHashSet

LinkedHashMap是HashMap的一个子类,具有和HashMap相同的存储结构和扩容机制,在此基础上增加了head(头节点)和tail(尾节点)
Entry 类型数组 + 单向链表 + 双向链表 + 红黑树
Entry 类型数组 继承了 hashmap 的node结构,增加了Entry<K,V> before, after两个属性
单向链表 用于维护数组的每一个Entry元素的链表关系
双向链表 通过新增的before和after属性进行控制,主要实现了插入顺序和读取顺序保持一致
红黑树 用于把过长的单向链表结构树化

LinkedHashMap在Map的基础上进行了扩展,提供了按序访问的能力。这个顺序通过accessOrder控制,可以是结点的插入顺序,也可以是结点的访问时间顺序。
对于这个有序和无序的代码
https://cloud.tencent.com/developer/article/1708631

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值