如何使用批量获取从couchbase获取有序结果
我试图通过使用异步GET来提高查询couchbase视图的性能。 我已经阅读了他们关于正确方法的文档,内容如下:如何使用批量获取从couchbase获取有序结果,couchbase,rx-java,couchbase-view,Couchbase,Rx Java,Couchbase View,我试图通过使用异步GET来提高查询couchbase视图的性能。 我已经阅读了他们关于正确方法的文档,内容如下: Cluster cluster = CouchbaseCluster.create(); Bucket bucket = cluster.openBucket(); List<JsonDocument> foundDocs = Observable .just("key1", "key2", "key3", "key4", "key5") .flatMap(new F
Cluster cluster = CouchbaseCluster.create();
Bucket bucket = cluster.openBucket();
List<JsonDocument> foundDocs = Observable
.just("key1", "key2", "key3", "key4", "key5")
.flatMap(new Func1<String, Observable<JsonDocument>>() {
@Override
public Observable<JsonDocument> call(String id) {
return bucket.async().get(id);
}
})
.toList()
.toBlocking()
.single();
Cluster Cluster=CouchbaseCluster.create();
Bucket=cluster.openBucket();
列表foundDocs=可观察
.just(“键1”、“键2”、“键3”、“键4”、“键5”)
.flatMap(新函数1(){
@凌驾
公共可观察调用(字符串id){
返回bucket.async().get(id);
}
})
托利斯先生()
.toBlocking()
.single();
它工作得又快又好,但是因为我依赖于结果的顺序,所以我似乎需要做一些额外的工作来保持结果的顺序。
在上面的示例中,JsonDocument列表包含所有5个文档,但顺序在调用之间随机变化。
使用JavaRx功能或couchbase Java SDK功能,是否有任何优雅的方式来排序结果
我能想到的唯一解决方案是将结果保存到HashMap中,然后使用此HashMap将原始ID列表转换为JsonDocuments的有序列表。我将使用Zip运算符将所有可观察对象压缩,然后在它们完成后将文档结果添加到列表中
@Test
public void zipObservables() {
Observable<String> oKey1 = Observable.just("key1").doOnNext(getDocument());
Observable<String> oKey2 = Observable.just("key2").doOnNext(getDocument());
Observable<String> oKey3 = Observable.just("key3").doOnNext(getDocument());
Observable<String> oKey4 = Observable.just("key4").doOnNext(getDocument());
List<Observable<String>> observables = Arrays.asList(oKey1,oKey2,oKey3,oKey4);
List<Object> foundDocs = Observable.zip(observables, Arrays::asList)
.toBlocking()
.single();
}
private Action1<String> getDocument() {
return id -> bucket.async().get(id);
}
@测试
public void zipObservables(){
OKEBSABLE oKey1=可观察的.just(“key1”).doOnNext(getDocument());
OKEBSABLE oKey2=可观测的.just(“key2”).doOnNext(getDocument());
Okebservable oKey3=可观察的.just(“key3”).doOnNext(getDocument());
Okebservable oKey4=可观察的.just(“key4”).doOnNext(getDocument());
List observables=Arrays.asList(oKey1,oKey2,oKey3,oKey4);
List foundDocs=Observable.zip(Observable,array::asList)
.toBlocking()
.single();
}
私有操作1 getDocument(){
返回id->bucket.async().get(id);
}
您可以在这里看到更多的Zip示例,而不是
flatMap
,您可以使用:
:将保留顺序,但实际上要等待每个内部concatMap
完成,然后再触发下一个(可能会恢复为顺序执行,性能会降低)GET
:将立即订阅内部可观察对象(因此触发内部concatmapanger
)。通过缓冲无序到达的响应来维持顺序,直到它们可以在序列中的正确索引处重放。在订购和性能方面,两者都是最好的GET