fast-cache 0.1.0

Embedded-first thread-per-core in-memory cache with optional Redis-compatible server
Documentation
use super::*;

impl WorkerLocalEmbeddedStore {
    pub fn get(&mut self, key: &[u8]) -> Option<Bytes> {
        self.get_if_local(key)
            .expect("worker-local embedded store key does not belong to this thread")
    }

    pub fn get_if_local(&mut self, key: &[u8]) -> Result<Option<Bytes>, LocalRouteError> {
        self.local_key_route(key)?;
        Ok(self.inner.local_get(key))
    }

    pub fn get_view<'a>(&'a mut self, key: &[u8]) -> WorkerLocalReadView<'a> {
        self.get_view_if_local(key)
            .expect("worker-local embedded store key does not belong to this thread")
    }

    #[inline(always)]
    pub fn get_owned_view_local(&mut self, key: &[u8]) -> OwnedEmbeddedReadView {
        self.inner.get_view(key)
    }

    pub fn get_view_if_local<'a>(
        &'a mut self,
        key: &[u8],
    ) -> Result<WorkerLocalReadView<'a>, LocalRouteError> {
        let route = self.local_key_route(key)?;
        Ok(WorkerLocalReadView {
            item: self
                .inner
                .local_get_slice_routed(route, key)
                .map(WorkerLocalReadSlice::from_embedded),
        })
    }

    #[inline(always)]
    pub fn get_view_routed_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> WorkerLocalReadView<'a> {
        debug_assert!(self.owns_shard(route.shard_id));
        WorkerLocalReadView {
            item: self
                .inner
                .local_get_slice_routed(route, key)
                .map(WorkerLocalReadSlice::from_embedded),
        }
    }

    #[inline(always)]
    pub fn get_view_routed_no_ttl<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> WorkerLocalReadView<'a> {
        self.get_view_routed_no_ttl_local(route, key)
    }

    #[inline(always)]
    pub fn get_view_routed_no_ttl_if_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> Result<WorkerLocalReadView<'a>, LocalRouteError> {
        self.ensure_local_route(route)?;
        Ok(WorkerLocalReadView {
            item: self
                .inner
                .local_get_slice_routed_no_ttl(route, key)
                .map(WorkerLocalReadSlice::from_embedded),
        })
    }

    #[inline(always)]
    pub fn get_point_view_routed_no_ttl_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> WorkerLocalReadView<'a> {
        debug_assert!(self.owns_shard(route.shard_id));
        WorkerLocalReadView {
            item: self
                .inner
                .local_get_point_ref_routed_no_ttl(route, key)
                .map(WorkerLocalReadSlice::from_local_slice),
        }
    }

    #[inline(always)]
    pub fn get_point_ref_routed_no_ttl_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> Option<&'a [u8]> {
        debug_assert!(self.owns_shard(route.shard_id));
        self.inner.local_get_point_ref_routed_no_ttl(route, key)
    }

    #[inline(always)]
    pub fn get_prepared_point_view_no_ttl_local<'a>(
        &'a mut self,
        prepared: &PreparedPointKey,
    ) -> WorkerLocalReadView<'a> {
        debug_assert!(self.owns_shard(prepared.route().shard_id));
        WorkerLocalReadView {
            item: self
                .inner
                .local_get_point_ref_prepared_routed_no_ttl(prepared)
                .map(WorkerLocalReadSlice::from_local_slice),
        }
    }

    #[inline(always)]
    pub fn get_prepared_point_ref_no_ttl_local<'a>(
        &'a mut self,
        prepared: &PreparedPointKey,
    ) -> Option<&'a [u8]> {
        debug_assert!(self.owns_shard(prepared.route().shard_id));
        self.inner
            .local_get_point_ref_prepared_routed_no_ttl(prepared)
    }

    #[inline(always)]
    pub fn get_view_routed_no_ttl_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> WorkerLocalReadView<'a> {
        debug_assert!(self.owns_shard(route.shard_id));
        WorkerLocalReadView {
            item: self
                .inner
                .local_get_ref_routed_no_ttl(route, key)
                .map(WorkerLocalReadSlice::from_local_slice),
        }
    }

    #[inline(always)]
    pub fn get_ref_routed_no_ttl_if_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> Result<Option<&'a [u8]>, LocalRouteError> {
        self.ensure_local_route(route)?;
        Ok(self.inner.local_get_ref_routed_no_ttl(route, key))
    }

    #[inline(always)]
    pub fn get_ref_routed_no_ttl_local<'a>(
        &'a mut self,
        route: EmbeddedKeyRoute,
        key: &[u8],
    ) -> Option<&'a [u8]> {
        debug_assert!(self.owns_shard(route.shard_id));
        self.inner.local_get_ref_routed_no_ttl(route, key)
    }

    pub fn batch_get(&mut self, keys: Vec<Bytes>) -> Vec<Option<Bytes>> {
        self.batch_get_if_local(keys)
            .expect("worker-local embedded store batch includes keys owned by another thread")
    }

    pub fn batch_get_if_local(
        &mut self,
        keys: Vec<Bytes>,
    ) -> Result<Vec<Option<Bytes>>, LocalRouteError> {
        self.ensure_local_keys(&keys)?;
        Ok(keys
            .into_iter()
            .map(|key| self.inner.local_get(&key))
            .collect::<Vec<_>>())
    }

    pub fn batch_get_view<'a>(&'a mut self, keys: &[Bytes]) -> WorkerLocalBatchReadView<'a> {
        self.batch_get_view_if_local(keys)
            .expect("worker-local embedded store batch includes keys owned by another thread")
    }

    #[inline(always)]
    pub fn batch_get_owned_view_local(&mut self, keys: &[Bytes]) -> OwnedEmbeddedBatchReadView {
        self.inner.batch_get_view(keys)
    }

    pub fn batch_get_view_if_local<'a>(
        &'a mut self,
        keys: &[Bytes],
    ) -> Result<WorkerLocalBatchReadView<'a>, LocalRouteError> {
        self.ensure_local_keys(keys)?;
        Ok(worker_local_batch_view_from_embedded(
            self.inner.local_batch_get_slices(keys),
        ))
    }

    pub fn batch_get_session_view<'a>(
        &'a mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> WorkerLocalSessionBatchView<'a> {
        self.batch_get_session_view_if_local(session_prefix, keys)
            .expect("worker-local embedded store session does not belong to this thread")
    }

    pub fn batch_get_session_view_if_local<'a>(
        &'a mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> Result<WorkerLocalSessionBatchView<'a>, LocalRouteError> {
        let key_hashes = keys
            .iter()
            .map(|key| crate::storage::hash_key(key))
            .collect::<Vec<_>>();
        self.batch_get_session_view_prehashed_if_local(session_prefix, keys, &key_hashes)
    }

    #[inline(always)]
    pub fn batch_get_session_owned_view_local(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> OwnedEmbeddedBatchReadView {
        self.inner.batch_get_session_view(session_prefix, keys)
    }

    pub fn batch_get_session_view_prehashed_if_local<'a>(
        &'a mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
        key_hashes: &[u64],
    ) -> Result<WorkerLocalSessionBatchView<'a>, LocalRouteError> {
        self.local_session_route(session_prefix)?;
        Ok(worker_local_batch_view_from_embedded(
            self.inner
                .local_batch_get_session_slices_prehashed(session_prefix, keys, key_hashes),
        ))
    }

    #[inline(always)]
    pub fn batch_get_session_owned_view_prehashed_local(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
        key_hashes: &[u64],
    ) -> OwnedEmbeddedBatchReadView {
        self.inner
            .batch_get_session_view_prehashed(session_prefix, keys, key_hashes)
    }

    pub fn batch_get_session_packed(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> PackedBatch {
        self.batch_get_session_packed_if_local(session_prefix, keys)
            .expect("worker-local embedded store session does not belong to this thread")
    }

    pub fn batch_get_session_packed_if_local(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> Result<PackedBatch, LocalRouteError> {
        self.local_session_route(session_prefix)?;
        Ok(self.inner.batch_get_session_packed(session_prefix, keys))
    }

    pub fn batch_get_session_packed_view(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> Option<OwnedEmbeddedSessionPackedView> {
        self.batch_get_session_packed_view_if_local(session_prefix, keys)
            .expect("worker-local embedded store session does not belong to this thread")
    }

    pub fn batch_get_session_packed_view_if_local(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
    ) -> Result<Option<OwnedEmbeddedSessionPackedView>, LocalRouteError> {
        let key_hashes = keys
            .iter()
            .map(|key| crate::storage::hash_key(key))
            .collect::<Vec<_>>();
        self.batch_get_session_packed_view_prehashed_if_local(session_prefix, keys, &key_hashes)
    }

    pub fn batch_get_session_packed_view_prehashed_if_local(
        &mut self,
        session_prefix: &[u8],
        keys: &[Bytes],
        key_hashes: &[u64],
    ) -> Result<Option<OwnedEmbeddedSessionPackedView>, LocalRouteError> {
        self.local_session_route(session_prefix)?;
        Ok(self
            .inner
            .batch_get_session_packed_view_prehashed(session_prefix, keys, key_hashes))
    }

    pub fn batch_get_packed(&mut self, keys: &[Bytes]) -> PackedBatch {
        self.batch_get_packed_if_local(keys)
            .expect("worker-local embedded store batch includes keys owned by another thread")
    }

    pub fn batch_get_packed_if_local(
        &mut self,
        keys: &[Bytes],
    ) -> Result<PackedBatch, LocalRouteError> {
        self.ensure_local_keys(keys)?;
        Ok(self.inner.batch_get_packed(keys))
    }
}