• 技术文章 >数据库 >mysql教程

    MySQL与Redis实现二级缓存的方法介绍(代码示例)

    不言不言2019-02-01 09:35:28转载1557

    本篇文章给大家带来的内容是关于MySQL与Redis实现二级缓存的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    redis简介

    优势

    下载与安装

    wget http://download.redis.io/releases/redis-5.0.3.tar.gz
    tar xzf redis-5.0.3.tar.gz
    mv redis-5.0.3 /usr/local/
    cd /usr/local/redis-5.0.3
    sudo make test
    sudo make install
    redis-server

    若出现以下画面则表示redis数据库已经启动了:
    jpg

    mysql与redis做二级缓存

    步骤实现
    package redigo_pool
    
    import (
        "flag"
        "github.com/garyburd/redigo/redis"
        "time"
    )
    var (
        Pool *redis.Pool
        RedisServer   = flag.String("redisServer", ":6379", "")
        
    )
    func init() {
        Pool = &redis.Pool{
            MaxIdle:     3, //最大空闲链接数,表示即使没有redis链接事依然可以保持N个空闲链接,而不被清除
            MaxActive:   3, //最大激活连接数,表示同时最多有多少个链接
            IdleTimeout: 240 * time.Second,//最大空闲链接等待时间,超过此时间,空闲将被关闭
            Dial: func() (redis.Conn, error) {
                c, err := redis.Dial("tcp", *RedisServer)
                if err != nil {
                    return nil, err
                }
                return c, err
            },
            TestOnBorrow: func(c redis.Conn, t time.Time) error {
                if time.Since(t) < time.Minute {
                    return nil
                }
                _, err := c.Do("PING")
                return err
            },
        }
    }
    package main
    
    import (
        "database/sql"
        "encoding/json"
        "fmt"
        "github.com/garyburd/redigo/redis"
        _ "github.com/go-sql-driver/mysql"
        "strconv"
        "web/redis/redigo_pool"
        _ "web/redis/redigo_pool"
    )
    
    type Person struct {
        Id int `db:"id"`
        Name string `db:"name"`
        Age int `db:"age"`
        Rmb int `db:"rmb"`
    }
    
    func main() {
        var cmd string
        for{
            fmt.Println("输入命令")
            fmt.Scan(&cmd)
            switch cmd {
            case "getall":
                getAll()
            default:
                fmt.Println("不能识别其他命令")
            }
            fmt.Println()
        }
    }
    
    func getAll()  {
        //从连接池当中获取链接
        conn := redigo_pool.Pool.Get()
        //先查看redis中是否有数据
        //conn,_ :=redis.Dial("tcp","localhost:6379")
        defer conn.Close()
        values, _ := redis.Values(conn.Do("lrange", "mlist",0,-1))
    
        if len(values) > 0 {
            //如果有数据
            fmt.Println("从redis获取数据")
            //从redis中直接获取
            for _,key := range values{
                pid :=string(key.([]byte))
                id ,_:= strconv.Atoi(pid)
                results,_ := redis.Bytes(conn.Do("GET",id))
                var p Person
                err := json.Unmarshal(results,&p)
                if err != nil {
                    fmt.Println("json 反序列化出错")
                }else {
                    fmt.Printf("name = %s\n",p.Name)
                }
            }
        }else {
            fmt.Println("从mysql中获取")
    
            //查询数据库
            db,_ := sql.Open("mysql","root:Szt930708@tcp(localhost:3306)/mydb")
            defer db.Close()
    
            var persons []Person
    
            rows,_ := db.Query("select id,name,age,rmb from person")
            for rows.Next()  {
                var id int
                var name string
                var age int
                var rmb int
                rows.Scan(&id,&name,&age,&rmb)
                per := Person{id,name,age,rmb}
                persons = append(persons,per)
    
            }
            //写入到redis中:将person以hash的方式写入到redis中
            for _,p := range persons{
    
                p_byte,_ := json.Marshal(p)
                _,err1 := conn.Do("SETNX",p.Id,p_byte)
                _,err2 := conn.Do("lpush","mlist",p.Id)
                // 设置过期时间
                conn.Do("EXPIRE",p.Id,60*5)
                if err1 != nil || err2 != nil {
                    fmt.Println("写入失败")
                }else {
                    fmt.Println("写入成功")
                }
            }
            conn.Do("EXPIRE","mlist",60*5)
        }
    }

    以上就是MySQL与Redis实现二级缓存的方法介绍(代码示例)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:MySQL
    上一篇:JDBC和ODBC之间的区别 下一篇:MySQL按时间统计数据的方法介绍(代码示例)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 测试PHP连接MYSQL成功与否的代码_php基础• PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享_php技巧• Linux下为Node.js程序配置MySQL或Oracle数据库的方法_node.js• 通过node-mysql搭建Windows+Node.js+MySQL环境的教程_node.js
    1/1

    PHP中文网