• go操作redis和mysql示例


    一: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 
    ", v, err)
    
        v, err = c.Receive()
        fmt.Printf("v: %v, err: %v 
    ", v, err)
    
        v, err = c.Receive() // 夯住,一直等待
        fmt.Printf("v:%v,err:%v
    ", 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", "my@12.com", "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", "demo@12.com", "333"); err != nil {
            tx.Rollback()
            return
        }
        if _, err = tx.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "demo3", "demo3@12.com", "444"); err != nil {
            tx.Rollback()
            return
        }
    
        err = tx.Commit()
        return
    }
  • 相关阅读:
    小程序开发系列(五)悬浮搜索框
    LINQ的连接扩展(左连、右连、全连等)
    小程序开发系列(四)九宫格另一种实现
    python 生成随机图片验证码
    django定时任务小插件
    线程池模块thernd
    python logging 模块记录日志
    django Q条件
    jquery 事件绑定
    jQuery示例
  • 原文地址:https://www.cnblogs.com/jiujuan/p/10418382.html
Copyright © 2020-2023  润新知