|
An embedded database.
let tree = sled::open("/tmp/welcome-to-sled")?;
// insert and get, similar to std's BTreeMap
let old_value = tree.insert("key", "value")?;
assert_eq!(
tree.get(&"key")?,
Some(sled::IVec::from("value")),
);
// range queries
for kv_result in tree.range("key_1".."key_9") {}
// deletion
let old_value = tree.remove(&"key")?;
// atomic compare and swap
tree.compare_and_swap(
"key",
Some("current_value"),
Some("new_value"),
)?;
// block until all operations are stable on disk
// (flush_async also available to get a Future)
tree.flush()?;
If you would like to work with structured data without paying expensive deserialization costs, check out the structured example!
BTreeMap<[u8], [u8]>
compression
build feature, disabled by default)IVec
type.This is an inlinable Arc
ed slice that makes some things more efficient.flush_every_ms
configurable, or you maycall flush
/ flush_async
manually after operations.If you want to store numerical keys in a way that will play nicely with sled's iterators and ordered operations, please remember to store your numerical items in big-endian form. Little endian (the default of many things) will often appear to be doing the right thing until you start working with more than 256 items (more than 1 byte), causing lexicographic ordering of the serialized bytes to diverge from the lexicographic ordering of their deserialized numerical form.
to_be_bytes
and from_be_bytes
methods.If your dataset resides entirely in cache (achievable at startup by setting the cacheto a large enough value and performing a full iteration) then all reads and writes arenon-blocking and async-friendly, without needing to use Futures or an async runtime.
To asynchronously suspend your async task on the durability of writes, we support theflush_async
method,which returns a Future that your async tasks can await the completion of if they requirehigh durability guarantees and you are willing to pay the latency costs of fsync.Note that sled automatically tries to sync all data to disk several times per secondin the background without blocking user threads.
We support async subscription to events that happen on key prefixes, because theSubscriber
struct implements Future<Output=Option<Event>>
:
let sled = sled::open("my_db").unwrap();
let mut sub = sled.watch_prefix("");
sled.insert(b"a", b"a").unwrap();
extreme::run(async move {
while let Some(event) = (&mut sub).await {
println!("got event {:?}", event);
}
});
We support Rust 1.48.0 and up.
lock-free tree on a lock-free pagecache on a lock-free log. the pagecache scatterspartial page fragments across the log, rather than rewriting entire pages at a timeas B+ trees for spinning disks historically have. on page reads, we concurrentlyscatter-gather reads across the log to materialize the page from its fragments.check out the architectural outlookfor a more detailed overview of where we're at and where we see things going!
1.0.0
release!Like what we're doing? Help us out via GitHub Sponsors!
简介 Sled是基于Bw树构建的嵌入式KV数据库,其API接近于一个线程安全的BTreeMap<[u8], [u8]>。而其Bw树的数据结构加上包括crossbeam-epoch的“GC”等技术,使得Sled成为一个lock-free的数据库而在并发环境中傲视群雄。忘记那些慢吞吞的锁吧~ 而官方宣称在一台16核的机器上,在一个小数据集上可以达到每分钟10亿次操作(95%读核5%写) 要使用sled
【报告篇幅】:94 【报告图表数】:142 【报告出版时间】:2021年12月 报告摘要 2021年全球超辐射发光二极管(SLED)市场销售额达到了1.5亿美元,预计2028年将达到2.9亿美元,年复合增长率(CAGR)为9.2%(2022-2028)。地区层面来看,中国市场在过去几年变化较快,2021年市场规模为 百万美元,约占全球的 %,预计2028年将达到 百万美元,届时全球占比将达到
nop sled 是一种可以破解栈随机化的缓冲区溢出攻击方式。 攻击者通过输入字符串注入攻击代码。在实际的攻击代码前注入很长的 nop 指令 (无操作,仅使程序计数器加一)序列, 只要程序的控制流指向该序列任意一处,程序计数器逐步加一,直到到达攻击代码的存在的地址,并执行。 栈随机化指运行时栈的起始地址为随机的,所以程序中存放 各函数返回地址 的地址也会发生对应的改变。可防止运