sled-ext

Crates.iosled-ext
lib.rssled-ext
version0.3.4
created_at2025-10-14 02:47:08.74327+00
updated_at2025-10-15 03:56:31.112361+00
descriptionA sled extension(TTL,GET ,INSERT...)
homepage
repositoryhttps://github.com/yaobo-lab/sled-ext
max_upload_size
id1881547
size53,805
yaobo (yaobo-lab)

documentation

README

A sled extension(TTL,GET ,INSERT...)

Install

cargo add sled-ext

Example

cargo run --example demo --features=ttl

Usage

pub use bincode::{Decode, Encode};
use chrono::Local;
use serde::{Deserialize, Serialize};
use sled_ext::{KvDb, KvDbConfig, def_ttl_cleanup, set_expire_event};
use std::time::Duration;
use std::{process, sync::Arc};
use tokio::time::sleep;
use toolkit_rs::{
    logger::{self, LogConfig},
    painc::{PaincConf, set_panic_handler},
};

#[derive(Decode, Encode, Debug, Serialize, Deserialize)]
pub struct TestStruct {
    pub level: u8,
    pub size: usize,
    pub console: bool,
    pub file: String,
    pub bounded: Option<usize>,
    pub filters: Option<Vec<String>>,
}
impl Default for TestStruct {
    fn default() -> Self {
        Self {
            level: 1,
            size: 1024 * 1024,
            console: true,
            file: "log.log".to_string(),
            bounded: Some(10),
            filters: None,
        }
    }
}

#[tokio::main]
async fn main() {
    set_panic_handler(PaincConf::default());

    let cfg = LogConfig {
        filters: Some(vec!["sled".to_string()]),
        ..LogConfig::default()
    };

    logger::setup(cfg).unwrap_or_else(|e| {
        println!("log setup err:{}", e);
        process::exit(1);
    });

    let cfg = KvDbConfig {
        path: "kv_db".to_string(),
        cache_capacity: 1024 * 1024,
        flush_every_ms: 1000,
    };

    let db = KvDb::new(cfg).expect("db init failed");
    db.clean().expect(" clean failed");
    let db = Arc::new(db);
    def_ttl_cleanup(db.clone(), Some(Duration::from_secs(5)), Some(100));
    set_expire_event(db.clone(), |key| {
        let now = Local::now().format("%Y-%m-%d %H:%M:%S");
        println!("{}: expire key-->: {key}", now);
    });

    //basic
    println!("\n\n basic  test------------------->");
    let key = "hello-1";
    let v = db.get::<_, i32>(&key);
    println!("get clean key: {},value: {:?}", key, v);

    db.insert_or_update(&key, 12).expect("insert failed");
    let v = db.get::<_, i32>(&key);
    println!("get key: {},value: {:?}", key, v);
    db.insert_or_update(&key, 14).expect("insert failed");
    println!("get key: {},value: {:?}", key, v);

    //delete
    println!("\n\ndelete test------------------->");
    let key_delete = "key-delete-1";
    db.insert_or_update(&key_delete, 12).expect("insert failed");
    let v = db.get::<_, i32>(&key_delete);
    println!("get key: {},value: {:?}", key_delete, v);
    db.remove(&key_delete).expect("remove failed");
    let v = db.get::<_, i32>(&key_delete);
    println!("get key: {},value: {:?}", key_delete, v);

    //update
    println!("\n\n update test------------------->");
    let key_update = "key-update-1";
    db.insert_or_update(&key_update, 13).expect("insert failed");
    let v = db.get::<_, i32>(&key_update);
    println!("get key: {},value: {:?}", key_update, v);
    db.insert_or_update(&key_update, 14).expect("insert failed");
    let v = db.get::<_, i32>(&key_update);
    println!("get key: {},value: {:?}", key_update, v);

    //other
    println!("\n\n other test------------------->");
    let key_other = "key-other-1";
    db.insert_or_update(&key_other, 12).expect("insert failed");
    let v = db.get::<_, Vec<u8>>(&key_other);
    println!("get key_other: {},value: {:?}", key_other, v);

    let key_other2 = "key-other-2";
    db.insert_or_update(&key_other2, true)
        .expect("insert failed");
    let v = db.get::<_, Vec<u8>>(&key_other2);
    println!("get key: {},value: {:?}", key_other2, v);

    //struct
    println!("\n\n struct test------------------->");
    let struct_key = "struct-1";
    let s = TestStruct::default();
    db.insert_or_update(struct_key, &s).expect("insert failed");
    sleep(Duration::from_secs(1)).await;
    let v = db.get::<_, TestStruct>(struct_key);
    println!("get struct key: {},value: {:?}", struct_key, v);

    //ttl
    println!("\n\n ttl test------------------->");
    let ttl_key = "hello-2";
    db.insert_ttl(&ttl_key, 13, Duration::from_secs(5))
        .expect("insert failed");

    sleep(Duration::from_secs(3)).await;
    let v = db.get::<_, i32>(&ttl_key);
    println!("after 3 sec get ttl_key: {},value: {:?}", ttl_key, v);
    let ttl_v = db.get_ttl_at(&ttl_key);
    println!("get_ttl_at value: {:?}", ttl_v);

    let is_expired = db.is_expired(&ttl_key);
    println!("is_expired : {:?}", is_expired);

    let contains_key = db.contains_key(&ttl_key);
    println!("contains_key : {}", contains_key);

    sleep(Duration::from_secs(3)).await;
    let v = db.get::<_, i32>(&ttl_key);
    println!("after 3 sec get ttl_key: {},value: {:?}", ttl_key, v);

    // ttl refresh
    println!("\n\n ttl refresh test------------------->");
    let ttl_ref_key = "hello-refresh-2";
    println!("current time: {}", Local::now().format("%Y-%m-%d %H:%M:%S"));
    db.insert_ttl(&ttl_ref_key, 13, Duration::from_secs(5))
        .expect("insert failed");
    let at = db.get_ttl_at(&ttl_ref_key);
    println!("get_ttl_at: {},at: {:?}", ttl_ref_key, at);

    sleep(Duration::from_secs(3)).await;
    let at = db.get_ttl_at(&ttl_ref_key);
    println!("after 3 sec get ttl_key: {},at: {:?}", ttl_ref_key, at);

    println!(
        "refresh current time: {}",
        Local::now().format("%Y-%m-%d %H:%M:%S")
    );
    db.refresh_ttl(&ttl_ref_key, Duration::from_secs(5))
        .expect(" refresh ttl failed");
    let at = db.get_ttl_at(&ttl_ref_key);
    println!("get_ttl_at: {},at: {:?}", ttl_ref_key, at);

    sleep(Duration::from_secs(6)).await;
    std::process::exit(0);
}
Commit count: 0

cargo fmt