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();
}
由于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;
集合类型主要都是继承抽象类CollectionType
3、cassandra特殊应用的类型
PartionerType主要是对于Rowkey进行集群分段的一种Token方式,不同的分段方式就是不同的Partioner,对于Rowkey进行不同的算法,可以得出不同的Token,然后再各个节点进行分区。
3.2、CompositeType
CompositeType主要是对于CompositeCF里面的ColumnName的类型,因为CompositeCF的ColumnName是由CompositeColumn的value和ColumnName组成的,所以类型是一种组合类型。
3.3、CounterColumnType
CounterColumn是cassandra引入的一种集群计数器的方式,存在的CounterColumn的CF也是专门负责计数的。