cassandra1.0引入的3种集合结构ISortedColumns的比较

本文探讨了Cassandra 1.0中引入的三种ISortedColumns集合结构——ThreadSafeSortedColumns、ArrayBackedSortedColumns和TreeMapBackedSortedColumns。ThreadSafeSortedColumns适合线程安全的排序数据,ArrayBackedSortedColumns在有序数据插入时性能最佳,适用于并行迭代查询,而TreeMapBackedSortedColumns在无序数据插入和查询时表现最优,适用于数据导入和排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在早期的cassandra的版本中,cassandra的memtable,数据检索的时候暂时存放的ColumnFamily,基本上只有一种结构就是ConcurrentSkipListMap。ConcurrentSkipListMap通过名字就知道是线程安全的集合,并且内部是内部是采用链表的结构,所以检索的性能也很高。但是作为数据库而言,底层结构的性能即使是纳秒级的差距,都会对数据库的性能产生比较大的影响。也许正是如此,像cassandra这种海量数据级的数据库,也要不断提升流程中最适合的集合。


1、ThreadSafeSortedColumns

ThreadSafeSortedColumns是继承ConcurrentSkipListMap集合的,所以线程安全,并且数据是排序的,根据key来达到去除重复的效果,所以主要应用于memtable中用于存放数据,并且将memtable中的数据排好序,排好序主要也是便于查询,已经序列化到sstable中,也便于查询。


2、ArrayBackedSortedColumns

ArrayBackedSortedColumns是继承ArrayList集合的,ArrayList集合是线程不安全,数据存放在集合中时无序的,所以写入集合的速度是最快的,查询的时候,一般需要自己逐个遍历集合中的每一个元素。但是ArrayBackedSortedColumns虽然继承了ArrayList集合,线程不安全,写入速度也比较快,但是写入的时候,还是会进行排序,查询的时候也不是一味的进行逐个元素的遍历,而是进行二分查找法。

由于ArrayBackedSortedColumns在插入的时候,做了排序的处理,所以当数据是无序的时候,就没有比ThreadSafeSortedColumns插入性能更快的优势。
实验:ThreadSafeSortedColumns 和ArrayBackedSortedColumns的插入性能比较。
1、插入100000数据,而是有序的插入,ArrayBackedSortedColumns的插入性能高于ThreadSafeSortedColumns

add (org.apache.cassandra.db.ThreadSafeSortedColumns):176
add (org.apache.cassandra.db.ArrayBackedSortedColumns):81


2、插入100000数据,而是无序的插入,ArrayBackedSortedColumns的插入性能低于ThreadSafeSortedColumns
add (org.apache.cassandra.db.ThreadSafeSortedColumns):609
add (org.apache.cassandra.db.ArrayBackedSortedColumns):3205
实验结果表明:ArrayBackedSortedColumns在有序的数据插入的时候,性能高于ThreadSafeSortedColumns。所以ArrayBackedSortedColumns主要被应用于,并行迭代的查询中,而查询的时候,在并行迭代扫描数据的时候,查询出来的数据将会是有序的。


3、TreeMapBackedSortedColumns
TreeMapBackedSortedColumns是继承TreeMap集合的,可以用于数据的排序,查询性能很高,但是线程并不安全。


实验:ThreadSafeSortedColumns,ArrayBackedSortedColumns,TreeMapBackedSortedColumns的插入性能比较。
1、插入100000数据,而是有序的插入,ArrayBackedSortedColumns插入性能最高

add (org.apache.cassandra.db.ThreadSafeSortedColumns):172
add (org.apache.cassandra.db.ArrayBackedSortedColumns):99
add (org.apache.cassandra.db.TreeMapBackedSortedColumns):342


2、插入100000数据,而是无序的插入,TreeMapBackedSortedColumns插入性能最高
add (org.apache.cassandra.db.ThreadSafeSortedColumns):612
add (org.apache.cassandra.db.ArrayBackedSortedColumns):3166
add (org.apache.cassandra.db.TreeMapBackedSortedColumns):404
实验结果表明:TreeMapBackedSortedColumns在无序的数据插入的时候,性能最高。所以TreeMapBackedSortedColumns主要被应用于数据无序的时候,进行导入,排序,然后可以直接写sstable。


实验:ThreadSafeSortedColumns,ArrayBackedSortedColumns,TreeMapBackedSortedColumns的查询性能比较。
get (org.apache.cassandra.db.ThreadSafeSortedColumns):155
get (org.apache.cassandra.db.ArrayBackedSortedColumns):96
get (org.apache.cassandra.db.TreeMapBackedSortedColumns):57
实验结果表明:TreeMapBackedSortedColumns在数据的查询性能高于ArrayBackedSortedColumns高于ThreadSafeSortedColumns。

public void addColumn(IColumn column, Allocator allocator)
    {
        if (isEmpty())
        {
            add(column);
            return;
        }

        // Fast path if inserting at the tail
        int c = compare(get(size() - 1).name(), column.name());
        // note that we want an assertion here (see addColumn javadoc), but we also want that if
        // assertion are disabled, addColumn works correctly with unsorted input
        assert c <= 0 : "Added column does not sort as the " + (reversed ? "first" : "last") + " column";

        if (c < 0)
        {
            // Insert as last
            add(column);
        }
        else if (c == 0)
        {
            // Resolve against last
            resolveAgainst(size() - 1, column, allocator);
        }
        else
        {
            int pos = binarySearch(column.name());
            if (pos >= 0)
                resolveAgainst(pos, column, allocator);
            else
                add(-pos-1, column);
        }
    }

private int compare(ByteBuffer name1, ByteBuffer name2)
    {
        if (reversed)
            return comparator.reverseComparator.compare(name1, name2);
        else
            return comparator.compare(name1, name2);
    }


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值