List

List 是一个byte[]列表,按照插入顺序排序。单个列表最多可以包含2的31次方-1个元素 (20亿+)。

特性

List 拥有高速的插入和读取速度,数据结构上类似于JDK的 ArrayList,因此拥有很强的索引查询能力。但众所周知,ArrayList执行remove等操作元素时,后面的元素需要逐个移动。如果元素过多,在磁盘上这种操作几乎是不可忍受的。因此,KitDB的List禁止了remove和add(index, E)操作,只能利用pop操作从头部或尾部删除元素,并且在使用blpop删除元素时,不会移动其他元素的下标,如下图示:List - 图1

同一个List,同一时刻可以允许多个线程做读操作,只允许一个线程做写操作,读写操作不互斥。如希望在多线程的环境中更快的插入顺序数据,可以使用:FastWList(高速顺序写入列表)

操作

add(String key, byte[] v)

将一个值插入列表

addAll(String key, List<byte[]> vs)

将多个值插入列表

addMayTTL(String key, byte[] v, int ttl)

将一个值插入列表,如果列表不存在则设置TTL

addAllMayTTL(String key, List<byte[]> vs, int ttl)

将多个值插入列表,如果列表不存在则设置TTL

get(String key, long i)

通过索引获取列表中的元素

get(String key, List is

通过多个索引获取列表中的多个元素如果对应顺序的索引不存在,则返回值对应顺序的元素值为null

iterator(String key)

获取一个迭代器。用迭代器遍历List是一个更快速的方案,在基准性能测试中,遍历速度是get(i)的5倍

  1. try (RIterator<RList> iterator = list.iterator("test")) {
  2. while (iterator.hasNext()) {
  3. RList.Entry er = iterator.next();
  4. Long index = er.getIndex();
  5. byte[] value = er.getValue();
  6. }
  7. }

遍历器在使用完成后必须被关闭!!!注:迭代器实现了AutoCloseable 接口,可以利用try(iterator)自动关闭

需要注意的是:迭代器遍历的数据是不变的快照数据在迭代器遍历时,如果列表有变化,这些变化不会在迭代器遍历中体现

range(String key, long start, long end)

获取列表指定范围内的元素

blpop(String key, int num)

移出并获取列表的最早插入的num个元素

注意:其他元素的下标并不会变化

brpop(String key, int num)

移出并获取列表的最晚插入的num个元素

left(String key)

获取数组的最左元素(第一个元素)的下标

right(String key)

获取数组的最右元素(最晚插入的元素)的下标

isExist(String key)

判断键为key的Map是否存在

size(String key)

获取列表长度

getTtl(String key)

获取列表的ttl

ttl(String key, int ttl)

设置列表的ttl(秒)

delTtl(String key)

删除列表的ttl

delete(String key)

删除整个列表

deleteFast(String key)

快速删除整个列表

getKeyIterator()

获取一个遍历器,可以遍历所有的List的键。

  1. try (KeyIterator keyIterator = list.getKeyIterator()) {
  2. while (keyIterator.hasNext()) {
  3. String key = keyIterator.next();
  4. }
  5. }

遍历器在使用完成后必须被关闭!!!注:迭代器实现了AutoCloseable 接口,可以利用try(iterator)自动关闭

性能