Struct RefreshableWriteSynced

Source
pub struct RefreshableWriteSynced<T: Clone> { /* private fields */ }
Available on crate feature 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>

Source

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 a Refreshable 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.
Source

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.

Source

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.

Source

pub async fn refresh(&self) -> RResult<(), AnyErr>

Force a refresh of the data.

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,