最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、需求

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

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

先實現(xiàn)需求二,當輸入命令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)
}

第一步還是導(dǎo)包,需要在mysql驅(qū)動包前面加上下劃線_,因為它只是一個驅(qū)動文件,并不需要在代碼中調(diào)用它的有關(guān)API接口.
接下來的這個結(jié)構(gòu)體中后面的db:"name" db:"age"一定要加反單引號,否則運行時會報錯。(傻傻的編者剛開始這里就出現(xiàn)問題啦~)

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

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

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

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

三、寫一個錯誤處理函數(shù)

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

因為后面需要處理很多錯誤,而錯誤處理也是GO的一個特性,所以我們這先寫一個錯誤處理函數(shù)。

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

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

請輸入命令:
getall
allPeople
[{大揚 21} {小飛 21} {大紅袍 1} {小芳 18}]
緩存成功!
請輸入命令:

然后去看看數(shù)據(jù)庫里面存進去沒有。

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數(shù)據(jù)庫內(nèi)的數(shù)據(jù)。

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

已經(jīng)消失了。

再寫一個函數(shù):

func GetPeopleFromRedis() (peopleStrs []string) {
    //連數(shù)據(jù)庫 
    conn, _ := redis.Dial("tcp", "localhost:6379")
    //延遲關(guān)閉
    defer conn.Close()
    //執(zhí)行命令
    reply, err := conn.Do("lrange", "people", 0, -1)
    //處理錯誤
    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命令來獲取people的所有值。

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

相關(guān)文章

  • golang類型轉(zhuǎn)換組件Cast的使用詳解

    golang類型轉(zhuǎn)換組件Cast的使用詳解

    這篇文章主要介紹了golang類型轉(zhuǎn)換組件Cast的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用golang,感興趣的朋友可以了解下
    2021-02-02
  • 利用rpm打包上線部署golang代碼的方法教程

    利用rpm打包上線部署golang代碼的方法教程

    RPM是RPM Package Manager(RPM軟件包管理器)的縮寫,這篇文章主要給大家介紹了關(guān)于利用rpm打包上線部署golang代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Go語言kylin任務(wù)自動化實例詳解

    Go語言kylin任務(wù)自動化實例詳解

    這篇文章主要為大家介紹了Go語言kylin任務(wù)自動化實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 聊聊go xorm生成mysql的結(jié)構(gòu)體問題

    聊聊go xorm生成mysql的結(jié)構(gòu)體問題

    這篇文章主要介紹了go xorm生成mysql的結(jié)構(gòu)體問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-03-03
  • GoLang完整實現(xiàn)快速列表

    GoLang完整實現(xiàn)快速列表

    這篇文章主要介紹了GoLang完整實現(xiàn)快速列表,列表是一種非連續(xù)的存儲容器,由多個節(jié)點組成,節(jié)點通過一些 變量 記錄彼此之間的關(guān)系,列表有多種實現(xiàn)方法,如單鏈表、雙鏈表等
    2022-12-12
  • golang實現(xiàn)openssl自簽名雙向認證的詳細步驟

    golang實現(xiàn)openssl自簽名雙向認證的詳細步驟

    這篇文章主要介紹了golang實現(xiàn)openssl自簽名雙向認證的詳細步驟,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • Golang Web 框架Iris安裝部署

    Golang Web 框架Iris安裝部署

    這篇文章主要為大家介紹了Golang Web 框架Iris安裝部署,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang反射模塊reflect使用方式示例詳解

    Golang反射模塊reflect使用方式示例詳解

    Golang的反射功能,在很多場景都會用到,最基礎(chǔ)的莫過于rpc、orm跟json的編解碼,更復(fù)雜的可能會到做另外一門語言的虛擬機,這篇文章主要介紹了Golang反射模塊reflect使用方式探索,需要的朋友可以參考下
    2023-01-01
  • Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)

    Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)

    這篇文章主要介紹了Golang學(xué)習(xí)筆記之延遲函數(shù)(defer),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Go語言學(xué)習(xí)教程之反射的示例詳解

    Go語言學(xué)習(xí)教程之反射的示例詳解

    這篇文章主要通過記錄對reflect包的簡單使用,來對反射有一定的了解。文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-09-09

最新評論

罗山县| 桦南县| 玛多县| 长宁县| 慈利县| 永定县| 渭南市| 永登县| 青冈县| 敦化市| 漯河市| 兴海县| 阳高县| 仙游县| 天柱县| 新野县| 抚松县| 台州市| 洞头县| 宝坻区| 呼图壁县| 介休市| 公主岭市| 千阳县| 岳普湖县| 洛扎县| 水富县| 龙海市| 镇赉县| 乐至县| 抚州市| 普定县| 晋城| 高州市| 南溪县| 格尔木市| 扎兰屯市| 弥渡县| 淳安县| 梧州市| 瑞金市|