i Получил 2 подхода, V1 и V2. V2 работает, но не v1. Я не понимаю, почему, и V2 не кажется очень эффективным, на мой взгляд. < /P>
Это не работает: < /p>
Код: Выделить всё
public Mono optimisticUpdateAllV1(List ids, Function mapper) {
// map the ids to redis keys
List keys = // ...
String[] keysArray = keys.toArray(new String[0]);
RedisReactiveCommands redisReactiveCommands = redisConnection.reactive();
return redisReactiveCommands.watch(keysArray)
.then(redisReactiveCommands.mget(keysArray).collectList())
.map(entries -> {
List oldItems = // ...
return oldItems.stream().map(mapper).toList();
})
.flatMap(newItems -> {
// map the entities back to
Map newItemsMap = // ...
return redisReactiveCommands.multi()
.flatMap(multiStatus -> {
return redisReactiveCommands.mset(newItemsMap);
})
.flatMap(mSetStatus -> {
return redisReactiveCommands.exec();
})
.flatMap(executeStatus -> {
if(executeStatus.wasDiscarded() || executeStatus.isEmpty()){
return optimisticUpdateAllV1(ids, mapper);
}
return Mono.just(newItems);
});
});
}
Код: Выделить всё
public Mono optimisticUpdateAllV2(List ids, Function mapper) {
// map the ids to redis keys
List keys = // ...
String[] keysArray = keys.toArray(new String[0]);
RedisReactiveCommands redisReactiveCommands = redisConnection.reactive();
return redisReactiveCommands.watch(keysArray)
.then(redisReactiveCommands.mget(keysArray).collectList())
.map(entries -> {
List oldItems = // ...
return oldItems.stream().map(mapper).toList();
})
.flatMap(newItems -> {
// map the entities back to
Map newItemsMap = // ...
return redisReactiveCommands.multi()
.doOnSuccess((e) -> {
redisReactiveCommands.mset(newItemsMap).subscribe();
})
.flatMap(multiStatus -> {
return redisReactiveCommands.exec();
})
.flatMap(executeStatus -> {
if(executeStatus.wasDiscarded() || executeStatus.isEmpty()){
return optimisticUpdateAllV2(ids, mapper);
}
return Mono.just(newItems);
});
});
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... a-reactive