百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL与Redis实现二级缓存的办法介绍(代码示例)
分享文章到:

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

发布时间:08/01 来源:未知 浏览: 关键词:
?本篇文章给大家带来的内容是对于MySQL与Redis实现二级缓存的办法介绍(代码示例),有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

本篇文章给大家带来的内容是对于MySQL与Redis实现二级缓存的办法介绍(代码示例),有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

redis简介

  • Redis 是完全开源免费的,恪守BSD协定,是一个高机能的key-value数据库

  • Redis 与其他 key - value 缓存产品有下列三个特色:

    • Redis支撑数据的耐久化,可以将内存中的数据保留在磁盘中,重新启动的时候可以再次加载进行运用

    • Redis不仅仅支撑简略的key-value类型的数据,同时还供给list,set,zset,hash等数据构造的存储

    • Redis支撑数据的备份,即master-slave模式的数据备份

优势

  • 机能极高 - Redis能读的速度是110000次/s,写的速度是81000次/s

  • 丰硕的数据类型 – Redis支撑二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操纵

  • 原子 – Redis的所有操纵都是原子性的,意思就是要末成功施行要末失败完全不施行。单个操纵是原子性的。多个操纵也支撑事务,即原子性,通过MULTI和EXEC指令包起来

下载与安装

  • 下载并解紧缩

wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
  • 将文件夹挪移到/usr/local/中

mv redis-5.0.3 /usr/local/
  • 进入到文件夹中并编译测试

cd /usr/local/redis-5.0.3
sudo make test
  • 编译安装

sudo make install
  • 启动redis

redis-server

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

mysql与redis做二级缓存

  • 关于拜访量比拼大的数据我们为了能够更快的猎取到数据需要对数据库中猎取的数据进行数据缓存。

  • 在项目傍边运用Redis缓存流程

    数据缓存应当考虑同步题目:要是对数据进行了缓存,当查询数据时,要是缓存中有数据则直接返回缓存数据不会查询数据库,当数据库数据转变的时候就有可能涌现数据库纷歧致的题目。可以考虑在每次修改数据库的时候同时将对应的缓存数据删除,这样从新查询的时候就会查询数据库并缓存

    1. 查询时先从缓存傍边查询

    2. 缓存傍边要是没有数据再从数据库查询,并将数据保留进缓存傍边

    3. 要是缓存中查询到了数据直接返回,不再需要查询数据库

步骤实现
  • 新建redisPool.go文件用于连贯池的初始化

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
        },
    }
}
  • 新建main.go文件实现二级缓存

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实现二级缓存的办法介绍(代码示例)的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有153人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板