Spaces:
Running
Running
neon_arch
commited on
Commit
·
4bb6c5e
1
Parent(s):
494ff27
:zap: perf: initialize vectors with capacity by default & use `Arc<T>` to partially clone memory cache struct (#603)
Browse files- src/cache/cacher.rs +28 -13
src/cache/cacher.rs
CHANGED
|
@@ -2,10 +2,9 @@
|
|
| 2 |
//! from the upstream search engines in a json format.
|
| 3 |
|
| 4 |
use error_stack::Report;
|
|
|
|
| 5 |
#[cfg(feature = "memory-cache")]
|
| 6 |
-
use
|
| 7 |
-
#[cfg(feature = "memory-cache")]
|
| 8 |
-
use mini_moka::sync::ConcurrentCacheExt;
|
| 9 |
|
| 10 |
#[cfg(feature = "memory-cache")]
|
| 11 |
use std::time::Duration;
|
|
@@ -376,13 +375,13 @@ impl Cacher for RedisCache {
|
|
| 376 |
}
|
| 377 |
}
|
| 378 |
/// TryInto implementation for SearchResults from Vec<u8>
|
| 379 |
-
use std::convert::TryInto;
|
| 380 |
|
| 381 |
impl TryInto<SearchResults> for Vec<u8> {
|
| 382 |
type Error = CacheError;
|
| 383 |
|
| 384 |
fn try_into(self) -> Result<SearchResults, Self::Error> {
|
| 385 |
-
|
| 386 |
}
|
| 387 |
}
|
| 388 |
|
|
@@ -390,7 +389,7 @@ impl TryInto<Vec<u8>> for &SearchResults {
|
|
| 390 |
type Error = CacheError;
|
| 391 |
|
| 392 |
fn try_into(self) -> Result<Vec<u8>, Self::Error> {
|
| 393 |
-
|
| 394 |
}
|
| 395 |
}
|
| 396 |
|
|
@@ -398,7 +397,16 @@ impl TryInto<Vec<u8>> for &SearchResults {
|
|
| 398 |
#[cfg(feature = "memory-cache")]
|
| 399 |
pub struct InMemoryCache {
|
| 400 |
/// The backend cache which stores data.
|
| 401 |
-
cache: MokaCache<String, Vec<u8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 402 |
}
|
| 403 |
|
| 404 |
#[cfg(feature = "memory-cache")]
|
|
@@ -408,15 +416,17 @@ impl Cacher for InMemoryCache {
|
|
| 408 |
log::info!("Initialising in-memory cache");
|
| 409 |
|
| 410 |
InMemoryCache {
|
| 411 |
-
cache:
|
| 412 |
-
|
| 413 |
-
|
|
|
|
|
|
|
| 414 |
}
|
| 415 |
}
|
| 416 |
|
| 417 |
async fn cached_results(&mut self, url: &str) -> Result<SearchResults, Report<CacheError>> {
|
| 418 |
let hashed_url_string = self.hash_url(url);
|
| 419 |
-
match self.cache.get(&hashed_url_string) {
|
| 420 |
Some(res) => self.post_process_search_results(res).await,
|
| 421 |
None => Err(Report::new(CacheError::MissingValue)),
|
| 422 |
}
|
|
@@ -427,13 +437,18 @@ impl Cacher for InMemoryCache {
|
|
| 427 |
search_results: &[SearchResults],
|
| 428 |
urls: &[String],
|
| 429 |
) -> Result<(), Report<CacheError>> {
|
|
|
|
| 430 |
for (url, search_result) in urls.iter().zip(search_results.iter()) {
|
| 431 |
let hashed_url_string = self.hash_url(url);
|
| 432 |
let bytes = self.pre_process_search_results(search_result).await?;
|
| 433 |
-
self.
|
|
|
|
|
|
|
|
|
|
| 434 |
}
|
| 435 |
|
| 436 |
-
|
|
|
|
| 437 |
Ok(())
|
| 438 |
}
|
| 439 |
}
|
|
|
|
| 2 |
//! from the upstream search engines in a json format.
|
| 3 |
|
| 4 |
use error_stack::Report;
|
| 5 |
+
use futures::future::join_all;
|
| 6 |
#[cfg(feature = "memory-cache")]
|
| 7 |
+
use moka::future::Cache as MokaCache;
|
|
|
|
|
|
|
| 8 |
|
| 9 |
#[cfg(feature = "memory-cache")]
|
| 10 |
use std::time::Duration;
|
|
|
|
| 375 |
}
|
| 376 |
}
|
| 377 |
/// TryInto implementation for SearchResults from Vec<u8>
|
| 378 |
+
use std::{convert::TryInto, sync::Arc};
|
| 379 |
|
| 380 |
impl TryInto<SearchResults> for Vec<u8> {
|
| 381 |
type Error = CacheError;
|
| 382 |
|
| 383 |
fn try_into(self) -> Result<SearchResults, Self::Error> {
|
| 384 |
+
bincode::deserialize_from(self.as_slice()).map_err(|_| CacheError::SerializationError)
|
| 385 |
}
|
| 386 |
}
|
| 387 |
|
|
|
|
| 389 |
type Error = CacheError;
|
| 390 |
|
| 391 |
fn try_into(self) -> Result<Vec<u8>, Self::Error> {
|
| 392 |
+
bincode::serialize(self).map_err(|_| CacheError::SerializationError)
|
| 393 |
}
|
| 394 |
}
|
| 395 |
|
|
|
|
| 397 |
#[cfg(feature = "memory-cache")]
|
| 398 |
pub struct InMemoryCache {
|
| 399 |
/// The backend cache which stores data.
|
| 400 |
+
cache: Arc<MokaCache<String, Vec<u8>>>,
|
| 401 |
+
}
|
| 402 |
+
|
| 403 |
+
#[cfg(feature = "memory-cache")]
|
| 404 |
+
impl Clone for InMemoryCache {
|
| 405 |
+
fn clone(&self) -> Self {
|
| 406 |
+
Self {
|
| 407 |
+
cache: self.cache.clone(),
|
| 408 |
+
}
|
| 409 |
+
}
|
| 410 |
}
|
| 411 |
|
| 412 |
#[cfg(feature = "memory-cache")]
|
|
|
|
| 416 |
log::info!("Initialising in-memory cache");
|
| 417 |
|
| 418 |
InMemoryCache {
|
| 419 |
+
cache: Arc::new(
|
| 420 |
+
MokaCache::builder()
|
| 421 |
+
.time_to_live(Duration::from_secs(config.cache_expiry_time.into()))
|
| 422 |
+
.build(),
|
| 423 |
+
),
|
| 424 |
}
|
| 425 |
}
|
| 426 |
|
| 427 |
async fn cached_results(&mut self, url: &str) -> Result<SearchResults, Report<CacheError>> {
|
| 428 |
let hashed_url_string = self.hash_url(url);
|
| 429 |
+
match self.cache.get(&hashed_url_string).await {
|
| 430 |
Some(res) => self.post_process_search_results(res).await,
|
| 431 |
None => Err(Report::new(CacheError::MissingValue)),
|
| 432 |
}
|
|
|
|
| 437 |
search_results: &[SearchResults],
|
| 438 |
urls: &[String],
|
| 439 |
) -> Result<(), Report<CacheError>> {
|
| 440 |
+
let mut tasks: Vec<_> = Vec::with_capacity(urls.len());
|
| 441 |
for (url, search_result) in urls.iter().zip(search_results.iter()) {
|
| 442 |
let hashed_url_string = self.hash_url(url);
|
| 443 |
let bytes = self.pre_process_search_results(search_result).await?;
|
| 444 |
+
let new_self = self.clone();
|
| 445 |
+
tasks.push(tokio::spawn(async move {
|
| 446 |
+
new_self.cache.insert(hashed_url_string, bytes).await
|
| 447 |
+
}));
|
| 448 |
}
|
| 449 |
|
| 450 |
+
join_all(tasks).await;
|
| 451 |
+
|
| 452 |
Ok(())
|
| 453 |
}
|
| 454 |
}
|