cassandra的数据类型

cassandra从一开始只支持BytesType比较器,到现在cassandra1.2支持的类型已经越来越多了,基本上都在org.apache.cassandra.db.marshal包下面。所有的比较器基本上都是继承AbstractType.java抽象类的。


1、单列类型

单种类型的Type,主要实现有Ascii,Boolean,Bytes,Date,Decimal,Double,Float,InetAddress,Int32,Integer,Long,TimeUUID,UTF8,UUID,里面实现的主要是类型转换(对应类型与ByteBuffer的转换,compose和decompose),相关类型的比较。因为cassandra这种nosql型数据库,数据先要放在内存结构中进行排序,而排序的规则这是由这些继承AbstractType的子类分别定义的。

1.1、BytesType,AsciiType,UTF8Type,DateType,

对于单种类型的比较器,Ascii,Bytes,UTF8这种,只需要简单的逐个比较ByteBuffer中的每个字节就可以了,所以它们的实现方法,主要都是底层调用的

public static int compareUnsigned(ByteBuffer o1, ByteBuffer o2)
    {
        assert o1 != null;
        assert o2 != null;
        if (o1 == o2)
            return 0;

        if (o1.hasArray() && o2.hasArray())
        {
            return FBUtilities.compareUnsigned(o1.array(), o2.array(), o1.position() + o1.arrayOffset(),
                    o2.position() + o2.arrayOffset(), o1.remaining(), o2.remaining());
        }

        int end1 = o1.position() + o1.remaining();
        int end2 = o2.position() + o2.remaining();
        for (int i = o1.position(), j = o2.position(); i < end1 && j < end2; i++, j++)
        {
            int a = (o1.get(i) & 0xff);
            int b = (o2.get(j) & 0xff);
            if (a != b)
                return a - b;
        }
        return o1.remaining() - o2.remaining();
    }

1.2、BooleanType

由于Boolean类型是底层只有null,true(1),false(0)这三种,如果调用ByteBufferType的compareUnsigned方法,性能肯定没有直接比较ByteBuffer值快,所以出去null值的判断以外就可以直接进行ByteBuffer的比较,这样提升性能。


1.3、DoubleType,FloatType

Double和Float都是浮点类型,但是由于java的实现是在底层转换为ByteBuffer以后是以byte字节为单位的,但是Float和Double是以bit(位)为单位的转换,所以直接对DoubleType和FloatType的比较进行实现一定的算法,并没有直接将其转换为对应的类型比较性能更快,所以DoubleType和FloatType的比较方法主要是将ByteBuffer转换以后进行直接调用java底层的比较器进行比较。


1.4、Int32Type和LongType

int和long都属于有符号型的类型,主要是在进行ByteBuffer的比较前,需要先进行符号位的比较,正数一定大于负数,所以在LongType和Int32Type的比较都是先进行符号位的比较,再直接调用ByteBufferType的compareUnsigned方法进行比较

if (o1.remaining() == 0)
        {
            return o2.remaining() == 0 ? 0 : -1;
        }
        if (o2.remaining() == 0)
        {
            return 1;
        }

        int diff = o1.get(o1.position()) - o2.get(o2.position());
        if (diff != 0)
            return diff;

2 、集合类型

集合类型主要都是继承抽象类CollectionType,主要的实现子类有 MapType,SetType,ListType 主要是cassandra客户端cql3的支持三种类型:Maps,Sets和Lists。


3、cassandra特殊应用的类型

3.1、LocalByPartionerType

PartionerType主要是对于Rowkey进行集群分段的一种Token方式,不同的分段方式就是不同的Partioner,对于Rowkey进行不同的算法,可以得出不同的Token,然后再各个节点进行分区。

3.2、CompositeType

CompositeType主要是对于CompositeCF里面的ColumnName的类型,因为CompositeCF的ColumnName是由CompositeColumn的value和ColumnName组成的,所以类型是一种组合类型。

3.3、CounterColumnType

CounterColumn是cassandra引入的一种集群计数器的方式,存在的CounterColumn的CF也是专门负责计数的。









你可能感兴趣的:(cassandra的数据类型)