在golang中使用leveldb

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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=./snappyLEVELDB_SRC=./leveldbSNAPPY_DIR=/usr/local/snappyLEVELDB_DIR=/usr/local/leveldbif [ ! -f $SNAPPY_DIR/lib/libsnappy.a ]; then    (cd $SNAPPY_SRC && \        ./configure --prefix=$SNAPPY_DIR && \        make && \        make install)else    echo "skip install snappy"fiif [ ! -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"fifunction 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 

具體的代碼在這裡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.