網(wǎng)站首頁 編程語言 正文
說明
Bolt是一個純粹Key/Value
模型的程序。該項目的目標(biāo)是為不需要完整數(shù)據(jù)庫服務(wù)器(如Postgres或MySQL)的項目提供一個簡單,快速,可靠的數(shù)據(jù)庫。
BoltDB只需要將其鏈接到你的應(yīng)用程序代碼中即可使用BoltDB提供的API來高效的存取數(shù)據(jù)。而且BoltDB支持完全可序列化的ACID事務(wù),讓應(yīng)用程序可以更簡單的處理復(fù)雜操作。
BoltDB設(shè)計源于LMDB,具有以下特點:
- 使用Go語言編寫
- 不需要服務(wù)器即可運行
- 支持?jǐn)?shù)據(jù)結(jié)構(gòu)
- 直接使用API存取數(shù)據(jù),沒有查詢語句
- 支持完全可序列化的ACID事務(wù),這個特性比LevelDB強
- 數(shù)據(jù)保存在內(nèi)存映射的文件里。沒有wal、線程壓縮和垃圾回收
- 通過COW技術(shù),可實現(xiàn)無鎖的讀寫并發(fā),但是無法實現(xiàn)無鎖的寫寫并發(fā),這就注定了讀性能超高,但寫性能一般,適合與讀多寫少的場景
BoltDB是一個Key/Value
(鍵/值)存儲,這意味著沒有像SQL RDBMS(MySQL,PostgreSQL等)
中的表,沒有行,沒有列。相反,數(shù)據(jù)作為鍵值對存儲(如在Golang Maps中)。鍵值對存儲在Buckets中,它們旨在對相似的對進行分組(這與RDBMS中的表類似)。因此,為了獲得Value(值),需要知道該Value所在的桶和鑰匙。
go get -u github.com/boltdb/bolt
打開數(shù)據(jù)庫
db, err := bolt.Open(dbfile, 0600, nil) if err != nil { log.Fatal(err) } defer db.Close()
更新事務(wù)
err := db.Update(func(tx *bolt.Tx) error { ... return nil })
說明:
- 通過該接口可以實現(xiàn)數(shù)據(jù)更新操作該操作
- 會被當(dāng)做一個事務(wù)來處理,如果Update()內(nèi)的操作返回nil,則事務(wù)會被提交,否則事務(wù)會回滾
只讀操作
err := db.View(func(tx *bolt.Tx) error { ... return nil })
說明:
通過該接口可以且只能進行數(shù)據(jù)查詢操作 批量更新事務(wù)
err := db.Batch(func(tx *bolt.Tx) error { ... return nil })
說明:
- 通過該接口可以實現(xiàn)多次數(shù)據(jù)更新操作
- 所有的更新會被當(dāng)做一個事務(wù)來處理,如果Update()內(nèi)的操作返回nil,則事務(wù)會被提交,否則事務(wù)會回滾
手動事務(wù)管理
// 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 }
說明:
自己創(chuàng)建事務(wù),并管理事務(wù)的提交和回滾,沒有利用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
相關(guān)推薦
- 2022-06-07 Python必備技巧之函數(shù)的使用詳解_python
- 2022-12-14 Tensorflow2.1?完成權(quán)重或模型的保存和加載_python
- 2024-03-24 feignClient注入失敗
- 2022-09-09 pycharm?如何縮進和SQL亂碼及SQL包含變量_python
- 2023-12-20 Mybatis中resultMap結(jié)果集的使用
- 2022-05-28 Entity?Framework?Core生成數(shù)據(jù)庫表_實用技巧
- 2022-04-27 jquery實現(xiàn)移動端懸浮拖拽框_jquery
- 2022-03-25 在?ASP.NET?Core?中為?gRPC?服務(wù)添加全局異常處理_ASP.NET
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支