天天看點

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

這一講我們主要介紹一下另一個常用存儲形式——G中Redis的使用方法。首先我們要先在本地安裝好一個測試用的Redis環境。可以參考文章,https://www.runoob.com/redis/redis-install.html 。

我當時安裝的版本是redis-4.0.10,安裝完之後切換到Redis安裝目錄下。執行 ./src/redis-server指令。啟動Redis服務,就會看到如下Redis啟動成功界面。Redis的啟動預設端口為6379。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

Redis啟動圖

然後還是複制之前的gotest5項目,更改main.go(反正我們的大多數例子都是隻更改這個檔案。)

更改main.go檔案代碼如下:

package main
import (
    "log"
    "github.com/gin-gonic/gin"
    "github.com/gomodule/redigo/redis"
)
var c redis.Conn
const (
    redis_passwd  = ""
    redis_host    = ""
    redis_port    = "6379"
    redis_address = "127.0.0.1:6379"
)
func getConn() redis.Conn {
    re_c, err := redis.Dial("tcp", redis_address)
    if err != nil {
        log.Println("redis connect err", err)
        panic(err)
    }
    log.Println("redis connect success", re_c)
    return re_c
}
func main() {
    c = getConn()
    r := gin.Default()
    r.Run(":9999") // listen and serve on 0.0.0.0:9999
}
           

代碼清單中http://github.com/gomodule/redigo/redis為Go的Redis工具箱,redis_address為Redis的位址和端口。

redis.Dial方法為Redis的連接配接函數,第一個參數是連結方式(tcp/udp),第二個參數是要連接配接的Redis的位址,執行上面代碼後可以看到下圖。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

Redis連接配接成功

連接配接建立成功之後(在控制台中可以看到代碼中列印的Redis connect success),我們接下來要操作Redis的資料。其實說到操作無非就是兩個,一個是設定、一個是讀取。也就是Set方法和Get方法。具體的代碼如下:

func Set(key string, value interface{}) bool {
    // 在函數體執行完畢之後出發函數
    defer c.Close()
    _, err := c.Do("set", key, value)
    if err != nil {
        log.Println("set a value error,", err)
        return false
    }
    return true
}
func Get(key string) string {
    // 在函數體執行完畢之後出發函數
    defer c.Close()
    value, err := redis.String(c.Do("get", key))
    if err != nil {
        log.Println("get a value error,", err)
        return ""
    }
    return value
}
           

然後我們把main.go的代碼更改為下面這個樣子。大家可以看到在main.go方法中多了兩個Set函數的調用。

Set("abc", "abc")和 Set("number1", 1)。這兩個函數分别是設定key值為abc的value為"abc",key值為number1的value為1。

package main
import (
    "log"
    "github.com/gin-gonic/gin"
    "github.com/gomodule/redigo/redis"
)
var c redis.Conn
const (
    redis_passwd  = ""
    redis_host    = ""
    redis_port    = "6379"
    redis_address = "127.0.0.1:6379"
)
func getConn() redis.Conn {
    re_c, err := redis.Dial("tcp", redis_address)
    if err != nil {
        log.Println("redis connect err", err)
        panic(err)
    }
    log.Println("redis connect success", re_c)
    return re_c
}
func main() {
    c = getConn()
    r := gin.Default()
    Set("abc", "abc")
    Set("number", "1")
    r.Run(":9999") // listen and serve on 0.0.0.0:9999
}
func Set(key string, value interface{}) bool {
    // 在函數體執行完畢之後出發函數
    defer c.Close()
    _, err := c.Do("set", key, value)
    if err != nil {
        log.Println("set a value error,", err)
        return false
    }
    return true
}
func Get(key string) string {
    // 在函數體執行完畢之後出發函數
    defer c.Close()
    value, err := redis.String(c.Do("get", key))
    if err != nil {
        log.Println("get a value error,", err)
        return ""
    }
    return value
}
           

但是在執行上述代碼之後,我們發現在Redis中隻儲存上了一個值,這個儲存操作的狀态在Redis控制台上能看到,并且在我們的Go服務控制台也能看到。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

Redis産生一次更改

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

第二次調用Set存儲報錯

另外,在Redis的安裝目錄下,執行redis-cli之後,我們就可以進入Redis操作台,通過get key方式來擷取我們剛剛存儲的key為abc的value。可以看到是"abc",但是我們查詢一下發現我們設定的number看到是nil值,也就是沒有設定成功的意思。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

在Go的控制台中我們可以看到,設定失敗的原因是我們使用了已經關閉的Redis連接配接來設定資料,究其原因是在我們的代碼清單中,有一行defer c.Close()代碼,在這裡要介紹一下defer函數是Go中特有的函數,具體功能是在defer所在函數體運作完成之後,預設執行的defer 語句後的函數,不論defer放在函數體中任何位置,它都是在整個函數體運作完成之後執行。隻要去掉這部分代碼就可以正常運作。(大多數情況下,如果在服務啟動階段履歷Redis連結就不需要關閉,如果是每次操作建立連接配接,就要在每次操作完Redis之後關閉連接配接),讓我們先把defer 代碼注釋,更改代碼之後我們再執行一下。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

注釋掉defer函數之後的控制台

我們發現在注釋掉defer c.Close()之後,控制台就不再報錯了。緊接着通過Redis操作台通過get操作符擷取abc和number對應的value可以看到,我們之前存儲的"abc"和"1"。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

操作台方式擷取資料

當然在日常的開發工作中,我們不能通過操作台的方式來對Redis進行操作(添加、擷取、删除)。是以接下來我們要介紹一下,如何使用Go進行讀取操作。我們在前文的代碼中已經完成了對于Go的Get函數實作。剩下的隻需要把main中的代碼改成下面這個方法。

func main() {
    c = getConn()
    r := gin.Default()
    fmt.Println(Get("abc"))
    r.Run(":9999") // listen and serve on 0.0.0.0:9999
}
           

在重新運作之後我們會發現,控制台輸出了我們想要擷取的Redis中key為abc的值。

go redis 清空所有值_前端工程師吐後端工程師(第十講)—— Redis使用

讀取abc

至此我們對于Redis的操作工作就完成了,本講還簡單介紹了一下defer的使用場景和用處。defer還可以處理Go當機以及釋放資源,當然更多用法,我們會在實際用到時結合實際使用場景進行介紹。

陳辰(CC老師) [email protected]