当前位置:首页 > MySQL教程 > 正文内容

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

搜教程4年前 (2019-12-01)MySQL教程149

本篇文章给人人带来的内容是关于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网别的相干文章!

扫描二维码推送至手机访问。

版权声明:本文由搜教程网发布,如需转载请注明出处。

本文链接:https://www.sojiaocheng.cn/15754.html

标签: MySQL
分享给朋友:

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

怎样运用delphi将Clientdataset的Delta保存到数据库中【MySQL教程】,Clientdataset,delphi,Delta

[delphi] view plain copy //ATableName-表名, AKeyField-主键,多个主键用;离隔,如 ;pid;times; from:unit HlsImplBase; [delphi] view plain copy function THlsImplB...

mysql索引index相干敕令的细致引见【MySQL教程】,mysql,index,命令

mysql索引index相干敕令的细致引见【MySQL教程】,mysql,index,命令

本文主要内容: 显现表中多有的索引show all index 增加索引ADD INDEX, 增加唯一索引add unique index 多列团结增加索引,primary key 关键词index vs key show all index show index fr...

Mysql相干操纵有哪些【MySQL教程】,Mysql,哪些,相关

Mysql相干操纵有哪些【MySQL教程】,Mysql,哪些,相关

1》建立数据库:   语法:create database 数据库名;   语法:show databases 检察已存在数据库   举例:    Mysql->create database zytest; 注重每一条要以;号末端     Mysql->show d...

mysql自动猎取时候日期的要领【MySQL教程】,mysql,日期,时间

mysql自动猎取时候日期的要领【MySQL教程】,mysql,日期,时间

完成体式格局: 1、将字段范例设为 TIMESTAMP 2、将默许值设为 CURRENT_TIMESTAMP 举例运用: 1、MySQL 剧本完成用例 --增加CreateTime 设置默许时候 CURRENT_TIMESTAMP ALTER TABLE `table_...

MySql中非常重要的索引操纵【MySQL教程】,MySql,重要的,操作

偏重基本之—MySql 不能忘记的索引操纵   关于MySql索引的基本知识我就不在这里写了,我不太想当信息的搬运工。   技能分享:Workbench 作为一款专为MySQL设想的ER/数据库建模东西。除了治理数据库外,实在也是一款Sql语句生成利器。合理运用,将带来事半功倍的结果。固然,条件...

数据库查询优化要领【MySQL教程】,数据库,方法,查询

数据库查询优化要领【MySQL教程】,数据库,方法,查询

数据库查询优化 1.运用索引 应只管防止全表扫描,首先应斟酌在 where 及 order by ,groupby 触及的列上竖立索引。 2.优化sql语句 经由过程 explain(查询优化神器)用来检察 SQL 语句的实行效果,能够协助挑选更好的索引和优化查询...