目錄
- 一、需求
- 二、實現連接Mysql并執行查詢語句
- 三、寫一個錯誤處理函數
- 四、設置二級緩存
一、需求
- 實現二級緩存
- 程序運行起來后提示:“請輸入命令:”,如果輸入getall,查詢并顯示所有人員的信息
- 第一次時查詢mysql并將結果緩存在redis,設置60秒的過期時間
- 以后的每次查詢,如果redis有數據就從redis加載,沒有則重復上一步的操作
二、實現連接Mysql并執行查詢語句
先實現需求二,當輸入命令getall時,查詢并顯示所有人員的信息。
package main
import (
"fmt"
_"github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type Human struct {
Name string `db:"name"`
Age int `db:"age"`
}
func main() {
var cmd string
for{
fmt.Println("請輸入命令:")
fmt.Scan(cmd)
switch cmd{
case "getall":
//顯示所有人的信息
GetAllPeople()
case "exit":
//退出程序
goto GAMEOVER
default:
fmt.Println("輸入的命令有誤,請重新輸入!")
}
}
GAMEOVER:
fmt.Println("GAME OVER")
}
func GetAllPeople() {
fmt.Println("allPeople")
//先嘗試拿緩存
GetPeopleFromRedis()
db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")
defer db.Close()
var people []Human
err := db.Select(people, "select name,age from person")
if err!=nil{
fmt.Println("查詢失敗!err=",err)
}
fmt.Println(people)
CachePeople2Redis(people)
}
第一步還是導包,需要在mysql驅動包前面加上下劃線_,因為它只是一個驅動文件,并不需要在代碼中調用它的有關API接口.
接下來的這個結構體中后面的db:"name" db:"age"一定要加反單引號,否則運行時會報錯。(傻傻的編者剛開始這里就出現問題啦~)
type Human struct {
Name string `db:"name"`
Age int `db:"age"`
}
然后main函數里面都是一些基本語法知識,用了switch和goto這兩個內容。
接下來就是連接數據庫了,這里要用到數據庫擴展包Sqlx,Sqlx包其實最大最大的優點是在查詢方面,也就是使用select時優化得比較好。比原來的使用查詢方便了不止一點。
db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")
driverName:mysql,表示驅動器的名稱是mysql也就上面"github.com/go-sql-driver/mysql"導入的驅動器。
dataSourceName是root:123456@tcp(localhost:3306)/mydb 它的含義是 賬戶名:密碼@tcp(ip:端口)/數據庫名稱。
將緩存查詢結果到Redis,就是通過這個函數CachePeople2Redis(people)。
三、寫一個錯誤處理函數
func HandleError(err error,why string) {
if err != nil{
fmt.Println(err,why)
os.Exit(1)
}
}
因為后面需要處理很多錯誤,而錯誤處理也是GO的一個特性,所以我們這先寫一個錯誤處理函數。
四、設置二級緩存
func CachePeople2Redis(people []Human) {
conn, _ := redis.Dial("tcp", "localhost:6379")
defer conn.Close()
for _,human := range people{
humanStr := fmt.Sprint(human)
_, err := conn.Do("rpush", "people", humanStr)
if err != nil{
fmt.Println("緩存失敗(rpush people),err=",err)
return
}
}
_, err := conn.Do("expire", "people", 66)
if err!=nil{
HandleError(err,"@expire people 60")
}
fmt.Println("緩存成功!")
}
redis.Dial()這個函數是用來連接redis的,需要給定網絡協議和IP地址及端口號,redis的端口號默認為6379.
defer conn.Close()表示延時結束與redis的連接,為了節省系統的io資源,需要及時關閉連接!剛入門時我們很容易忘記這個,需要我們養成習慣!
conn.Do()是用來執行數據庫命令的,第一個參數是命令名,后面的參數是數據庫命令的參數。它返回的結果中reply是字節數組[]byte類型,需要根據具體的業務類型進行數據類型轉換。
這段代碼先將people數組中的每一個human放入到redis的people列表中。然后再執行expire命令,將列表設置過期時間。
執行成功!下面是運行結果:
請輸入命令:
getall
allPeople
[{大揚 21} {小飛 21} {大紅袍 1} {小芳 18}]
緩存成功!
請輸入命令:
然后去看看數據庫里面存進去沒有。
127.0.0.1:6379> lrange people 0 -1
1) "{\xe5\xa4\xa7\xe6\x89\xac 21}"
2) "{\xe5\xb0\x8f\xe9\xa3\x9e 21}"
3) "{\xe5\xa4\xa7\xe7\xba\xa2\xe8\xa2\x8d 1}"
4) "{\xe5\xb0\x8f\xe8\x8a\xb3 18}"
過了一分鐘之后,再查看redis數據庫內的數據。
127.0.0.1:6379> lrange people 0 -1
(empty list or set)
已經消失了。
再寫一個函數:
func GetPeopleFromRedis() (peopleStrs []string) {
//連數據庫
conn, _ := redis.Dial("tcp", "localhost:6379")
//延遲關閉
defer conn.Close()
//執行命令
reply, err := conn.Do("lrange", "people", 0, -1)
//處理錯誤
HandleError(err,"@lrange people 0 -1")
//類型轉換
peopleStrs, err = redis.Strings(reply, err)
//打印結果
fmt.Println("緩存拿取結果:",peopleStrs,err)
return
}
如果redis里面有就不需要從mysql里面取數據了。直接從redis里面利用lrange命令來獲取people的所有值。
到此這篇關于Go應該如何實現二級緩存的文章就介紹到這了,更多相關Go 二級緩存內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Django如何實現內容緩存示例詳解
- redis之django-redis的簡單緩存使用
- django緩存配置的幾種方法詳解
- 詳解Django框架中的視圖級緩存
- 詳解Django緩存處理中Vary頭部的使用
- Django中提供的6種緩存方式詳解
- react+django清除瀏覽器緩存的幾種方法小結
- golang實現LRU緩存淘汰算法的示例代碼
- Django頁面數據的緩存與使用的具體方法