leveldb小尝试

作者: NickYang 分类: 技术文章,程序开发 发布时间: 2014-06-07 09:54

最近项目挺忙的,也没什么时间写博客了,这篇也是工作中遇到mysql经常同时请求数据就CPU暴高,就看了下nosql,redis已经有同事尝试了,所以我就来试试leveldb。

leveldb是google开源的一个高效率的K/V数据库,地址:https://code.google.com/p/leveldb/

 

暂时不支持windows,虽然有windows分支,但是已经两年每更新了,按照网上的方法,折腾了一下,还是有几个函数无法链接,所以打算延后再折腾。

linux下就方便很多了,直接下载源码,make all编译,就会生成a和so文件,我用的是a文件

写了下面的一个例子,还是比较顺利

#include <iostream>
#include "leveldb/db.h"

int main()
{
    leveldb::DB* db;
    leveldb::Options options;
    options.create_if_missing = true; // 如果没有则创建

    leveldb::Status status = leveldb::DB::Open(options, "/home/test/test_leveldb/testdb", &db);

    std::string key = "key123";
    std::string value = "value123";

    status = db->Put(leveldb::WriteOptions(), key, value);
    assert(status.ok());

    std::string value1;
    status = db->Get(leveldb::ReadOptions(), key, &value1);
    assert(status.ok());

    std::cout << "get, key1:" << key << " value1:" << value1 << std::endl;
    std::string key1 = "key456";
    status = db->Put(leveldb::WriteOptions(), key1, value1);
    assert(status.ok());

    status = db->Delete(leveldb::WriteOptions(), key1);
    assert(status.ok());


    delete db;
    return 0;
}

结果不贴了,各位自己去试试就知道了。
在上面创建的文件夹里会有好几个文件,这里面就是记录了你的持久化数据。

linux是30秒才会将缓冲区的数据刷出到硬盘里,而且leveldb使用了mmap,所以可能会丢数据,看了下ideawu的博客里有写到,leveldb的作者认为 sync every second 机制应该是用户自己实现的,而不是leveldb提供,所以他基于leveldb写了一个SSDB,兼容redis协议,而且做到了每秒钟同步输出到硬盘,这样丢数据的几率就会大大降低,github地址:https://github.com/ideawu/ssdb

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

  • Yu

    2014 年 6 月 8 日 17:46

    assert的用途是啥?当遇到错误后abort掉,这种逻辑什么场景下能用啊 — 遇到错误难道不是应该尽可能的输出dump文件,然后暂停或者尽可能错误处理么

    此外,验证码的位置那么诡异….

    1. eliteYang

      2014 年 6 月 9 日 10:49

      assert是断言啊,如果不满足括号内的条件会就出现一个弹窗,一般来说,在任何场合下都可以使用,一般用在应该不会出错误但莫名会错的地方,用log和dump的方式也可以,有时候会觉得没必要

发表评论

电子邮件地址不会被公开。 必填项已用*标注