当前位置: 首页 > 软件库 > 数据库相关 > >

sled

the champagne of beta embedded databases
授权协议 View license
开发语言 JavaScript
所属分类 数据库相关
软件类型 开源软件
地区 不详
投 递 者 端木阳荣
操作系统 跨平台
开源组织
适用人群 未知
 软件概览
key value
buy a coffee for us to convert into databases
documentation
chat about databases with us

sled - it's all downhill from here!!!

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!

features

  • API similar to a threadsafe BTreeMap<[u8], [u8]>
  • serializable (ACID) transactionsfor atomically reading and writing to multiple keys in multiple keyspaces.
  • fully atomic single-key operations, including compare and swap
  • zero-copy reads
  • write batches
  • subscribe to changes on keyprefixes
  • multiple keyspaces
  • merge operators
  • forward and reverse iterators over ranges of items
  • a crash-safe monotonic ID generatorcapable of generating 75-125 million unique ID's per second
  • zstd compression (use thecompression build feature, disabled by default)
  • cpu-scalable lock-free implementation
  • flash-optimized log-structured storage
  • uses modern b-tree techniques such as prefix encoding and suffixtruncation for reducing the storage costs of long keys with sharedprefixes. If keys are the same length and sequential then thesystem can avoid storing 99%+ of the key data in most cases,essentially acting like a learned index

expectations, gotchas, advice

  • Maybe one of the first things that seems weird is the IVec type.This is an inlinable Arced slice that makes some things more efficient.
  • Durability: sled automatically fsyncs every 500ms by default,which can be configured with the flush_every_ms configurable, or you maycall flush / flush_async manually after operations.
  • Transactions are optimistic - do not interact with external stateor perform IO from within a transaction closure unless it isidempotent.
  • Internal tree node optimizations: sled performs prefix encodingon long keys with similar prefixes that are grouped together in a range,as well as suffix truncation to further reduce the indexing costs oflong keys. Nodes will skip potentially expensive length and offset pointersif keys or values are all the same length (tracked separately, don't worryabout making keys the same length as values), so it may improve space usageslightly if you use fixed-length keys or values. This also makes it easierto use structured access as well.
  • sled does not support multiple open instances for the time being. Pleasekeep sled open for the duration of your process's lifespan. It's totallysafe and often quite convenient to use a global lazy_static sled instance,modulo the normal global variable trade-offs. Every operation is threadsafe,and most are implemented under the hood with lock-free algorithms that avoidblocking in hot paths.

performance

  • LSM tree-like write performancewith traditional B+ tree-like read performance
  • over a billion operations in under a minute at 95% read 5% writes on 16 cores on a small dataset
  • measure your own workloads rather than relying on some marketing for contrived workloads

a note on lexicographic ordering and endianness

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.

  • Rust integral types have built-in to_be_bytes and from_be_bytes methods.
  • bincode can be configured to store integral types in big-endian form.

interaction with async

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);
    }
});

minimum supported Rust version (MSRV)

We support Rust 1.48.0 and up.

architecture

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!

philosophy

  1. don't make the user think. the interface should be obvious.
  2. don't surprise users with performance traps.
  3. don't wake up operators. bring reliability techniques from academia into real-world practice.
  4. don't use so much electricity. our data structures should play to modern hardware's strengths.

known issues, warnings

  • if reliability is your primary constraint, use SQLite. sled is beta.
  • if storage price performance is your primary constraint, use RocksDB. sled uses too much space sometimes.
  • if you have a multi-process workload that rarely writes, use LMDB. sled is architected for use with long-running, highly-concurrent workloads such as stateful services or higher-level databases.
  • quite young, should be considered unstable for the time being.
  • the on-disk format is going to change in ways that require manual migrations before the 1.0.0 release!

priorities

  • rework the transaction API to eliminate surprises and limitations
  • reduce space and memory usage
  • the 1.0.0 release date is imminent! just putting the final touches on, while performing intensive testing
  • combine merge operators with subscribers in a way that plays nicely with transactions
  • typed trees for low-friction serialization
  • replication support for both strongly and eventually consistent systems
  • continue to improve testing and make certain bug classes impossible through construction
  • continue to optimize the hell out of everything
  • continue to improve documentation and examples
  • continue to reduce compilation latency

fund feature development

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  指令 (无操作,仅使程序计数器加一)序列, 只要程序的控制流指向该序列任意一处,程序计数器逐步加一,直到到达攻击代码的存在的地址,并执行。     栈随机化指运行时栈的起始地址为随机的,所以程序中存放   各函数返回地址   的地址也会发生对应的改变。可防止运

相关阅读

相关文章

相关问答

相关文档