如何解决Project Reactor-如何正确实施咖啡因
我正在尝试实现请求缓存,以便尽可能避免昂贵的API调用。
目前,我已经使用Caffeine实现了缓存系统,如下所示:
@Service
class CacheService {
val playlistCache: Cache<String,Playlist> = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(30,TimeUnit.SECONDS)
.build()
fun queryPlaylistCache(playlistCacheKey: String) =
Mono.justOrEmpty(playlistCache.getIfPresent(playlistCacheKey)).map<Signal<out Playlist>> { Signal.next(it) }
val userSavedSongsCache: Cache<String,List<PlaylistOrUserSavedTrack>> = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(30,TimeUnit.SECONDS).build()
}
@Service
class SpotifyRequestService(
val webClients: WebClients,val cacheService: CacheService
) {
fun getAPlaylist(Authorization: String,playlistId: String,fields: String?): Mono<Playlist> {
return CacheMono.lookup({ key: String -> cacheService.queryPlaylistCache(key) },"${playlistId}$fields")
.onCacheMissResume(
webClients.spotifyClientServiceClient.get()
.uri { uriBuilder: UriBuilder ->
uriBuilder.path("/playlists/{playlist_id}")
.queryParam("fields",fields ?: "")
.build(playlistId)
}
.header("Authorization",Authorization)
.retrieve()
.bodyToMono(Playlist::class.java)
)
.andWriteWith { key,value ->
Mono.fromRunnable { value?.get()?.let { cacheService.playlistCache.put(key,it) } } }
}
}
但是,据我了解,以这种方式实现缓存似乎不是最佳方法,因为获取/设置缓存是一项阻塞操作。
但是,在该线程中:Cache the result of a Mono from a WebClient call in a Spring WebFlux web application所选择的答案提到了为什么这是使用阻塞操作的可接受用例的原因。
有人能阐明什么是正确的解决方案吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。