欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go應(yīng)該如何實(shí)現(xiàn)二級(jí)緩存

 更新時(shí)間:2021年08月12日 10:50:21   作者:ReganYue  
本文主要介紹了Go二級(jí)緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、需求

  • 實(shí)現(xiàn)二級(jí)緩存
  • 程序運(yùn)行起來(lái)后提示:“請(qǐng)輸入命令:”,如果輸入getall,查詢并顯示所有人員的信息
  • 第一次時(shí)查詢mysql并將結(jié)果緩存在redis,設(shè)置60秒的過(guò)期時(shí)間
  • 以后的每次查詢,如果redis有數(shù)據(jù)就從redis加載,沒(méi)有則重復(fù)上一步的操作

二、實(shí)現(xiàn)連接Mysql并執(zhí)行查詢語(yǔ)句

先實(shí)現(xiàn)需求二,當(dāng)輸入命令getall時(shí),查詢并顯示所有人員的信息。

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("請(qǐng)輸入命令:")
        fmt.Scan(&cmd)
​
        switch cmd{
        case "getall":
            //顯示所有人的信息
            GetAllPeople()
        case "exit":
            //退出程序
            goto GAMEOVER
        default:
            fmt.Println("輸入的命令有誤,請(qǐng)重新輸入!")
        }
    }
    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)
}

第一步還是導(dǎo)包,需要在mysql驅(qū)動(dòng)包前面加上下劃線_,因?yàn)樗皇且粋€(gè)驅(qū)動(dòng)文件,并不需要在代碼中調(diào)用它的有關(guān)API接口.
接下來(lái)的這個(gè)結(jié)構(gòu)體中后面的db:"name" db:"age"一定要加反單引號(hào),否則運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。(傻傻的編者剛開(kāi)始這里就出現(xiàn)問(wèn)題啦~)

type Human struct {
    Name string `db:"name"`
    Age int `db:"age"`
}

然后main函數(shù)里面都是一些基本語(yǔ)法知識(shí),用了switch和goto這兩個(gè)內(nèi)容。
接下來(lái)就是連接數(shù)據(jù)庫(kù)了,這里要用到數(shù)據(jù)庫(kù)擴(kuò)展包Sqlx,Sqlx包其實(shí)最大最大的優(yōu)點(diǎn)是在查詢方面,也就是使用select時(shí)優(yōu)化得比較好。比原來(lái)的使用查詢方便了不止一點(diǎn)。

db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")

driverName:mysql,表示驅(qū)動(dòng)器的名稱是mysql也就上面"github.com/go-sql-driver/mysql"導(dǎo)入的驅(qū)動(dòng)器。
dataSourceName是root:123456@tcp(localhost:3306)/mydb 它的含義是 賬戶名:密碼@tcp(ip:端口)/數(shù)據(jù)庫(kù)名稱。
將緩存查詢結(jié)果到Redis,就是通過(guò)這個(gè)函數(shù)CachePeople2Redis(people)。

三、寫(xiě)一個(gè)錯(cuò)誤處理函數(shù)

func HandleError(err error,why string)  {
    if err != nil{
        fmt.Println(err,why)
        os.Exit(1)
    }
}

因?yàn)楹竺嫘枰幚砗芏噱e(cuò)誤,而錯(cuò)誤處理也是GO的一個(gè)特性,所以我們這先寫(xiě)一個(gè)錯(cuò)誤處理函數(shù)。

四、設(shè)置二級(jí)緩存

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()這個(gè)函數(shù)是用來(lái)連接redis的,需要給定網(wǎng)絡(luò)協(xié)議和IP地址及端口號(hào),redis的端口號(hào)默認(rèn)為6379.
defer conn.Close()表示延時(shí)結(jié)束與redis的連接,為了節(jié)省系統(tǒng)的io資源,需要及時(shí)關(guān)閉連接!剛?cè)腴T時(shí)我們很容易忘記這個(gè),需要我們養(yǎng)成習(xí)慣!
conn.Do()是用來(lái)執(zhí)行數(shù)據(jù)庫(kù)命令的,第一個(gè)參數(shù)是命令名,后面的參數(shù)是數(shù)據(jù)庫(kù)命令的參數(shù)。它返回的結(jié)果中reply是字節(jié)數(shù)組[]byte類型,需要根據(jù)具體的業(yè)務(wù)類型進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
這段代碼先將people數(shù)組中的每一個(gè)human放入到redis的people列表中。然后再執(zhí)行expire命令,將列表設(shè)置過(guò)期時(shí)間。
執(zhí)行成功!下面是運(yùn)行結(jié)果:

請(qǐng)輸入命令:
getall
allPeople
[{大揚(yáng) 21} {小飛 21} {大紅袍 1} {小芳 18}]
緩存成功!
請(qǐng)輸入命令:

然后去看看數(shù)據(jù)庫(kù)里面存進(jìn)去沒(méi)有。

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}"

過(guò)了一分鐘之后,再查看redis數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)。

127.0.0.1:6379> lrange people 0 -1
(empty list or set)

已經(jīng)消失了。

再寫(xiě)一個(gè)函數(shù):

func GetPeopleFromRedis() (peopleStrs []string) {
    //連數(shù)據(jù)庫(kù) 
    conn, _ := redis.Dial("tcp", "localhost:6379")
    //延遲關(guān)閉
    defer conn.Close()
    //執(zhí)行命令
    reply, err := conn.Do("lrange", "people", 0, -1)
    //處理錯(cuò)誤
    HandleError(err,"@lrange people 0 -1")
    //類型轉(zhuǎn)換
    peopleStrs, err = redis.Strings(reply, err)
    //打印結(jié)果
    fmt.Println("緩存拿取結(jié)果:",peopleStrs,err)
    return
}

如果redis里面有就不需要從mysql里面取數(shù)據(jù)了。直接從redis里面利用lrange命令來(lái)獲取people的所有值。

到此這篇關(guān)于Go應(yīng)該如何實(shí)現(xiàn)二級(jí)緩存的文章就介紹到這了,更多相關(guān)Go 二級(jí)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言使用中提示%!(NOVERB)的解決方案

    go語(yǔ)言使用中提示%!(NOVERB)的解決方案

    o語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種簡(jiǎn)單易用的編程語(yǔ)言,同時(shí)保持高效性和可擴(kuò)展性,它支持垃圾回收機(jī)制,具有強(qiáng)大的并發(fā)編程能力,可以輕松處理大規(guī)模的并發(fā)任務(wù),Go語(yǔ)言還擁有豐富的標(biāo)準(zhǔn)庫(kù)和活躍的開(kāi)發(fā)社區(qū),使得開(kāi)發(fā)者能夠快速構(gòu)建出高質(zhì)量的應(yīng)用程序,需要的朋友可以參考下
    2023-10-10
  • Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync.Once使用場(chǎng)景及性能優(yōu)化詳解

    Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync.Once使用場(chǎng)景及性能優(yōu)化詳解

    這篇文章主要為大家介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync.Once使用場(chǎng)景及性能優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go函數(shù)的使用示例教程

    Go函數(shù)的使用示例教程

    這篇文章主要介紹了Go函數(shù)的使用示例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • go語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)

    go語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)

    Go語(yǔ)言是一種靜態(tài)類型、編譯型的編程語(yǔ)言,其中結(jié)構(gòu)體是一種非常重要的數(shù)據(jù)類型,本文就來(lái)介紹一下go語(yǔ)言中結(jié)構(gòu)體tag使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • go語(yǔ)法入門泛型type?parameters簡(jiǎn)稱T(類型形參)兩種場(chǎng)景使用

    go語(yǔ)法入門泛型type?parameters簡(jiǎn)稱T(類型形參)兩種場(chǎng)景使用

    這篇文章主要為大家介紹了go語(yǔ)法入門泛型type?parameters簡(jiǎn)稱T(類型形參)兩種場(chǎng)景使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Go實(shí)現(xiàn)郵箱驗(yàn)證碼API功能

    使用Go實(shí)現(xiàn)郵箱驗(yàn)證碼API功能

    本文將帶你了解一個(gè)項(xiàng)目如何實(shí)現(xiàn)一個(gè)郵箱驗(yàn)證接口,即一個(gè)可用的發(fā)送郵箱驗(yàn)證碼API和驗(yàn)證驗(yàn)證碼是否正確功能,對(duì)Go實(shí)現(xiàn)郵箱驗(yàn)證碼API詳細(xì)過(guò)程感興趣的朋友一起看看吧
    2024-06-06
  • 一文帶你掌握Golang中panic與recover的使用方法

    一文帶你掌握Golang中panic與recover的使用方法

    這篇文章主要介紹了Golang中panic與recover的作用和使用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下
    2023-04-04
  • Golang使用gin框架實(shí)現(xiàn)一個(gè)完整的聊天室功能

    Golang使用gin框架實(shí)現(xiàn)一個(gè)完整的聊天室功能

    由于我們項(xiàng)目的需要,我就研究了一下關(guān)于websocket的相關(guān)內(nèi)容,去實(shí)現(xiàn)一個(gè)聊天室的功能,經(jīng)過(guò)幾天的探索,現(xiàn)在使用Gin框架實(shí)現(xiàn)了一個(gè)完整的聊天室+消息實(shí)時(shí)通知系統(tǒng),感興趣的小伙伴歡迎閱讀本文
    2023-08-08
  • 從Context到go設(shè)計(jì)理念輕松上手教程

    從Context到go設(shè)計(jì)理念輕松上手教程

    這篇文章主要為大家介紹了從Context到go設(shè)計(jì)理念輕松上手教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go并發(fā)與鎖的兩種方式該如何提效詳解

    Go并發(fā)與鎖的兩種方式該如何提效詳解

    如果沒(méi)有鎖,在我們的項(xiàng)目中,可能會(huì)存在多個(gè)goroutine同時(shí)操作一個(gè)資源(臨界區(qū)),這種情況會(huì)發(fā)生競(jìng)態(tài)問(wèn)題(數(shù)據(jù)競(jìng)態(tài)),下面這篇文章主要給大家介紹了關(guān)于Go并發(fā)與鎖的兩種方式該如何提效的相關(guān)資料,需要的朋友可以參考下
    2022-12-12

最新評(píng)論