Go基礎學習記錄 - 編寫Web應用程 - 數據庫(五)

本次分享下 -- NoSQL數據庫 - Redis數據庫驅動程序git

NoSQL數據庫

NoSQL數據庫提供了一種存儲和檢索數據的機制,該機制使用比典型的關係數據庫更鬆散的一致性模型,以實現水平擴展和更高的可用性。
一些做者將它們稱爲「不單單是SQL」,以強調某些NoSQL系統確實容許使用相似SQL的查詢語言。
做爲21世紀的C語言,Go對NoSQL數據庫提供了很好的支持,包括流行的redis,mongoDB,Cassandra和Membase NoSQL數據庫。github

Redis

redis是一個像Memcached這樣的鍵值存儲系統,它支持string,list,set和zset(有序集)值類型。
redis有一些Go數據庫驅動程序:redis

讓咱們看看如何使用redigo驅動程序在數據庫上運行:數據庫

安裝redigo:

go get github.com/gomodule/redigo

使用方式以下session

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的內置命令相同。tcp

MongoDB

MongoDB(來自「humongous」)是一個由10gen開發和支持的面向文檔的開源數據庫系統。
它是NoSQL系列數據庫系統的一部分。MongoDB不是像在「經典」關係數據庫中那樣在表中存儲數據,而是將結構化數據存儲爲具備動態模式的相似JSON的文檔(MongoDB調用BSON格式),使得在某些類型的應用程序中的數據集成更容易,更快捷。性能

MongoDB的最佳驅動程序稱爲mgo,未來它可能會包含在標準庫中。code

安裝mgo:

go get gopkg.in/mgo.v2

使用方式以下server

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "log"
)

type Person struct {
    Name  string
    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的作事方式。開發

今天就分享到這裏,若是你有其餘疑問請在下方留言或者加羣交流

相關文章
相關標籤/搜索