#key-value-store #cache #workload #items #concurrency #in-memory #read-heavy

cornerstore

一个用于读写密集型工作负载的内存中可过期项的键值存储

1个不稳定版本

0.1.0 2021年4月24日

#201缓存

Apache-2.0

17KB
229

关于

CORNERSTORE是一个易于使用的内存缓存,具有可过期的项。它可以安全地在线程之间共享。

是一个用于易腐项的友好键值存储。就像现实生活中的街角商店一样,这个商店快速方便。它适用于读写密集型工作负载。所有键值对都可以设置可选的过期时间。

一个CornerStore实例是线程安全的。它将其数据分布在128个分片中。

用法

CORNERSTORE是一个库。它没有命令行界面或监听套接字,如您可能从memcached或Redis期望的那样。

首先导入CornerStore,然后使用new()方法创建一个实例。为了方便起见,也可以在局部作用域中引入一些来自std::time的类型,以及std::error::Error特质。

use cornerstore::CornerStore;
use std::error::Error;
use std::time::{Duration, Instant};

// ...

fn main() -> Result<(), Box<dyn Error + '_>> {
    let mut store = CornerStore::new();

    // ...

    Ok(())
}

API的一些示例

  • 存储一个不会过期的项

    let key = b"greeting";
    let value = b"hello";
    let expiry = None;
    store.set(key, expected_value, expiry)?;
    
  • 存储一个在一分钟后过期的项

    let key = b"greeting";
    let value = b"hello from the future";
    let expiry = Some(Instant::now() + Duration::new(60, 0))
    store.set(key, expected_value, expiry)?;
    
  • 检索一个项

    let key   = b"greeting";
    if Some(value) = store.get(key)? {
        // warning - prints raw bytes
        println!("{:?}", value);
    };
    
  • 检索一个项而不检查过期日期

    let key   = b"greeting";
    if Some(value) = store.get_unchecked(key)? {
        // warning - prints raw bytes
        println!("{:?}", value);
    };
    
  • 从存储中删除任何已过期的易腐项

    store.evict()?;
    

cargo功能

  • safe-input
    如果您知道您的存储不会受到DDoS攻击,您可以通过启用safe-input来提高其性能。safe-input使用fxcrate进行哈希,这比Rust的默认值要快。

目标

作为许多客户端语言实现库。

需要帮助

  • 是否可以避免在返回值时返回Result<Option<K, V>>?解开两次稍微有点不舒服。
  • 如何进行基准测试?我尝试过jonhoo的bustle库,但将[u8]流转换为f64比较困难。

法律条款

关于法律条款的说明。虽然不幸,但这是重要的。

CORNERSTORE的原始组件由Tim McNamara (@timClicks) 编写。这些贡献的版权已转让给Fiorenza Limited (NZBN 9429042165200)。

CORNERSTORE的源代码和二进制分发均在Apache 2许可证下发布。请参阅LICENCE文件,了解您在此许可证下的权利和义务。

商标

CORNERSTORE是Fiorenza Limited (NZBN 9429042165200)的未注册商标。

消费者权益

如果您为自己使用CORNERSTORE,您有权根据消费者担保法获得强制权利。请记住,您正在免费使用从互联网上随机下载的软件。

依赖项

~2.5MB
~56K SLoC