在正式项目中使用 LiteDB

原创
2016/10/20 10:14
阅读数 682

原文:http://yahch.com/post.aspx?id=1

LiteDB 是一个 NoSQL 数据库,特点是 MongoDB like 和 0 配置。100% 原汁原味的 C# 开发, Release 只有一个 DLL,官方有一下适用场景:移动App,桌面小应用程序,特有的文件格式,小型的 Web 应用,需要为每一个用户建立数据库的应用。最重要的是它支持事务和LinQ和日志,对于商业应用也是免费的。

这次在一个对外开放接口中使用了LiteDB,这个对外接口提供一个文件解析服务,会返回给用户Json格式的解析结果,用户通过接口以Post方式提交文件,等待解析完成后会返回给用户一个id和摘要数据,用户通过返回的id可以去获取解析的最终详细数据。这中间通过 LiteBD 存储了解析结果的对象和上传文件的哈希值,用于防止重复上传造成不必要的计算资源的浪费。

这个存储关键的是存储了解析的最终对象而不是json字符串,这么做的好处是,用户在请求详细结果时可以设定参数需要详细数据的详细程度,比方说只需要解析结果的头10条,采样的100条,这些都可以在返回时候处理,而且使用 LinQ 处理起来也很简单,List<T>.Skip(int).Take(int) 即可。经测试一般用户输入300kb的原始文件,会产生约 4Mb 的 json 数据,所以如果完整原始输出是相当可怕的,所以默认会缩减输出数据,即数据库中仍然存入这个约 4 Mb 的对象,用户请求详细数据的时候只返回采样后的部分记录,比如 1000 条记录,这样输出到接口 api 调用方大约 200 kb 数据,gzip 压缩之后大概 ~70 kb,这对于前端来讲是可接受的,也节约了服务器的输出带宽。

实际应用中,上线三天来数据库增长到现在的 1.3 Gb,记录约 200 条,目前查询仍然是毫秒级别,这个数据库不会作为持久存储,只是为调用方临时存储数据,通常服务器会三天左右清除一次这个数据库,目前 LiteDB 的表现是比较令人满意的。

输入图片说明

LiteDB 的使用很简单:

> Install-Package LiteDB

下面是官网的一个例子:

// Basic example
public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string[] Phones { get; set; }
    public bool IsActive { get; set; }
}

// Open database (or create if not exits)
using(var db = new LiteDatabase(@"MyData.db"))
{
    // Get customer collection
    var customers = db.GetCollection("customers");

    // Create your new customer instance
    var customer = new Customer
    { 
        Name = "John Doe", 
        Phones = new string[] { "8000-0000", "9000-0000" }, 
        IsActive = true
    };

    // Insert new customer document (Id will be auto-incremented)
    customers.Insert(customer);

    // Update a document inside a collection
    customer.Name = "Joana Doe";

    customers.Update(customer);

    // Index document using a document property
    customers.EnsureIndex(x => x.Name);

    // Use Linq to query documents
    var results = customers.Find(x => x.Name.StartsWith("Jo"));
}

LiteDB 的数据库文件头部有个几字节表示数据库类型,默认就是 LiteDB,如果需要自己定义,可以在源代码 HeaderPage.cs 中修改 HEADER_INFO 常量。忘了说,LiteDB 还可以存储文件,这个配合 HEADER_INFO 使用,可以号称自己发明了一种新型文件格式了... 逃)

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部