golang redis做二級緩存示例代碼


學習別人的知識,然后自己也分不清是記住了還是理解了,然后就寫一寫,發現看過的會了,和自己寫一遍還是有差別的,希望自己這次可以堅持的好點,加油!

思路:先查詢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
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM