首页 > 代码库 > 在golang中使用leveldb
在golang中使用leveldb
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=http://www.mamicode.com/snappy"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
详细的代码在这里。
在golang中使用leveldb
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。