Badger簡單使用

来源:https://www.cnblogs.com/dawn-lewis/archive/2022/03/25/16055348.html
-Advertisement-
Play Games

badger 是 dgraph 開源的 LSMTree 的 KV 引擎,它相比 leveldb 有 KV 分離、事務、併發合併等增強,是 go 生態中比較生產級的存儲引擎了。 ...


Badger簡介

badger 是 dgraph 開源的 LSMTree 的 KV 引擎,它相比 leveldb 有 KV 分離、事務、併發合併等增強,是 go 生態中比較生產級的存儲引擎了。

文檔:https://dgraph.io/docs/badger/get-started/

Github 地址:https://github.com/dgraph-io/badger

安裝

安裝 Badger

要開始使用 Badger,請安裝 Go 1.12 或更高版本。

go get github.com/dgraph-io/badger/v3

註意:Badger 不直接使用 CGO,但它依賴於https://github.com/DataDog/zstd進行壓縮,並且需要 gcc/cgo。如果你想在沒有 gcc/cgo 的情況下使用 badger,你可以運行CGO_ENABLED=0 go get github.com/dgraph-io/badger/…它將下載不支持 ZSTD 壓縮演算法的 badger。

安裝 Badger 命令行工具

https://github.com/dgraph-io/badger/releases 下載並提取最新的 Badger DB 版本,然後運行以下命令。

cd badger-<version>/badger
go install

這會將 badger 命令行實用程式安裝到您的 $GOBIN 路徑中。

資料庫操作

打開資料庫

func Open(path string) (*badger.DB, error) {
	if _, err := os.Stat(path); os.IsNotExist(err) {
		os.MkdirAll(path, 0755)
	}
	opts := badger.DefaultOptions(path)
	opts.Dir = path
	opts.ValueDir = path
	opts.SyncWrites = false
	opts.ValueThreshold = 256
	opts.CompactL0OnClose = true
	db, err := badger.Open(opts)
	if err != nil {
		log.Println("badger open failed", "path", path, "err", err)
		return nil, err
	}
	return db, nil
}

記憶體模式/無盤模式

預設情況下,Badger 確保所有數據都保存在磁碟上。它還支持純記憶體模式。當 Badger 在記憶體模式下運行時,所有數據都存儲在記憶體中。在記憶體模式下讀寫速度要快得多,但在崩潰或關閉的情況下,存儲在 Badger 中的所有數據都會丟失。要在記憶體模式下打開 badger,請設置InMemory選項。

opts := badger.DefaultOptions(path).WithInMemory(true)

關閉資料庫

func Close() {
	err := badgerDB.Close()
	if err == nil {
		log.Println("database closed", "err", err)
	} else {
		log.Println("failed to close database", "err", err)
	}
}

存儲操作

寫入數據

要保存鍵/值對,請使用以下Txn.Set()方法;

鍵/值對也可以通過首先創建來保存Entry,然後 Entry使用Txn.SetEntry(). Entry還公開了在其上設置屬性的方法。

func Set(key []byte, value []byte) {
	wb := badgerDB.NewWriteBatch()
	defer wb.Cancel()
	err := wb.SetEntry(badger.NewEntry(key, value).WithMeta(0))
	if err != nil {
		log.Println("Failed to write data to cache.","key", string(key), "value", string(value), "err", err)
	}
	err = wb.Flush()
	if err != nil {
		log.Println("Failed to flush data to cache.","key", string(key), "value", string(value), "err", err)
	}
}

設置TTL的寫入數據

Badger 允許在鍵上設置可選的生存時間 (TTL) 值。一旦 TTL 過去,密鑰將不再可檢索,並且將有資格進行垃圾收集。 可以使用和API 方法將 TTL 設置為time.Duration值。Entry.WithTTL() Txn.SetEntry()

func SetWithTTL(key []byte, value []byte, ttl int64) {
	wb := badgerDB.NewWriteBatch()
	defer wb.Cancel()
	err := wb.SetEntry(badger.NewEntry(key, value).WithMeta(0).WithTTL(time.Duration(ttl * time.Second.Nanoseconds())))
	if err != nil {
		log.Println("Failed to write data to cache.","key", string(key), "value", string(value), "err", err)
	}
	err = wb.Flush()
	if err != nil {
		log.Println("Failed to flush data to cache.","key", string(key), "value", string(value), "err", err)
	}
}

讀取數據

要讀取數據,我們可以使用以下Txn.Get()方法。

func Get(key []byte) string {
	var ival []byte
	err := badgerDB.View(func(txn *badger.Txn) error {
		item, err := txn.Get(key)
		if err != nil {
			return err
		}
		ival, err = item.ValueCopy(nil)
		return err
	})
	if err != nil {
		log.Println("Failed to read data from the cache.","key", string(key), "error", err)
	}
	return string(ival)
}

存在鍵

func Has(key []byte) (bool, error) {
	var exist bool = false
	err := badgerDB.View(func(txn *badger.Txn) error {
		_, err := txn.Get(key)
		if err != nil {
			return err
		} else {
			exist = true
		}
		return err
	})
	// align with leveldb, if the key doesn't exist, leveldb returns nil
	if strings.HasSuffix(err.Error(), "not found") {
		err = nil
	}
	return exist, err
}

刪除鍵

使用Txn.Delete()方法刪除 key。

func Delete(key []byte) error {
	wb := badgerDB.NewWriteBatch()
	defer wb.Cancel()
	return wb.Delete(key)
}

查詢操作

遍歷key和value

要迭代鍵,我們可以使用Iterator,可以使用 Txn.NewIterator()方法獲得。迭代以按位元組排序的字典順序發生。

func IteratorKeysAndValues(){

	err := badgerDB.View(func(txn *badger.Txn) error {
		opts := badger.DefaultIteratorOptions
		opts.PrefetchSize = 10
		it := txn.NewIterator(opts)
		defer it.Close()
		for it.Rewind(); it.Valid(); it.Next() {
			item := it.Item()
			k := item.Key()
			err := item.Value(func(v []byte) error {
				fmt.Printf("key=%s, value=%s\n", k, v)
				return nil
			})
			if err != nil {
				return err
			}
		}
		return nil
	})
	if err != nil {
		log.Println("Failed to iterator keys and values from the cache.","error", err)
	}
}

遍歷keys

Badger 支持一種獨特的迭代模式,稱為key-only迭代。它比常規迭代快幾個數量級,因為它只涉及對 LSM 樹的訪問,它通常完全駐留在 RAM 中。要啟用僅鍵迭代,您需要將該IteratorOptions.PrefetchValues 欄位設置為false. 這也可用於在迭代期間對選定鍵進行稀疏讀取,item.Value()僅在需要時調用。

func IteratorKeys(){
    err := badgerDB.View(func(txn *badger.Txn) error {
        opts := badger.DefaultIteratorOptions
        opts.PrefetchValues = false
        it := txn.NewIterator(opts)
        defer it.Close()
        for it.Rewind(); it.Valid(); it.Next() {
            item := it.Item()
            k := item.Key()
            fmt.Printf("key=%s\n", k)
        }
        return nil
    })

    if err != nil {
        log.Println("Failed to iterator keys from the cache.","error", err)
    }
}

首碼掃描

要遍歷一個鍵首碼,您可以組合Seek()and ValidForPrefix()

func SeekWithPrefix(prefixStr string){
	err := badgerDB.View(func(txn *badger.Txn) error {
		it := txn.NewIterator(badger.DefaultIteratorOptions)
		defer it.Close()
		prefix := []byte(prefixStr)
		for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() {
			item := it.Item()
			k := item.Key()
			err := item.Value(func(v []byte) error {
				fmt.Printf("key=%s, value=%s\n", k, v)
				return nil
			})
			if err != nil {
				return err
			}
		}
		return nil
	})
	if err != nil {
		log.Println("Failed to seek prefix from the cache.", "prefix", prefixStr,"error", err)
	}
}

原文鏈接:https://weixiaodyanlei.xyz/archives/badger-jian-dan-shi-yong


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 《零基礎學Java》 文本組件 文本組件在實際的項目開發中使用的最為廣泛,尤其是 文本框 與 密碼框 組件。 JTextField文本框組件 文本框(JTextField)是用來 顯示 或 編輯 一個單行文本,在 Swing 中通過 javax.swing.JTextField類 對象創建(該類繼承 ...
  • 圖論 圖論是數學的一個分支。它以圖為研究對象。圖論中的圖是由若幹給定的點及連接兩點的線所構成的圖形,這種圖形通常用來描述某些事物之間的某種特定關係,用點代表事物,用連接兩點的線表示相應兩個事物間具有這種關係。 樹 定義 樹是遞歸定義的。 一棵樹是由n(n>0)個元素組成的有限集合,其中每個元素稱為結 ...
  • 1.概述 是什麼:是對方法、類、參數、包、域以及變數等進行代碼功能的增強或者修改程式的行為等操作。 應用 跟蹤代碼依賴性,實現替代配置文件功能在反射中使用Annotation,欄位格式化(如:數據欄位脫敏、日期格式)在編譯時進行格式檢查生成幫助文檔 2.註解相關知識 元註解指的是所有註解都基於它們而 ...
  • 1.反射概述 Java程式在運行時操作類中的屬性和方法的機制,稱為反射機制。 一個關鍵點:運行時 一般我們在開發程式時,都知道自己具體用了什麼類,直接創建使用即可。但當你寫一些通用的功能時沒辦法在編寫時知道具體的類型,並且程式跑起來還會有多種類型的可能,則需要在運行時動態的去調用某個類的屬性和方法, ...
  • 什麼情況下JVM頻繁發生full GC; 在實際項目什麼代碼導致full GC;線上怎麼排查是哪個程式導致的ful GC ...
  • 歷史 1990年,美國Sun公司的“Stealth計劃”(後來改名為“Green計劃”)目標設置在家用電器等小型系統的程式語言,準備應用在電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通信 1996年5月23日,JDK1.0開始發行(前期Java的版本只有兩個) 2005年6月,Java One大會 ...
  • 學Python那麼久了,才知道自己不會把腳本編譯成可執行exe文件。這是昨天以為小伙伴告訴我的,為了幫她解決這個問題,我今天特意寫了這一篇文章。相信肯定不止我的小伙伴不會,也許某個角落也藏著一個你。 首先,通過Python Fire可以快速便捷地生成命令行工具(參見《Python Fire的速成教程 ...
  • 分析: A:有哪些類呢?用戶類 測試類 B:每個類有哪些東西呢? 用戶類: 成員變數:用戶名,密碼 構造方法:無參構造成員方法:getXxx()/setXxx() 登錄,註冊 假如用戶類的內容比較對,將來維護起來就比較麻煩,為了更清晰的分類,我們就把用戶又劃分成了兩類 用戶基本描述類 成員變數:用戶 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...