cqengine中的索引集合类区别

cqengine中的索引集合类区别

1. IndexedCollection的不同实现

CQEngine的索引集合有三种支持不同并发和事务隔离的实现:

 1.1 ConcurrentIndexedCollection

  • 实现自IndexedCollection
  • 没有事务隔离
  • addIndex方法可以添加查询使用的索引,提高查询效率
  • 当增加元素时,可以自动更新索引
  • 读与读之间线程安全(任何时候)
  • 写与写(操作collection中不同对象)(add/remove)之间线程安全
  • 当多个线程尝试addremove本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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值