網站首頁 編程語言 正文
說明
Bolt是一個純粹Key/Value
模型的程序。該項目的目標是為不需要完整數據庫服務器(如Postgres或MySQL)的項目提供一個簡單,快速,可靠的數據庫。
BoltDB只需要將其鏈接到你的應用程序代碼中即可使用BoltDB提供的API來高效的存取數據。而且BoltDB支持完全可序列化的ACID事務,讓應用程序可以更簡單的處理復雜操作。
BoltDB設計源于LMDB,具有以下特點:
- 使用Go語言編寫
- 不需要服務器即可運行
- 支持數據結構
- 直接使用API存取數據,沒有查詢語句
- 支持完全可序列化的ACID事務,這個特性比LevelDB強
- 數據保存在內存映射的文件里。沒有wal、線程壓縮和垃圾回收
- 通過COW技術,可實現無鎖的讀寫并發,但是無法實現無鎖的寫寫并發,這就注定了讀性能超高,但寫性能一般,適合與讀多寫少的場景
BoltDB是一個Key/Value
(鍵/值)存儲,這意味著沒有像SQL RDBMS(MySQL,PostgreSQL等)
中的表,沒有行,沒有列。相反,數據作為鍵值對存儲(如在Golang Maps中)。鍵值對存儲在Buckets中,它們旨在對相似的對進行分組(這與RDBMS中的表類似)。因此,為了獲得Value(值),需要知道該Value所在的桶和鑰匙。
go get -u github.com/boltdb/bolt
打開數據庫
db, err := bolt.Open(dbfile, 0600, nil) if err != nil { log.Fatal(err) } defer db.Close()
更新事務
err := db.Update(func(tx *bolt.Tx) error { ... return nil })
說明:
- 通過該接口可以實現數據更新操作該操作
- 會被當做一個事務來處理,如果Update()內的操作返回nil,則事務會被提交,否則事務會回滾
只讀操作
err := db.View(func(tx *bolt.Tx) error { ... return nil })
說明:
通過該接口可以且只能進行數據查詢操作 批量更新事務
err := db.Batch(func(tx *bolt.Tx) error { ... return nil })
說明:
- 通過該接口可以實現多次數據更新操作
- 所有的更新會被當做一個事務來處理,如果Update()內的操作返回nil,則事務會被提交,否則事務會回滾
手動事務管理
// Start a writable transaction. tx, err := db.Begin(true) if err != nil { return err } defer tx.Rollback() // Use the transaction... _, err := tx.CreateBucket([]byte("MyBucket")) if err != nil { return err } // Commit the transaction and check for error. if err := tx.Commit(); err != nil { return err }
說明:
自己創建事務,并管理事務的提交和回滾,沒有利用BoltDB提供的封裝式寫法 示例
package main import ( "fmt" "log" "github.com/boltdb/bolt" ) var dbfile = "boltdbfile.db" var bdb *bolt.DB var bucket = []byte("MyBuckets") func main() { var err error bdb, err = bolt.Open(dbfile, 0600, nil) if err != nil { log.Fatal(err) } defer func() { _ = bdb.Close() }() CreateBuckets() updateData() selectData() } func CreateBuckets() error { return bdb.Update(func(tx *bolt.Tx) error { _, err := tx.CreateBucketIfNotExists(bucket) return err }) } func updateData() error { return bdb.Update(func(tx *bolt.Tx) error { bk := tx.Bucket(bucket) if bk != nil { e1 := bk.Put([]byte("name"), []byte("rao")) if e1 != nil { return e1 } e2 := bk.Put([]byte("age"), []byte("12")) if e2 != nil { return e2 } } return nil }) } func selectData() error { var name, age []byte return bdb.View(func(tx *bolt.Tx) error { bk := tx.Bucket(bucket) if bk != nil { name = bk.Get([]byte("name")) age = bk.Get([]byte("age")) } fmt.Printf("%s\n", name) fmt.Printf("%s\n", age) return nil }) }
原文鏈接:https://blog.csdn.net/raoxiaoya/article/details/125314930
相關推薦
- 2022-05-16 解析Sentry?Relay?二次開發調試_python
- 2022-07-31 Android中View.post和Handler.post的關系_Android
- 2022-11-03 C語言編寫掃雷小程序_C 語言
- 2022-04-25 ASP.NET?Core?MVC緩存Tag?Helpers到內存_實用技巧
- 2022-11-27 詳解Go語言如何實現字符串切片反轉函數_Golang
- 2022-11-09 React特征學習之Form格式示例詳解_React
- 2022-03-31 如何利用Python實現n*n螺旋矩陣_python
- 2022-04-12 el-tree 踩過最深的坑,沒有之一。設置與上級嚴格關聯、下級不嚴格關聯,CV即用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支