1. 程式人生 > >go操作redis和mysql示例

go操作redis和mysql示例

pip 時間 upd commit 響應 ini 修改 insert let

一:redis示例


使用redis的包是: github.com/garyburd/redigo/redis

1:編寫第一個示例: 鏈接,設置,獲取

redis_basic.go

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "192.168.0.109:6379")  //連接到redis
    if err != nil {
        fmt.Println("conn redis failed, err: ", err)
        
return } defer c.Close() //set _, err = c.Do("SET", "name", "redis-go") if err != nil { fmt.Println("err") return } //get r, err := redis.String(c.Do("GET", "name")) if err != nil { fmt.Println(err) return } fmt.Println(r)
//hset _, err = c.Do("HSET", "names", "redis", "hset") if err != nil { fmt.Println(err) return } //hget r, err = redis.String(c.Do("HGET", "names", "redis")) if err != nil { fmt.Println("hget err: ", err) return } fmt.Println(r) //exipres
_, err = c.Do("expires", "names", 5) if err != nil { fmt.Println("expire err: ", err) return } }

2: 管道操作示例
請求/響應服務可以實現持續處理新請求,客戶端可以發送多個命令到服務器而無需等待響應,最後在一次讀取多個響應。
使用Send(),Flush(),Receive()方法支持管道化操作
Send向連接的輸出緩沖中寫入命令。
Flush將連接的輸出緩沖清空並寫入服務器端。
Recevie按照FIFO順序依次讀取服務器的響應

redis_pipline.go

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "192.168.0.109:6379")
    if err != nil {
        fmt.Println("conn redis failed, err: ", err)
        return
    }
    defer c.Close()

    c.Send("SET", "name1", "redis001")
    c.Send("SET", "name2", "redis002")
    c.Flush()

    v, err := c.Receive()
    fmt.Printf("v: %v, err: %v \n", v, err)

    v, err = c.Receive()
    fmt.Printf("v: %v, err: %v \n", v, err)

    v, err = c.Receive() // 夯住,一直等待
    fmt.Printf("v:%v,err:%v\n", v, err)
}

3: 連接池示例

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

var pool *redis.Pool

func init() {
    pool = &redis.Pool{
        MaxIdle:     20,   //最大的空閑連接數,表示即使沒有redis連接時依然可以保持N個空閑的連接,而不被清除,隨時處於待命狀態
        MaxActive:   120,  //最大的激活連接數,表示同時最多有N個連接
        IdleTimeout: 350,  //最大的空閑連接等待時間,超過此時間後,空閑連接將被關閉
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", "192.168.0.109:6379")
        },
    }
}

func main() {
    client := pool.Get()
    defer client.Close()

    _, err := client.Do("SET", "names", "redis-pool")
    if err != nil {
        fmt.Println("set error: ", err)
        return
    }

    r, err := redis.String(client.Do("GET", "names"))
    if err != nil {
        fmt.Println("get error: ", err)
        return
    }
    fmt.Println(r)
}

二: mysql示例


雖然go的mysql包有很多,比如gorm,xorm, 但是我們使用一個簡單的 sqlx(github.com/jmoiron/sqlx)

這裏有sqlx的用法 http://jmoiron.github.io/sqlx/

1: 增加
mysql_insert.go

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type User struct {
    Name     string `db:"name"`
    Email    string `db:"email"`
    Password string `db:"password"`
}

func init() {
    db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
    if err != nil {
        fmt.Println("open mysql err: ", err)
        return
    }
    DB = db
}

func main() {
    res, err := DB.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "mysqldemo", "[email protected]", "111")
    if err != nil {
        fmt.Println("insert err: ", err)
        return
    }
    id, err := res.LastInsertId()
    if err != nil {
        fmt.Println("get last id err: ", err)
        return
    }
    fmt.Println("insert success: ", id)
}


2: 修改
mysql_update.go

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type User struct {
    Name     string `db:"name"`
    Email    string `db:"email"`
    Password string `db:"password"`
}

func init() {
    db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
    if err != nil {
        fmt.Println("open mysql err: ", err)
        return
    }
    DB = db
}

func main() {
    _, err := DB.Exec("UPDATE users SET name=? WHERE id=?", "mysqlupdate", 1)
    if err != nil {
        fmt.Println("update err: ", err)
        return
    }
}

3:刪除
mysql_del.go

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type User struct {
    Name     string `db:"name"`
    Email    string `db:"email"`
    Password string `db:"password"`
}

func init() {
    db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
    if err != nil {
        fmt.Println("open mysql err: ", err)
        return
    }
    DB = db
}

func main() {
    _, err := DB.Exec("DELETE FROM users WHERE id = ?", 2)
    if err != nil {
        fmt.Println("del err : ", err)
        return
    }
    fmt.Println("del success")
}

4:查詢
mysql_select.go

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type User struct {
    Name     string `db:"name"`
    Email    string `db:"email"`
    Password string `db:"password"`
}

func init() {
    db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
    if err != nil {
        fmt.Println("open mysql err: ", err)
        return
    }
    DB = db
}

func main() {
    var users []User
    err := DB.Select(&users, "SELECT name, email, password FROM users WHERE id=?", 1)
    if err != nil {
        fmt.Println("select err: ", err)
        return
    }
    fmt.Println("select success: ", users)

    person := []User{}
    DB.Select(&person, "SELECT name,email,password FROM users")
    fmt.Println(person)
}

5: 事務
mysql_trans.go

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
    "log"
)

//事務
var DB *sqlx.DB

type User struct {
    Name     string `db:"name"`
    Email    string `db:"email"`
    Password string `db:"password"`
}

func init() {
    db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
    if err != nil {
        fmt.Println("open mysql err: ", err)
        return
    }
    DB = db
}

func main() {
    tx, err := DB.Begin()
    if err != nil {
        log.Println("DB begin failed err: ", err)
        return
    }

    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        }
    }()
   //這裏寫一個demo
    if _, err = tx.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "demo2", "[email protected]", "333"); err != nil {
        tx.Rollback()
        return
    }
    if _, err = tx.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "demo3", "[email protected]", "444"); err != nil {
        tx.Rollback()
        return
    }

    err = tx.Commit()
    return
}

go操作redis和mysql示例