redis 数据结构篇

1、String的数据结构为简单的动态字符串。内部结构类似Java的ArrayList,
采用预分配冗余空间的方式以减少内存频繁分配。

如图中所示,内部为当前字符串实际分配空间capacity 一般要高于实际字符串长度len。当字符串长度小于1M时扩容时加倍现有空间,若超出1M扩容时一次只会多扩容1M的空间,字符长度最大时512M


 

2、List 的数据结构是快速链表 quickList 在列表元素较少的情况下  使用一块连续的内存存储 此结构是zipList也就是压缩链表  所有元素连续存储分配的是一块连续的内存。

属性长度说明
zlbytes4字节压缩列表占用内存空间(包括本身所占用的4个字节)
zltail4字节记录压缩列表尾节点距离压缩列表的起始地址有多少个字节(通过这个值可以计算出尾节点地址)
zllen2字节记录压缩列表中包含的节点数量
entry压缩列表中的各个节点
zlend1字节特殊字符0xFF(十进制255),用来标记压缩列表的末端  用255这个数来判断是否是zipList的结尾


当数据量比较大时会改为quickList   因为普通链表需要的附加指针空间太大比较浪费空间  比如列表存的是int数据类型 结构上还需要额外的两个指针 prev 和 next ( ziplist不存储指向上一个节点和下一个节点的指针,存储的是上一个节点的长度和当前节点的长度,牺牲了部分读写性能来换取内存利用率,是一种时间换空间的思想。)

   Redis将链表和zipLis结合起来组成了 quickList。也就是将多个zipList的双向指针串起来使用。这样既满足了快速删除/插入的性能,又不会出现太大的空间冗余
           
 

3、Set使用hash或者intset
          1)intset为一个有序结合 当Set集合中的元素全是整数且长度小于512个(set-max-intset- entries)可配使用intSet
          2)hash 和java中的HashSet类似使用的是HashMap所有的Value都指向同一个对象,Redis中的Set也是所有的Value都指向同一个值
 


4、Hash有两种数据结构类型
           1)一种是zipList(压缩列表)
           2)另一种是HashTable (hash表)
           和链表中的zipList不同的是哈希对象中的ziplist在于哈希对象是一个key-value形式,所以其ziplist中也表现为key-value,key和value紧挨在一起。

    
哈希对象可以满足以下两个条件时则会选择使用ziplist进行存储:
     1)哈希对象中的所有键值对总长度小于64字节(hash-max-ziplist-value配置)
2)哈希对象中的键值对数量小于512个(hash-max-ziplist-entries 配置)。


 

5、Zset有序集合 底层使用跳跃表的数据结构     
有序链表 如下图 比如需要找到51的元素需要从第一个元素依次遍历比较共需要6次才能找到

跳跃表 从第二层开始 元素1比51小向后比较,元素21表51小继续向后比较 后面是NULL 所以从元素21向下到第一层   元素41比51小 继续向后 元素61比51大 所以从元素41向下到第0层 元素51被找到共查询4次


 6、Bitmap
          现代计算机使用二进制作为信息的基础单位,1字节等于8位 合理的使用操作位能够有效的提高内存的使用率和开发效率,redis提供了Bitmap这个“数据类型”实现对位的操作,实际它就是一个字符串但是它可以对位进行操作。可以把Bitmap想象成一个以位为单位的数组其每个单元只能存0和1数组下标叫做偏移量

BitMap和Set对比:
假设网站1亿用户,每天访问用户有五千万每天用Set和Bitmap分别存储活跃用户

数据类型用户id占用空间存储的用户量总内存量
Set32位50000000190M
BitMap1位10000000012M

但并不是所有场景都适用BitMap假如每天访问量很小比如10万对比之下就不太适合用Bitmap来了

数据类型用户id占用空间存储的用户量总内存量
Set32位100000400K
BitMap1位10000000012M
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值