use crate::builder::CacheBuilder;
use actix::dev::ToEnvelope;
use actix::prelude::*;
use hitbox::dev::{Delete, Get, Lock, Set};
#[cfg(feature = "metrics")]
use hitbox::metrics::{
CACHE_HIT_COUNTER, CACHE_MISS_COUNTER, CACHE_STALE_COUNTER, CACHE_UPSTREAM_HANDLING_HISTOGRAM,
};
use hitbox::settings::CacheSettings;
use hitbox::CacheError;
use hitbox_backend::Backend;
use hitbox_redis::RedisBackend;
use tracing::{debug, info};
pub struct CacheActor<B>
where
B: Backend,
{
pub(crate) settings: CacheSettings,
pub(crate) backend: Addr<B>,
}
impl<B> CacheActor<B>
where
B: Actor + Backend,
<B as Actor>::Context:
ToEnvelope<B, Get> + ToEnvelope<B, Set> + ToEnvelope<B, Lock> + ToEnvelope<B, Delete>,
{
#[allow(clippy::new_ret_no_self)]
pub async fn new() -> Result<CacheActor<RedisBackend>, CacheError> {
let backend = RedisBackend::new()
.await
.map_err(|err| CacheError::BackendError(err.into()))?
.start();
Ok(CacheBuilder::default().finish(backend))
}
pub fn builder() -> CacheBuilder<B> {
CacheBuilder::default()
}
}
impl<B> Actor for CacheActor<B>
where
B: Backend,
{
type Context = Context<Self>;
fn started(&mut self, _: &mut Self::Context) {
info!("Cache actor started");
debug!("Cache enabled: {:?}", self.settings);
}
}