旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

MySQL与Redis完成二级缓存的要领引见(代码示例)【MySQL教程】,MySQL

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:53评论:0


导读:本篇文章给人人带来的内容是关于MySQL与Redis完成二级缓存的要领引见(代码示例),有肯定的参考价值,有须要的朋侪可以参考一下,愿望对你有所协助。redis简介R...

本篇文章给人人带来的内容是关于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完成二级缓存的要领引见(代码示例)的细致内容,更多请关注ki4网别的相干文章!

标签:MySQL


欢迎 发表评论: