cqengine中的索引集合类区别
1. IndexedCollection的不同实现
CQEngine的索引集合有三种支持不同并发和事务隔离的实现:
1.1 ConcurrentIndexedCollection
- 实现自
IndexedCollection
- 没有事务隔离
addIndex
方法可以添加查询使用的索引,提高查询效率- 当增加元素时,可以自动更新索引
- 读与读之间线程安全(任何时候)
- 写与写(操作collection中不同对象)(
add
/remove
)之间线程安全 - 当多个线程尝试
add
或remove
本collection中同一个元素对象(同一个实例或者是hashcode
相同且equals
方法返回true
)时,线程不安全。此时可能会因为索引不同步,从而导致不一致的结果。此时应该使用其子类ObjectLockingIndexedCollection
,可以使得写与写在任何时候都线程安全。
1.2 ObjectLockingIndexedCollection
- 继承自
ConcurrentIndexedCollection
- 无锁的并发读
- 有锁的写(对象层级的事务隔离和一致性保证)。特别是对多线程add/remove同一个对象设计了专门的锁机制保证线程安全
- 并发控制原理是
striped lock
1.3 TransactionalIndexedCollection
- 继承自
ConcurrentIndexedCollection
- 无锁的并发读
- 有序的写(通过MVCC实现完整的
READ_COMMITTED
级别事务隔离)。特别是对多线程add/remove同一个对象设计了专门的锁机制保证线程安全 - 并发控制原理是
MVCC
2.支持的索引类型有:
HashIndex,NavigableIndex,RadixTreeIndex,ReversedRadixTreeIndex,InvertedRadixTreeIndex,SuffixTreeIndex
HashIndex:
索引依赖ConcurrentHashMap ,适用于Equal 来比较。一般适用于字段为字符串,枚举。
NavigableIndex:
依赖ConcurrentSkipListMap,适用于Equal,LessThan,GreaterThan,Between;一般适用于字段为数字类型。
RadixTreeIndex:
依赖ConcurrentRadixTree,适用于Equal,StringStartsWith ;一般适用于字段为字符串需要StartsWith模糊匹配。
ReversedRadixTreeIndex:
依赖ConcurrentReversedRadixTree,适用于Equal,StringEndsWith;一般适用于字段为符串需要EndsWith模糊匹配。
InvertedRadixTreeIndex:
依赖ConcurrentInvertedRadixTree,适用于Equal,StringIsContainedIn;一般适用于字段为字符串是否包含XX字符char
SuffixTreeIndex:
依赖ConcurrentSuffixTree,适用于Equal,StringEndsWith,StringContains ; 一般适用于字段为需要 in(a,b,c....),容器是否包含字符串string。