Оптимистичная блокировка салата Redis в Java ReactiveJAVA

Программисты JAVA общаются здесь
Anonymous
Оптимистичная блокировка салата Redis в Java Reactive

Сообщение Anonymous »

Я пытаюсь реализовать оптимистичную блокировку с клиентом салата Redis в Java Reactive в соответствии с этой статьей: https://github.com/redis/lettuce/wiki/r ... r-examples.
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);
});
});
}
И это работает, переключаясь на блокировку mset инструкции внутри multi блока, добавив onsuccess обратный вызов к multi mono.

Код: Выделить всё

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);
});
});
}
Во -первых, я не понимаю, почему он не работает с первым подходом, и, во -вторых, я не уверен, если нанести подписку () и блокируя Поток внутри mutli Block - мудрый идея.

Подробнее здесь: https://stackoverflow.com/questions/794 ... a-reactive

Вернуться в «JAVA»