zoukankan      html  css  js  c++  java
  • Redis 设计与实现(第六章) -- 整数集合(intset)

    概述


    1.intset概述

    2.intset实现

    3.intset升级

    intset概述

    整数集合是Redis集合键的底层实现之一,当值都为整数时,redis就会选择整数集合作为底层实现。

    可以保存int16_t,int32_t,int64_t类型的整数值,并且集合中不会出现重复元素。

    intset实现

    先看下intset的数据结构:

    typedef struct intset {
        uint32_t encoding;  //encoding方式
        uint32_t length;  //长度
        int8_t contents[]; //存储数组
    } intset;

    虽然contents[]声明了int8_t类型的数组,但实际上contents[]并不保存任何int8_t类型的数据,真正的数据类型取决于encoding的类型。

    encoding类型有以下三种:

    #define INTSET_ENC_INT16 (sizeof(int16_t))
    #define INTSET_ENC_INT32 (sizeof(int32_t))
    #define INTSET_ENC_INT64 (sizeof(int64_t))

    intset升级

    如果encoding类型为int_16,但是这时候需要保存个新元素,但是元素无法通过int16_t表示,这时就需要涉及到升级操作:

    升级后所有元素会升级到对应升级后的类型,set中不会存在多种类型,而且升级后就无法降级;

    升级步骤如下:

    1.判断升级所需要的空间,分配空间大小;

    2.将所有元素升级到与新元素相同的类型,并将转换类型后的元素添加到正确位置上;

    3.将新元素添加到底层数组里面;

    升级有什么好处?

    1.提升灵活性

        因为C是静态类型的,为了避免错误,通常不会将两种不同类型保存在同一个数据结构中;但是升级能够支持保存int16_t,int32_t,int64_t的数据;

    2.节约空间

       如果保存的数据只有int16_t,那分配一个int64_t的空间是造成空间的浪费,所以最开始值分配int16_t的空间,如果需要添加int32_t,int64_t的数据,再进行升级。

  • 相关阅读:
    exchart点击事件,空白无值也能点击触发
    两个界面来回切换展示(左下角 有小demo)
    警告滚动展示
    Oracle高级查询之OVER (PARTITION BY ..)
    解决安装office2007后,原来的*.doc文件的图标变成缩略图
    几个常用的文本处理shell 命令:find、grep、sort、uniq、sed、awk
    CentOS 7.3 安装配置 Nginx
    MySQL5.7.17源码编译安装与配置
    CentOS 7 源码安装 MySQL5.7
    Java命令学习系列(一)——Jps
  • 原文地址:https://www.cnblogs.com/dpains/p/7602805.html
Copyright © 2011-2022 走看看