在golang中使用leveldb

原创 2014年04月23日 13:30:29

leveldb是一个很强悍的kv数据库,自然,我也希望能在go中使用。

如果有官方的go leveldb实现,那我会优先考虑,譬如这个,但是该库文档完全没有,并且在网上没发现有人用于实战环境,对其能否在生产环境中使用打上问号,保险起见,我还是决定不使用。

因为leveldb有c的接口,所以通过cgo能很方便的进行集成,所以我决定采用该种方式,幸运的是,已经有人做了cgo的版本,也就是levigo

使用levigo,需要编译安装leveldb,如果需要压缩支持还需要编译snappy,为了简单,我写了一个构件脚本,如下:

#!/bin/bash
#refer https://github.com/norton/lets/blob/master/c_src/build_deps.sh

#你必须在这里设置实际的snappy以及leveldb源码地址
SNAPPY_SRC=./snappy
LEVELDB_SRC=./leveldb

SNAPPY_DIR=/usr/local/snappy
LEVELDB_DIR=/usr/local/leveldb

if [ ! -f $SNAPPY_DIR/lib/libsnappy.a ]; then
    (cd $SNAPPY_SRC && \
        ./configure --prefix=$SNAPPY_DIR && \
        make && \
        make install)
else
    echo "skip install snappy"
fi

if [ ! -f $LEVELDB_DIR/lib/libleveldb.a ]; then
    (cd $LEVELDB_SRC && \
        echo "echo \"PLATFORM_CFLAGS+=-I$SNAPPY_DIR/include\" >> build_config.mk" >> build_detect_platform &&
        echo "echo \"PLATFORM_CXXFLAGS+=-I$SNAPPY_DIR/include\" >> build_config.mk" >> build_detect_platform &&
        echo "echo \"PLATFORM_LDFLAGS+=-L $SNAPPY_DIR/lib -lsnappy\" >> build_config.mk" >> build_detect_platform &&
        make SNAPPY=1 && \
        make && \
        mkdir -p $LEVELDB_DIR/include/leveldb && \
        install include/leveldb/*.h $LEVELDB_DIR/include/leveldb && \
        mkdir -p $LEVELDB_DIR/lib && \
        cp -af libleveldb.* $LEVELDB_DIR/lib)
else
    echo "skip install leveldb"
fi

function add_path()
{
  # $1 path variable
  # $2 path to add
  if [ -d "$2" ] && [[ ":$1:" != *":$2:"* ]]; then
    echo "$1:$2"
  else
    echo "$1"
  fi
}

export CGO_CFLAGS="-I$LEVELDB_DIR/include -I$SNAPPY_DIR/include"
export CGO_LDFLAGS="-L$LEVELDB_DIR/lib -L$SNAPPY_DIR/lib -lsnappy"
export LD_LIBRARY_PATH=$(add_path $LD_LIBRARY_PATH $SNAPPY_DIR/lib)
export LD_LIBRARY_PATH=$(add_path $LD_LIBRARY_PATH $LEVELDB_DIR/lib)

go get github.com/jmhodges/levigo 

对于leveldb在go里面的使用,levigo做了很好的封装,但是有一点我不怎么习惯,在leveldb中,对于read和write的操作,都需要传入一个Option的东西,这玩意大多数时候都是一个默认Option对象,没必要每次在go里面进行创建删除。所以我对其进行了封装,提供了如下的接口,这样使用的都是默认的option。

func (db *DB) Put(key, value []byte) error 
func (db *DB) Get(key []byte) ([]byte, error)
func (db *DB) Delete(key []byte) error 

同时对于iterator,我参考c++的模型,提供了iterator以及reverse_iterator两种模式,如下:

func (db *DB) Iterator(begin []byte, end []byte, limit int) *Iterator 
func (db *DB) ReverseIterator(rbegin []byte, rend []byte, limit int) *Iterator 

具体的代码在这里

goleveldb源码分析-key的存储和构成

goleveldb internalKey解析
  • qinyongbo
  • qinyongbo
  • 2016-04-15 13:58:58
  • 397

Go语言(goleveldb和ledisdb数据库介绍)

Mayuyu要介绍一个Go语言编写的K-V数据库,叫做goleveldb。   goleveldb在github上的链接为:https://github.com/syndtr/goleveldb   ...
  • ACHelloWorld
  • ACHelloWorld
  • 2015-02-28 17:48:33
  • 2878

Go实战--也许最快的Go语言Web框架kataras/iris初识三(Redis、leveldb、BoltDB)

生命不止,继续 go go go !!!之前介绍了iris框架,介绍了如何使用basic认证、Markdown、YAML、Json等: Go实战–也许最快的Go语言Web框架kataras/iris...
  • wangshubo1989
  • wangshubo1989
  • 2017-10-25 17:39:36
  • 4926

leveldb从测试程序开始步骤分析

要理解这个leveldb只是一个数据库的库,1)下载git clone https://github.com/google/leveldb.git2)cd leveldb/ (首先需要可调试level...
  • swrjlxc
  • swrjlxc
  • 2018-03-11 19:55:23
  • 36

leveldb之简单测试

1. 最新版下载地址https://code.google.com/p/leveldb/downloads/list 2. 放到linux系统中解压并编译,其实编译leveldb很简单,解压...
  • cywosp
  • cywosp
  • 2013-09-14 18:46:00
  • 6158

LevelDB、TreeDB、SQLite3性能对比测试

from : http://blog.nosqlfan.com/html/2819.html 下面性能测试对比来自LevelDB官方,由 NoSQLFan 进行翻译整理。从结果上看,这不像某...
  • Fybon
  • Fybon
  • 2015-07-09 18:12:10
  • 1222

java,go语言 压缩 snappy 的使用

snappy
  • niyuelin1990
  • niyuelin1990
  • 2017-09-22 13:31:36
  • 370

bolt:一个纯Go实现的KV数据库

简介bolt是一个纯go语言实现的键值数据库,支持完全的ACID实务操作,尽管不像SQLite那样有完善的查询语言,但是接口简单易用。bolt本身通过使用一个内存映射的磁盘文件来管理数据,逻辑清晰,接...
  • u014029783
  • u014029783
  • 2017-11-24 22:52:26
  • 453

Go语言设计模式实践:迭代器(Iterator)

关于本系列 决定开个新坑。 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档、图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基...
  • na17p9f
  • na17p9f
  • 2014-10-30 11:29:37
  • 623

Snappy压缩库安装和使用之一

 近日需要在毕业设计中引入一个压缩库,要求压缩与解压缩速度快,但是压缩率可以不那么苛刻。查找资料发现Google的snappy库比较合适,而且该库开源,由C++写成。所以就拿来使用一下,下面权作...
  • djun100
  • djun100
  • 2014-05-15 14:01:09
  • 10139
收藏助手
不良信息举报
您举报文章:在golang中使用leveldb
举报原因:
原因补充:

(最多只允许输入30个字)