Skip to content

Latest commit

 

History

History

write-behind-rxjava

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Using RxJava observable sequences, you can asynchronously write to an external resource after updating the cache. This approach offers a potential performance boost by batching write operations, albeit with a trade-off of potential data inconsistency.

A buffer operator gathers changes within a specified time window. This window may encompass multiple updates to the same key so when merging these changes into a single write any outdated modifications can be discarded. Subsequently, the subscriber is notified to execute the batch operation.

var subject = PublishSubject.<Entry<K, V>>create().toSerialized();
subject.buffer(1, TimeUnit.SECONDS)
    .map(entries -> entries.stream().collect(
        toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v2)))
    .subscribeOn(Schedulers.io())
    .subscribe(System.out::println);

Cache<K, V> cache = Caffeine.newBuilder().build();
cache.asMap().compute(key, (k, v) -> {
  var value = /* mutations */
  subject.onNext(Map.entry(key, value));
  return value;
});