• redis-原理-数据结构-整数集合(五)


    什么是整数集合

    集合键的底层(intset)实现之一,当一个集合只包含数值,并且数值的元素并不多时,就会选择使用整数集合作为底层实现,

    本地:0>sadd number 1 2 5 6
    4
    本地:0>object encoding number
    intset

    整数集合结构定义

    注:虽然contens类型为int_8但是真正保存的保存的类型取决于encoding的值

    如果length是4 encoding长度是int64 则整个数组占用4*64=256(size)

    几种编码格式的范围

    int_16  范围:-32786~32767

    Int_32 范围:-2147483648~2147483647

    int_64 范围:-9223372036854775808~9223372036854775807

    升级

    注:因为添加元素都有可能产生升级所以复杂度是0(N)

    如果将一个新元素加入到集合,并且这个元素类型的长度比集合所有类型都要长时就会触发升级

    比如集合包含int16的元素1,2,3,因为没有元素占16位,所以三个元素占3*16=48位空间

    现在将int32位65535添加到集合,触发升级

    1.首先根据新的元素类型占用长度对底层数组进行重新分配加上新的元素一共是4个元素,所需空间是4*32=128

    2.因为新的元素占用的还是前48位所以要将这3个元素放到正确的位上

     3.然后将新的元素放到新分配的空间上(注意整数集合是有序的,如果插入的是2 则会将原有的3后移动)

     4.最后将encoding的类型改为int32

    升级的好处

    1.节约内存,不需要直接使用int64,而是按需升级

    2.提高灵活性,因为我们一般通过声明不同类型的数组类型 比如int32 存储32位 int64存储64,通过升级无须关系多少位自动升级适配

    降级

    不支持降级

    api

  • 相关阅读:
    css 左右两栏 左边固定右边自适应
    Oracle 执行长SQL
    Oracle 游标基础
    ERROR 000464: Cannot get exclusive schema lock. Either being edited or in use by another application
    MyEclipse 批量更新编码集
    使用Windows服务发布WCF服务【转载】
    JavaScript的陷阱【转载】
    JS图片切换带超链接
    新正则表达式
    asp.net垃圾代码之asp.net去掉垃圾代码,优化aspx页面性能的方法
  • 原文地址:https://www.cnblogs.com/LQBlog/p/14528660.html
Copyright © 2020-2023  润新知