tikv / agatedb

A persistent key-value storage in rust.
Apache License 2.0
829 stars 74 forks source link

为什么db.update中set的key-value不生效? #180

Closed gcxfd closed 2 years ago

gcxfd commented 2 years ago

运行程序 https://github.com/rmw-lib/agatedb/tree/cli/examples

    db.update(|tx| {
        use agatedb::{key_with_ts, util::unix_time};
        use bytes::BytesMut;
        let key = key_with_ts(BytesMut::from("3"), unix_time());
        tx.set(key, "2".into())
    })?;

然后读取,读取不到

但是这样写入就可以读取到

    pub fn set(&self, key: impl Into<BytesMut>, value: impl Into<Bytes>) -> Result<()> {
        use crate::util::unix_time;
        let key = key_with_ts(key.into(), unix_time());
        let req = Request {
            entries: vec![Entry::new(key, value.into())],
            ptrs: vec![],
            done: None,
        };
        self.write_to_lsm(req)
    }

get函数定义如下

    pub fn get(&self, key: impl Into<BytesMut>) -> Result<Value> {
        let key = key_with_ts(key.into(), std::u64::MAX);
        self.core.get(&key)
    }

运行演示 截图如下

image

write_to_lsm我感觉是一个写入磁盘操作,是不是Transaction执行之后也需要手工运行个什么来写入磁盘?难道数据库被drop的时候不会自动写入磁盘吗?

我记得redis和rocksdb都一个设置,可以配置落盘的周期,比如让程序每3秒钟落盘一次,有这样的配置吗?

gcxfd commented 2 years ago

我发现了,不能用key_with_ts