学习别人的知识,然后自己也分不清是记住了还是理解了,然后就写一写,发现看过的会了,和自己写一遍还是有差别的,希望自己这次可以坚持的好点,加油!
思路:先查询redis中是否有缓存的数据,如果没有,就查询mysql数据库,查询到数据后,将查询到的数据写到redis中,设置expire超时时间。
注意点:从数据库中查询到的结果是结构体切片,所以需要先定义一个结构体,这个结构体和查询出的数据的字段对应,注意首字母大写,不然mysql,redis的第三方包无法访问;
第二,定义接收查询到的记录的结构体切片
第三,将结构体的切片传给redis缓存
getdatafrommysql函数了,有一个fmt.Println(&infos)发现打印一下,返回infos的结构体就正常,不打印返回就会失败,啥问题搞不清,另外redis查询到的数据,需要使用redis的strings转换成字符串切片然后返回,进行长度判断。
package main
import (
"fmt"
"os"
"github.com/garyburd/redigo/redis"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
func handleerror(err error, when string) {
if err != nil {
fmt.Println(err, when)
fmt.Println("handlerror print the faile reason")
os.Exit(1)
}
}
//define infomation struct
type infostruct struct {
Name string
Age int
}
func main() {
fmt.Println("get infomation from database")
//if redis database not exist info,get info from mysql
infos := make([]infostruct, 0)
for {
var cmd string
fmt.Scan(&cmd)
switch cmd {
case "getall":
infostr := getinfofromredis()
if infostr == nil || len(infostr) == 0 {
infostr2 := getinfofrommysql(infos)
// fmt.Println(infostr2)
// for _, p := range infostr2 {
// fmt.Println(p)
// }
cacheinfo2redis(infostr2)
} else {
fmt.Println(infostr)
}
case "exit":
goto GAMEOVER
default:
fmt.Println("unsourrpot command")
}
}
GAMEOVER:
fmt.Println("bye-bye")
}
func getinfofromredis() (resultstring []string) {
fmt.Println("get data from redis server")
rediscon, err := redis.Dial("tcp", "127.0.0.1:6379")
defer rediscon.Close()
handleerror(err, "connection redis server")
result, err := rediscon.Do("lrange", "info", "0", "-1")
handleerror(err, "get info from redis server")
resultstring, err = redis.Strings(result, err)
return
}
func getinfofrommysql(infos []infostruct) (infomations []infostruct) {
fmt.Println("get data from mysql server")
db, err := sqlx.Connect("mysql", "root:warrior@tcp(127.0.0.1:3306)/mydb")
defer db.Close()
handleerror(err, "connect to mysql")
err2 := db.Select(&infos, "select name,age from person")
handleerror(err2, "query mysql failed")
fmt.Println(&infos)
infomations = infos
return
}
func cacheinfo2redis(infos []infostruct) {
fmt.Println("begin to cache data to redis")
rediscon, err := redis.Dial("tcp", "127.0.0.1:6379")
defer rediscon.Close()
handleerror(err, "cache info to redis")
_, err2 := rediscon.Do("del", "info")
handleerror(err2, "cache info to redis")
for _, info := range infos {
//fmt.Println(info)
_, err := rediscon.Do("lpush", "info", info)
handleerror(err, "lpush info to redis server")
}
rediscon.Do("expire", "info", 30)
fmt.Println("cache infomation scuccess")
//return
}
原文:https://www.cnblogs.com/warrior-tian/p/12862833.html