golang操作Redis(redigo基礎篇)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。


現在的redis大紅大紫,而且很多應用情境都適合使用Reids來做緩衝或者直接做儲存,典型的如mysql前端緩衝、手遊裡面的熱門排行榜等。那麼我們怎樣用golang來操作redis呢?

熟悉redis的同學,肯定第一反應就是按照redis的協議,實現一個用戶端與redis服務進行通訊即可。不熟悉redis的同學,可能會說用cgo封裝下官方的c用戶端,妥妥的。是的,這兩種方法都可以。既然redis這麼火,那麼這些工作有沒有人做呢?答案是肯定的。在redis的官方網站的用戶端列表裡就有眾多golang的用戶端。這個時候,可能你又要犯難了,我該用哪一個呢?

熟悉reids的同學都知道,官網加星星的用戶端都是好用戶端,就像棒子天上的星星一樣神奇。可是坑爹的時,golang不同於python有兩個都是加星星的,這孰真孰假呢?

具體我也瞭解,不過大概瀏覽了下源碼,二者都是用golang實現了redis得協議,不過radix的源碼感覺不是那麼清晰,相對來說redigo的源碼可以和命令對上,比較清晰,且redigo說其支援所有的redis命令。然後又網上搜了幾篇文章1/文章2,最終還是選擇了redigo來嘗試。

1、建立串連

conn聽,聽err聽:=聽redis.DialTimeout("tcp",聽":6379",聽0,聽1*time.Second,聽1*time.Second)

參數的意義分別是網路類型“tcp”、地址和連接埠、連線逾時、讀逾時和寫逾時時間。有了串連後。我們就可以進行其他動作了。先看下db的大小

size聽,err聽:=聽conn.Do("DBSIZE")fmt.Printf("size聽is聽%d聽\n",size)//輸出:size聽is聽8

在使用完後,通過調用聽conn.Close()聽關閉串連。

2、基本命令執行

對於最基本的命令使用,我們統一調用:

Do(commandName聽string,聽args聽...interface{})聽(reply聽interface{},聽err聽error)

這個介面,整個過程就和我們使用redis命令一樣。

我們知道在redis的協議中,都是按照字元流的,那麼Do函數是如何進行序列化的呢?下面是其轉換規則:

Go聽Type聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Conversion[]byte聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Sent聽as聽isstring聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Sent聽as聽isint,聽int64聽聽聽聽聽聽聽聽聽聽聽聽聽聽strconv.FormatInt(v)float64聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽strconv.FormatFloat(v,聽'g',聽-1,聽64)bool聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽true聽->聽"1",聽false聽->聽"0"nil聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽""all聽other聽types聽聽聽聽聽聽聽聽聽fmt.Print(v)

其實就是byte數組和字串不變,整形和浮點數轉換成對應的字串,bool用1或者0表示,nil為空白字串。

下面再看下執行後得到的結果傳回值的類型:

Redis聽type聽聽聽聽聽聽聽聽聽聽聽聽聽聽Go聽typeerror聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽redis.Errorinteger聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽int64simple聽string聽聽聽聽聽聽聽聽聽聽聽stringbulk聽string聽聽聽聽聽聽聽聽聽聽聽聽聽[]byte聽or聽nil聽if聽value聽not聽present.array聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽[]interface{}聽or聽nil聽if聽value聽not聽present.

如上表,redis中得類型會對應的轉換成左邊go中得類型,無需多解釋。我們來看幾個例子:

conn聽,聽err聽:=聽redis.DialTimeout("tcp",聽":6379",聽0,聽1*time.Second,聽1*time.Second)if聽err聽!=聽nil聽{聽聽聽聽panic(err)}size聽,err:=聽conn.Do("DBSIZE")fmt.Printf("size聽is聽%d聽\n",size)_,err聽=聽conn.Do("SET","user:user0",123)_,err聽=聽conn.Do("SET","user:user1",456)_,err聽=聽conn.Do("APPEND","user:user0",87)user0,err聽:=聽redis.Int(conn.Do("GET","user:user0"))user1,err聽:=聽redis.Int(conn.Do("GET","user:user1"))fmt.Printf("user0聽is聽%d聽,聽user1聽is聽%d聽\n",user0,user1)conn.Close()

從redis傳回來得普通對象(整形、字串、浮點數)。redis提供了類型轉換函式供轉換:

func聽Bool(reply聽interface{},聽err聽error)聽(bool,聽error)func聽Bytes(reply聽interface{},聽err聽error)聽([]byte,聽error)func聽Float64(reply聽interface{},聽err聽error)聽(float64,聽error)func聽Int(reply聽interface{},聽err聽error)聽(int,聽error)func聽Int64(reply聽interface{},聽err聽error)聽(int64,聽error)func聽String(reply聽interface{},聽err聽error)聽(string,聽error)func聽Strings(reply聽interface{},聽err聽error)聽([]string,聽error)func聽Uint64(reply聽interface{},聽err聽error)聽(uint64,聽error)

這裡只是舉了set和get命令。其他的例子可以參見redigo的conn_test.go


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.