cache_any/caches/
memory.rs

1use std::ops::{Deref, DerefMut};
2use std::sync::Arc;
3use std::collections::HashMap;
4use std::fmt::Debug;
5use tokio::sync::RwLock;
6use crate::Cacheable;
7use crate::Cache;
8
9/// Cache using memory.
10/// 
11/// Data is stored in memory. However, this cache will serialize and deserialize data,
12/// so it may not be so efficient.
13/// 
14/// [`MemoryCache`] implements [`Cache`]. See [`Cache`] for more details.
15/// 
16/// ## Example
17/// 
18/// ```rust
19/// let cache = MemoryCache::default();
20/// 
21/// cache.set("a", 1).await.unwrap();
22/// assert_eq!(cache.get::<u8>("a").await.unwrap().unwrap(), 1);
23/// ```
24#[derive(Debug, Clone)]
25pub struct MemoryCache {
26    inner: Arc<RwLock<Inner>>,
27}
28
29impl Default for MemoryCache
30{
31    fn default() -> Self {
32        Self::new()
33    }
34}
35
36impl MemoryCache
37{
38    pub fn new() -> Self {
39        Self::with_capacity(0)
40    }
41    
42    pub fn with_capacity(cap: usize) -> Self {
43        Self {
44            inner: Arc::new(RwLock::new(Inner {
45                map: HashMap::with_capacity(cap),
46            }))
47        }
48    }
49}
50
51#[async_trait::async_trait]
52impl Cache for MemoryCache
53{
54    async fn get<T: Cacheable + Send + Sync>(&self, key: &str) -> anyhow::Result<Option<T>> {
55        let inner = self.inner.read().await;
56        let ret = inner.get(key.as_bytes())
57            .map(|val| val.as_slice())
58            .map(T::from_bytes)
59            .transpose()?;
60
61        Ok(ret)
62    }
63
64    async fn set<T: Cacheable + Send + Sync>(&self, key: &str, value: T) -> anyhow::Result<()> {
65        let bytes = value.to_bytes();
66
67        let mut inner = self.inner.write().await;
68        inner.insert(key.as_bytes().to_vec(), bytes);
69
70        Ok(())
71    }
72
73    async fn delete(&self, key: &str) -> anyhow::Result<()> {
74        let mut inner = self.inner.write().await;
75        inner.remove(key.as_bytes());
76
77        Ok(())
78    }
79
80    async fn len(&self) -> anyhow::Result<usize> {
81        let inner = self.inner.read().await;
82        Ok(inner.len())
83    }
84}
85
86#[derive(Debug)]
87struct Inner {
88    map: HashMap<Vec<u8>, Vec<u8>>,
89}
90
91impl Deref for Inner
92{
93    type Target = HashMap<Vec<u8>, Vec<u8>>;
94
95    fn deref(&self) -> &Self::Target {
96        &self.map
97    }
98}
99
100impl DerefMut for Inner
101{
102    fn deref_mut(&mut self) -> &mut Self::Target {
103        &mut self.map   
104    }
105}
106
107#[cfg(test)]
108mod tests {
109    use super::*;
110
111    #[tokio::test]
112    async fn test_memory_cache() -> anyhow::Result<()> {
113        let cache = MemoryCache::default();
114
115        let len = cache.len().await?;
116        assert_eq!(len, 0);
117
118        cache.set("a", 1).await?;
119        cache.set("b", vec![0u8, 1u8, 2u8, 4u8]).await?;
120        cache.set("c", String::from("ccc")).await?;
121
122        assert_eq!(cache.get::<u8>("a").await?.unwrap(), 1u8);
123        assert_eq!(cache.get::<Vec<u8>>("b").await?.unwrap(), vec![0u8, 1u8, 2u8, 4u8]);
124        assert_eq!(cache.get::<String>("c").await?.unwrap(), String::from("ccc"));
125        assert_eq!(cache.get::<String>("d").await?, None);
126
127        let nc = cache.clone();
128        assert_eq!(cache.get::<u8>("a").await?.unwrap(), 1u8);
129        assert_eq!(cache.get::<Vec<u8>>("b").await?.unwrap(), vec![0u8, 1u8, 2u8, 4u8]);
130        assert_eq!(cache.get::<String>("c").await?.unwrap(), String::from("ccc"));
131        assert_eq!(cache.get::<String>("d").await?, None);
132        assert_eq!(nc.len().await.unwrap(), 3);
133
134        assert_eq!(cache.get::<()>("non-existent-key").await?, None);
135
136        Ok(())
137    }
138}