go操作redis和mysql示例
阿新 • • 發佈:2019-02-22
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示例