Go基礎學習記錄 - 編寫Web應用程 - 資料庫(五)
本次分享下 -- NoSQL資料庫 - Redis資料庫驅動程式
NoSQL資料庫
NoSQL資料庫提供了一種儲存和檢索資料的機制,該機制使用比典型的關係資料庫更鬆散的一致性模型,以實現水平擴充套件和更高的可用性。
一些作者將它們稱為“不僅僅是SQL”,以強調某些NoSQL系統確實允許使用類似SQL的查詢語言。
作為21世紀的C語言,Go對NoSQL資料庫提供了很好的支援,包括流行的redis,mongoDB,Cassandra和Membase NoSQL資料庫。
Redis
redis是一個像Memcached這樣的鍵值儲存系統,它支援string,list,set和zset(有序集)值型別。
redis有一些Go資料庫驅動程式:
- ofollow,noindex" target="_blank">https://github.com/gomodule/r...
- https://github.com/go-redis/r...
- https://github.com/hoisie/redis
- https://github.com/alphazero/...
- https://github.com/simonz05/g...
讓我們看看如何使用redigo驅動程式在資料庫上執行:
安裝redigo:
go get github.com/gomodule/redigo
使用方式如下
package main import ( "fmt" "github.com/gomodule/redigo" "os" "os/signal" "syscall" "time" ) var ( Pool *redis.Pool ) func init() { redisHost := ":6379" Pool = newPool(redisHost) close() } func newPool(server string) *redis.Pool { return &redis.Pool{ MaxIdle:3, IdleTimeout: 240 * time.Second, Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", server) if err != nil { return nil, err } return c, err }, TestOnBorrow: func(c redis.Conn, t time.Time) error { _, err := c.Do("PING") return err }, } } func close() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) signal.Notify(c, syscall.SIGKILL) go func() { <-c Pool.Close() os.Exit(0) }() } func Get(key string) ([]byte, error) { conn := Pool.Get() defer conn.Close() var data []byte data, err := redis.Bytes(conn.Do("GET", key)) if err != nil { return data, fmt.Errorf("error get key %s: %v", key, err) } return data, err } func main() { test, err := Get("test") fmt.Println(test, err) }
我們可以看到在Go中操作redis非常容易,並且它具有很高的效能。
它的客戶端命令幾乎與redis的內建命令相同。
MongoDB
MongoDB(來自“humongous”)是一個由10gen開發和支援的面向文件的開源資料庫系統。
它是NoSQL系列資料庫系統的一部分。MongoDB不是像在“經典”關係資料庫中那樣在表中儲存資料,而是將結構化資料儲存為具有動態模式的類似JSON的文件(MongoDB呼叫BSON格式),使得在某些型別的應用程式中的資料整合更容易,更快捷。
MongoDB的最佳驅動程式稱為mgo,將來它可能會包含在標準庫中。
安裝mgo:
go get gopkg.in/mgo.v2
使用方式如下
package main import ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "log" ) type Person struct { Namestring Phone string } func main() { session, err := mgo.Dial("server1.example.com,server2.example.com") if err != nil { panic(err) } defer session.Close() // Optional. Switch the session to a monotonic behavior. session.SetMode(mgo.Monotonic, true) c := session.DB("test").C("people") err = c.Insert(&Person{"Ale", "+55 53 8116 9639"}, &Person{"Cla", "+55 53 8402 8510"}) if err != nil { log.Fatal(err) } result := Person{} err = c.Find(bson.M{"name": "Ale"}).One(&result) if err != nil { log.Fatal(err) } fmt.Println("Phone:", result.Phone) }
我們可以看到,在mgo資料庫上執行時沒有太大的區別;它們都是基於結構的。這是Go的做事方式。
今天就分享到這裡,如果你有其他疑問請在下方留言或者加群交流