- 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)
}
- Learning NServiceBus(Second Edition)
- LabVIEW程序設計基礎與應用
- Android Studio Essentials
- Spring Boot+Spring Cloud+Vue+Element項目實戰(zhàn):手把手教你開發(fā)權(quán)限管理系統(tǒng)
- Android 9 Development Cookbook(Third Edition)
- Animate CC二維動畫設計與制作(微課版)
- AngularJS深度剖析與最佳實踐
- 匯編語言程序設計(第3版)
- Scala謎題
- Mastering Google App Engine
- HTML5開發(fā)精要與實例詳解
- QGIS Python Programming Cookbook(Second Edition)
- Node.js從入門到精通
- Modernizing Legacy Applications in PHP
- 軟技能2:軟件開發(fā)者職業(yè)生涯指南