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