#cache #arc-mutex #timer-cache #cache-rs #cache-rs-timer-arc #rs-cache

safe_cache

一个 Rust 的键值缓存库,具有动态类型支持,支持多种数据类型,自动过期,并使用 Arc 和 RwLock 实现线程安全的操作

6 个版本

0.2.2 2023 年 12 月 20 日
0.2.1 2023 年 12 月 6 日
0.1.2 2023 年 12 月 4 日
0.1.1 2023 年 11 月 18 日

507 in Rust 模式

Download history 39/week @ 2024-03-09 7/week @ 2024-03-30

63 每月下载

MIT 许可证

11KB
175 代码行

SAFE_Cache

特性

  • k-v 键值缓存,v 值为泛型,支持任意类型
  • Mutex 并发安全
  • Rwlock 模式读写锁
  • 线程安全
  • 简单有效

安装

cargo add safe_cache

用法

场景 1:定义缓存及清理时间

use safe_cache::{Cache, async_cleanup_task}; // with Mutex
// use safe_cache::{CacheRwLock, async_cleanup_task_rwlock}; or rwlock
use std::sync::Arc;

async fn main() {
    let cache = Arc::new(Cache::new());

    // 启动定时任务清理内存
    let cache_clone = Arc::clone(&cache);
    async_cleanup_task(cache_clone, 10).await; // 10秒清理一次


    // 示例使用
     // 示例使用
    cache.set("number".to_string(), 42, 20);
    cache.set("list".to_string(), vec![1, 2, 3], 60);
    cache.set("text".to_string(), "Hello, Rust!".to_string(), 0); // 0代表永不过期

    println!("Value for number: {:?}", cache.get::<u16>("number"));
    println!("Value for list: {:?}", cache.get::<Vec<i32>>("list"));
    println!("Value for text: {:?}", cache.get::<Vec<i32>>("text"));

    // 休眠等待定时任务执行
    thread::sleep(Duration::from_secs(30));

    println!("After clearing expired entries:");
    println!("Value for number: {:?}", cache.get::<i32>("number"));
    println!("Value for text: {:?}", cache.get::<String>("text"));
    cache.remove("text");
    println!("Value for text: {:?}", cache.get::<String>("text"));
}

场景 2:当做全局 config 来使用,不启用清理任务

use safe_cache::Cache;
use std::sync::Arc;

fn main() {
    let cache = Arc::new(Cache::new());

    // 示例使用
     // 示例使用
    cache.set("number".to_string(), 42, 0);
    cache.set("list".to_string(), vec![1, 2, 3], 0);
    cache.set("text".to_string(), "Hello, Rust!".to_string(), 0); // 0代表永不过期

    println!("Value for number: {:?}", cache.get::<i32>("number"));
    println!("Value for list: {:?}", cache.get::<Vec<i32>>("list"));
    println!("Value for text: {:?}", cache.get::<Vec<String>>("text"));
}

概述

impl Cache<T> {
    fn set<T: 'static + Clone + Send>(&self, key: String, value: T, expire_seconds: u64);
    fn get<T: 'static + Clone>(&self, key: &str) -> Option<T>;
    fn remove(&self, key: &str);
}
impl CacheRwLock {
    fn get<T: 'static + Clone>(&self, key: &str) -> Option<T>;
    pub fn set<T: 'static + Clone + Send + Sync>(&self,key: String,value: T,expire_seconds: u64,);
    pub fn remove(&self, key: &str);
}

依赖

~2–3MB
~47K SLoC