0
0
mirror of https://github.com/neon-mmd/websurfx.git synced 2024-10-18 06:22:53 -04:00

Config option to customize the cache invalidation/expiry time (#403)

This commit is contained in:
Ashwin Vinod 2023-11-30 17:39:17 +05:30 committed by GitHub
parent 3c6632246e
commit 5a8d61f231
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 6 deletions

7
src/cache/cacher.rs vendored
View File

@ -79,7 +79,7 @@ impl Cacher for RedisCache {
"Initialising redis cache. Listening to {}", "Initialising redis cache. Listening to {}",
&config.redis_url &config.redis_url
); );
RedisCache::new(&config.redis_url, 5) RedisCache::new(&config.redis_url, 5, config.cache_expiry_time)
.await .await
.expect("Redis cache configured") .expect("Redis cache configured")
} }
@ -113,13 +113,12 @@ pub struct InMemoryCache {
#[cfg(feature = "memory-cache")] #[cfg(feature = "memory-cache")]
#[async_trait::async_trait] #[async_trait::async_trait]
impl Cacher for InMemoryCache { impl Cacher for InMemoryCache {
async fn build(_config: &Config) -> Self { async fn build(config: &Config) -> Self {
log::info!("Initialising in-memory cache"); log::info!("Initialising in-memory cache");
InMemoryCache { InMemoryCache {
cache: MokaCache::builder() cache: MokaCache::builder()
.max_capacity(1000) .time_to_live(Duration::from_secs(config.cache_expiry_time.into()))
.time_to_live(Duration::from_secs(60))
.build(), .build(),
} }
} }

View File

@ -18,6 +18,8 @@ pub struct RedisCache {
pool_size: u8, pool_size: u8,
/// It stores the index of which connection is being used at the moment. /// It stores the index of which connection is being used at the moment.
current_connection: u8, current_connection: u8,
/// It stores the max TTL for keys.
cache_ttl: u16,
} }
impl RedisCache { impl RedisCache {
@ -36,6 +38,7 @@ impl RedisCache {
pub async fn new( pub async fn new(
redis_connection_url: &str, redis_connection_url: &str,
pool_size: u8, pool_size: u8,
cache_ttl: u16,
) -> Result<Self, Box<dyn std::error::Error>> { ) -> Result<Self, Box<dyn std::error::Error>> {
let client = Client::open(redis_connection_url)?; let client = Client::open(redis_connection_url)?;
let mut tasks: Vec<_> = Vec::new(); let mut tasks: Vec<_> = Vec::new();
@ -48,6 +51,7 @@ impl RedisCache {
connection_pool: try_join_all(tasks).await?, connection_pool: try_join_all(tasks).await?,
pool_size, pool_size,
current_connection: Default::default(), current_connection: Default::default(),
cache_ttl,
}; };
Ok(redis_cache) Ok(redis_cache)
} }
@ -121,7 +125,7 @@ impl RedisCache {
let mut result: Result<(), RedisError> = self.connection_pool let mut result: Result<(), RedisError> = self.connection_pool
[self.current_connection as usize] [self.current_connection as usize]
.set_ex(key, json_results, 600) .set_ex(key, json_results, self.cache_ttl.into())
.await; .await;
// Code to check whether the current connection being used is dropped with connection error // Code to check whether the current connection being used is dropped with connection error

View File

@ -21,6 +21,9 @@ pub struct Config {
/// It stores the redis connection url address on which the redis /// It stores the redis connection url address on which the redis
/// client should connect. /// client should connect.
pub redis_url: String, pub redis_url: String,
#[cfg(any(feature = "redis-cache", feature = "memory-cache"))]
/// It stores the max TTL for search results in cache.
pub cache_expiry_time: u16,
/// It stores the option to whether enable or disable production use. /// It stores the option to whether enable or disable production use.
pub aggregator: AggregatorConfig, pub aggregator: AggregatorConfig,
/// It stores the option to whether enable or disable logs. /// It stores the option to whether enable or disable logs.
@ -93,6 +96,19 @@ impl Config {
} }
}; };
#[cfg(any(feature = "redis-cache", feature = "memory-cache"))]
let parsed_cet = globals.get::<_, u16>("cache_expiry_time")?;
let cache_expiry_time = match parsed_cet {
0..=59 => {
log::error!(
"Config Error: The value of `cache_expiry_time` must be greater than 60"
);
log::error!("Falling back to using the value `60` for the option");
60
}
_ => parsed_cet,
};
Ok(Config { Ok(Config {
port: globals.get::<_, u16>("port")?, port: globals.get::<_, u16>("port")?,
binding_ip: globals.get::<_, String>("binding_ip")?, binding_ip: globals.get::<_, String>("binding_ip")?,
@ -116,6 +132,8 @@ impl Config {
time_limit: rate_limiter["time_limit"], time_limit: rate_limiter["time_limit"],
}, },
safe_search, safe_search,
#[cfg(any(feature = "redis-cache", feature = "memory-cache"))]
cache_expiry_time,
}) })
} }
} }

View File

@ -47,7 +47,7 @@ theme = "simple" -- the theme name which should be used for the website
-- ### Caching ### -- ### Caching ###
redis_url = "redis://127.0.0.1:8082" -- redis connection url address on which the client should connect on. redis_url = "redis://127.0.0.1:8082" -- redis connection url address on which the client should connect on.
cache_expiry_time = 600 -- This option takes the expiry time of the search results (value in seconds and the value should be greater than or equal to 60 seconds).
-- ### Search Engines ### -- ### Search Engines ###
upstream_search_engines = { upstream_search_engines = {
DuckDuckGo = true, DuckDuckGo = true,