- Machine Learning With Go
- Daniel Whitenack
- 364字
- 2021-07-08 10:37:29
Caching data locally on disk
The caching we just saw is in memory. That is, the cached data exists and is accessible while your application is running, but as soon as your application exits, your data disappears. In some cases, you may want your cached data to stick around when your application restarts or exits. You may also want to back up your cache such that you don't have to start applications from scratch without a cache of relevant data.
In these scenarios, you may consider using a local, embedded cache, such as github.com/boltdb/bolt. BoltDB, as it is referred to, is a very popular project for these sorts of applications, and basically consists of a local key-value store. To initialize one of these local key-value stores, do the following:
// Open an embedded.db data file in your current directory.
// It will be created if it doesn't exist.
db, err := bolt.Open("embedded.db", 0600, nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Create a "bucket" in the boltdb file for our data.
if err := db.Update(func(tx *bolt.Tx) error {
_, err := tx.CreateBucket([]byte("MyBucket"))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
return nil
}); err != nil {
log.Fatal(err)
}
You can, of course, have multiple different buckets of data in your BoltDB and use a filename other than embedded.db.
Next, let's say you had a map of string values in memory that you need to cache in BoltDB. To do this, you would range over the keys and values in the map, updating your BoltDB:
// Put the map keys and values into the BoltDB file.
if err := db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("MyBucket"))
err := b.Put([]byte("mykey"), []byte("myvalue"))
return err
}); err != nil {
log.Fatal(err)
}
Then, to get values out of BoltDB, you can view your data:
// Output the keys and values in the embedded
// BoltDB file to standard out.
if err := db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("MyBucket"))
c := b.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
fmt.Printf("key: %s, value: %s\n", k, v)
}
return nil
}); err != nil {
log.Fatal(err)
}
- Vue.js設計與實現
- Mastering Objectoriented Python
- C語言程序設計教程(第2版)
- PHP網絡編程學習筆記
- MATLAB實用教程
- Windows Server 2016 Automation with PowerShell Cookbook(Second Edition)
- R語言與網絡輿情處理
- 深度學習原理與PyTorch實戰(第2版)
- Qlik Sense? Cookbook
- SignalR:Real-time Application Development(Second Edition)
- MySQL 8從零開始學(視頻教學版)
- Hack與HHVM權威指南
- Android高級開發實戰:UI、NDK與安全
- Flink核心技術:源碼剖析與特性開發
- Java EE項目應用開發