pub struct RefreshableWriteSynced<T: Clone> { /* private fields */ }
redis
only.Expand description
A data wrapper that automatically updates the data given out when deemed stale. The data is set to refresh at a certain interval (triggered on access), or can be forcefully refreshed.
Implementations§
Source§impl<T: Clone> RefreshableWriteSynced<T>
impl<T: Clone> RefreshableWriteSynced<T>
Sourcepub fn new<FutGet: Future<Output = RResult<T, AnyErr>> + Send + 'static, FutSet: Future<Output = RResult<(), AnyErr>> + Send + 'static>(
redis: &Redis,
redis_namespace: impl Into<String>,
redis_key: impl Into<String>,
force_refresh_every: TimeDelta,
getter: impl Fn() -> FutGet + 'static + Send + Sync,
setter: impl Fn(T) -> FutSet + 'static + Send + Sync,
) -> RResult<Self, AnyErr>
pub fn new<FutGet: Future<Output = RResult<T, AnyErr>> + Send + 'static, FutSet: Future<Output = RResult<(), AnyErr>> + Send + 'static>( redis: &Redis, redis_namespace: impl Into<String>, redis_key: impl Into<String>, force_refresh_every: TimeDelta, getter: impl Fn() -> FutGet + 'static + Send + Sync, setter: impl Fn(T) -> FutSet + 'static + Send + Sync, ) -> RResult<Self, AnyErr>
Creates a new refreshable data wrapper. This will only call the getter on first access, not on instanstiation.
Arguments:
redis
: The redis wrapper itself needed for dlocking.redis_namespace
: The namespace to use for the redis key when locking during setting.redis_key
: The key to use for the redis key when locking during setting.force_refresh_every
: The interval for forceful data should be refreshed. For when something other than aRefreshable
container updates, but still good as a backup.getter
: A function that returns a future that resolves to the data.setter
: A function that updates the source with new data.
Sourcepub fn on_mutate(
self,
on_mutate: impl Fn(&mut T) -> RResult<(), AnyErr> + 'static + Send + Sync,
) -> Self
pub fn on_mutate( self, on_mutate: impl Fn(&mut T) -> RResult<(), AnyErr> + 'static + Send + Sync, ) -> Self
Do something whenever a mutation happens, useful to hook in other mutations while a mut self is available.
Sourcepub async fn mutate<R, E>(
&self,
conn: &impl RedisConnLike,
mutator: impl FnOnce(&mut T) -> Result<R, E>,
) -> RResult<Result<R, E>, AnyErr>
pub async fn mutate<R, E>( &self, conn: &impl RedisConnLike, mutator: impl FnOnce(&mut T) -> Result<R, E>, ) -> RResult<Result<R, E>, AnyErr>
Update the data in the refreshable with key features:
- Locks the source using a redis dlock for the duration of the update.
- Refreshes the data before the update inside the locked section, to make sure you’re doing the update on the latest data and not overwriting changes.
- Updates the setter, thanks to above guaranteed no sibling node overwrites etc.
NOTE: returns a double result to allow custom internal error types to be passed out.
Sourcepub async fn get(
&self,
conn: &impl RedisConnLike,
) -> RResult<RefreshableGuard<Arc<T>>, AnyErr>
pub async fn get( &self, conn: &impl RedisConnLike, ) -> RResult<RefreshableGuard<Arc<T>>, AnyErr>
Get the underlying data for use. If the data is stale, it will be refreshed before returning.
NOTE: the implementation of the guards means not too many should be alive at once, and keeping across await points should be discouraged. If you need long access to the underlying data, consider cloning it.
Auto Trait Implementations§
impl<T> !Freeze for RefreshableWriteSynced<T>
impl<T> !RefUnwindSafe for RefreshableWriteSynced<T>
impl<T> Send for RefreshableWriteSynced<T>
impl<T> Sync for RefreshableWriteSynced<T>
impl<T> Unpin for RefreshableWriteSynced<T>
impl<T> !UnwindSafe for RefreshableWriteSynced<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request