简介
sled = "0.32"
例子
打开数据库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();
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");// 初始化一个ValueSome(sled::IVec::from(Value { count: U64::new(0), whatever: [0; 16] }.as_bytes(),))}})?;
小结
文章转载自Rust语言中文社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




