MySQL与Redis完成二级缓存的要领引见(代码示例)【MySQL教程】,MySQL
本篇文章给人人带来的内容是关于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缓存流程
数据缓存应当斟酌同步题目:假如对数据举行了缓存,当查询数据时,假如缓存中有数据则直接返回缓存数据不会查询数据库,当数据库数据转变的时刻就有能够涌现数据库不一致的题目。可以斟酌在每次修正数据库的时刻同时将对应的缓存数据删除,如许从新查询的时刻就会查询数据库并缓存
查询时先从缓存当中查询
缓存当中假如没有数据再从数据库查询,并将数据保留进缓存当中
假如缓存中查询到了数据直接返回,不再须要查询数据库
步骤完成
建立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网别的相干文章!