前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust每周一库】sled - 嵌入式数据库

【Rust每周一库】sled - 嵌入式数据库

作者头像
MikeLoveRust
发布2020-06-04 15:21:13
1.5K0
发布2020-06-04 15:21:13
举报

简介

Sled是基于Bw树构建的嵌入式KV数据库,其API接近于一个线程安全的BTreeMap<[u8], [u8]>。而其Bw树的数据结构加上包括crossbeam-epoch的“GC”等技术,使得Sled成为一个lock-free的数据库而在并发环境中傲视群雄。忘记那些慢吞吞的锁吧~ 而官方宣称在一台16核的机器上,在一个小数据集上可以达到每分钟10亿次操作(95%读核5%写)

要使用sled,只需要在Cargo.toml中加入

代码语言:javascript
复制
sled = "0.32"

例子

基础用法

代码语言:javascript
复制
打开数据库
let tree = sled::open("/tmp/welcome-to-sled").expect("open");

// 插入KV,读取Key对应的值
tree.insert("KEY1", "VAL1");
assert_eq!(tree.get(&"KEY1"), Ok(Some(sled::IVec::from("VAL1"))));

// 范围查询
for kv in tree.range("KEY1".."KEY9") {
    ...
}

// 删除
tree.remove(&"KEY1");

// atomic compare and swap,可以用在并发编程中
tree.compare_and_swap("KEY1", Some("VAL1"), Some("VAL2"));

// 阻塞直到所有修改都写入硬盘
tree.flush();

处理结构体

代码语言:javascript
复制
use {
    byteorder::{BigEndian, LittleEndian},
    zerocopy::{
        byteorder::U64, AsBytes, FromBytes, LayoutVerified, Unaligned,
    },
};

//  键结构体
//  zerocopy::byteorder::U64保证了数据对齐问题
#[derive(FromBytes, AsBytes, Unaligned)]
#[repr(C)]
struct Key {
    a: U64<BigEndian>,
    b: U64<BigEndian>,
}

// 值结构体
#[derive(FromBytes, AsBytes, Unaligned)]
#[repr(C)]
struct Value {
    count: U64<LittleEndian>,
    whatever: [u8; 16],
}

let key = Key { a: U64::new(21), b: U64::new(890) };

// 取得键所对应的值,并对其施加给定函数灿做
db.update_and_fetch(key.as_bytes(), |value_opt| {
    if let Some(existing) = value_opt {
        let mut backing_bytes = sled::IVec::from(existing);

        // 验证数据对齐(这里其实不是必须的,因为我们使用了U64)
        let layout: LayoutVerified<&mut [u8], Value> =
            LayoutVerified::new_unaligned(&mut *backing_bytes)
                .expect("bytes do not fit schema");

        // 得到底层数据的可变引用
        let value: &mut Value = layout.into_mut();

        let new_count = value.count.get() + 1;

        println!("incrementing count to {}", new_count);

        value.count.set(new_count);

        Some(backing_bytes)
    } else {
        println!("setting count to 0");

        //  初始化一个Value
        Some(sled::IVec::from(
            Value { count: U64::new(0), whatever: [0; 16] }.as_bytes(),
        ))
    }
})?;

小结

Sled是当前Rust嵌入式数据库中有力的候选人之一。当然,除了还处于beta版这一问题外,sled有时还会消耗较多的存储(这一点是比起RocksDB的不足之处)。人无完人嘛,让我们一起期待其稳定版早日上线~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子
  • 小结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档