目录
1 String
2 List(LinkedList,ZipList,QuickList)
3 Set(哈希表)
4 ZSet(跳表,哈希表,压缩列表)
5 Hash(哈希表,压缩列表)
1 String
1、RAW分为两部分,redisobject他是后面指向SDS,先申请redisObject的内存空间,在申请SDS的内存空间,释放也有两次操作,所以性能差
2、EMBSTR只有一部分redisobject和SDS合并了,申请一块内存空间就行了,字符串大小在44字节以内就是这种模式,两块加一起也不超过64字节
3、INT编码:存储的是整数类型,转为二进制位
2 List(LinkedList,ZipList,QuickList)
类似链表 两边操作
1、LinkedList:普通链表,可以双端访问,占用空间高,内存碎片多
2、ZipList:压缩链表,可以双端操作,内存占用低,存储上限低(通过记录节点的大小来推算出内存地址,当前节点记录的是前一个节点,减去或加上当前节点就能得到前后节点的地址)
3、QuickLIst(3.2以后):LInkedList+ZipList,双端访问,内存占用低,包含多个ZipList,存储上限高
3 Set(哈希表)
有交集和并集的功能,好友的共同关 注,保证元素的唯一,判断元素是否存在,
哈希表(Dict字典)
1、为了查询效率和唯一性,set采用的HT编码(Dict),Dict的key来存储元素,value统一为null
2、当存储的所有数据都是整数,并且元素不超过set-max-intset-entries(可以在配置文件中配)时,set会采用IntSet编码(底层可以看做一个变长的数组,底层会排序,二分查找算法进行快速查找),节省内存
4 ZSet(跳表,哈希表,压缩列表)
可排序,分为score(值)值和member(键)值
根据score排序
member必须唯一
可根据member查询分数
键值存储,键必须唯一,可排序
SkipList(跳表):可排序,并且可以同时存储score和ele值(member)
HT(Dict):可以键值存储,并且根据key找value
内部同时有这两种,当元素不多的时候,优势不明显,浪费内存,因此会采用ZipList结构来节省空间
满足 :元素数量 zset_max_zeplist_entries,默认128 ,元素大小小于64字节
5 Hash(哈希表,压缩列表)
因为特性和ZSet基本上差不多,所以底层编码采用的编码与Zset基本上一致,只需要把排序有关的SkipList去掉即可
Hash结构默认采用ZipList编码,用以节省内存
当数据量较大时,Hash结构会转为HT编码,也就是Dict,触发条件:
满足 :元素数量 zset_max_zeplist_entries,默认512 ,元素大小小于64字节