• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL和Redis实现二级缓存的方法详解

    redis简介

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库

    Redis 与其他 key - value 缓存产品有以下三个特点:

    优势

    下载与安装

    下载并解压缩

    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

    mysql与redis做二级缓存

    对于访问量比较大的数据我们为了能够更快的获取到数据需要对数据库中获取的数据进行数据缓存。

    在项目当中使用Redis缓存流程

    数据缓存应该考虑同步问题:如果对数据进行了缓存,当查询数据时,如果缓存中有数据则直接返回缓存数据不会查询数据库,当数据库数据改变的时候就有可能出现数据库不一致的问题。可以考虑在每次修改数据库的时候同时将对应的缓存数据删除,这样重新查询的时候就会查询数据库并缓存

    步骤实现

    创建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的查询缓存和Buffer Pool
    • mysqldump造成Buffer Pool污染的研究
    • redis服务器环境下mysql实现lnmp架构缓存
    • mysql select缓存机制使用详解
    • MySQL缓存的查询和清除命令使用详解
    • PHP使用redis实现统计缓存mysql压力的方法
    • MySQL高速缓存启动方法及参数详解(query_cache_size)
    • 清空mysql 查询缓存的可行方法
    • 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析
    • 详解MySQL中的缓冲池(buffer pool)
    上一篇:MySQL普通索引和唯一索引的深入讲解
    下一篇:MySQL limit性能分析与优化
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL和Redis实现二级缓存的方法详解 MySQL,和,Redis,实现,二级,