5个不稳定版本

0.2.1 2024年4月18日
0.2.0 2024年4月18日
0.1.0 2024年4月16日
0.0.2-alpha.12023年12月27日
0.0.1 2023年12月27日

#1245数据库接口

Download history 324/week @ 2024-04-17 2/week @ 2024-05-15 4/week @ 2024-05-22 1/week @ 2024-06-05 2/week @ 2024-06-12 3/week @ 2024-07-03

180 每月下载量

MIT 许可证

62KB
928 代码行

支持多种后端的简单键值存储 Keyv通过存储适配器提供跨多种后端的键值存储的一致接口。它支持基于TTL的过期,使其适合用作缓存或持久化键值存储。

使用方法

安装

cargo add keyv

存储适配器

Keyv支持多种存储适配器,您可以通过指定功能标志来启用它们。

  • full: 启用所有可用适配器。
  • redis: Redis存储适配器。
  • postgres: PostgreSQL存储适配器。
  • mysql: MySQL存储适配器。
  • mongodb: MongoDB存储适配器。
  • sqlite: SQLite存储适配器。
cargo add keyv --features <store>

初始化

默认情况下,所有内容都存储在内存中,您也可以选择安装存储适配器。

  • 内存默认

    let keyv = Keyv::default();
    
  • Postgres

       use keyv::{adapter::postgres::PostgresStoreBuilder, Keyv};
    
       let store = PostgresStoreBuilder::new()
           .uri("postgresql://postgres:postgres@localhost:5432")
           .table_name("custom_table_name")
           .build()
           .await.unwrap();
    
       let keyv = Keyv::try_new(store).await.unwrap();
    
  • Redis

      use keyv::{adapter::redis::RedisStoreBuilder, Keyv};
    
      let store = RedisStoreBuilder::new()
          .uri("redis://127.0.0.1:6379")
          .default_ttl(3600)
          .build()
          .await
          .unwrap();
    
       let keyv = Keyv::try_new(store).await.unwrap();
    

与存储交互


use keyv::Keyv;

#[tokio::main]
async fn main() {
    let keyv = Keyv::default();
    keyv.set("number", 42).await.unwrap();
    keyv.set("number", 10).await.unwrap();
    keyv.set("array", vec!["hola", "test"]).await.unwrap();
    keyv.set("string", "life long").await.unwrap();

    match keyv.get("number").await.unwrap() {
        Some(number) => {
            let number: i32 = serde_json::from_value(number).unwrap();
            assert_eq!(number, 10);
        }
        None => assert!(false),
    }

    match keyv.get("string").await.unwrap() {
        Some(string) => {
            let string: String = serde_json::from_value(string).unwrap();
            assert_eq!(string, "life long");
        }
        None => assert!(false),
    }

    match keyv.get("array").await.unwrap() {
        Some(array) => {
            let array: Vec<String> = serde_json::from_value(array).unwrap();
            assert_eq!(array, vec!["hola".to_string(), "test".to_string()])
        }
        None => assert!(false),
    }

    match keyv.remove_many(&["number", "string"]).await {
        Ok(_) => {}
        Err(_) => assert!(false),
    }
}

依赖项

~3–22MB
~332K SLoC