[Go][Redis]Go與Redis

小黑
發佈於後端 個房間
閱讀時間約 12 分鐘

下載

go get github.com/gomodule/redigo


連接

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()
}


設定

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

_, err = c.Do("Set", "username", "jim")
if err != nil {
fmt.Println(err)
return
}
}


獲取字串

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

res, err := redis.String(c.Do("Get", "username"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res)
}


批次設定

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

_, err = c.Do("MSet", "username", "james", "phone", "0988888888")
if err != nil {
fmt.Println(err)
return
}
}


批次獲取字串

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

res, err := redis.Strings(c.Do("MGet", "username", "phone"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res)
}


設定Hash

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

_, err = c.Do("HSet", "names", "jim", "barry")
if err != nil {
fmt.Println(err)
return
}
}


獲取Hash

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

res, err := redis.String(c.Do("HGet", "names", "jim"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res)
}


設定過期時間

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

_, err = c.Do("expire", "names", 5)
if err != nil {
fmt.Println(err)
return
}
}


設定佇列

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

_, err = c.Do("lpush", "Queue", "jim", "barry", 9)
if err != nil {
fmt.Println("lpush error: ", err)
return
}

for {
r, err := redis.String(c.Do("lpop", "Queue"))
if err != nil {
fmt.Println("lpop error: ", err)
break
}
fmt.Println(r)
}

res, err := redis.Int(c.Do("llen", "Queue"))
if err != nil {
fmt.Println("llen error: ", err)
return
}
fmt.Println(res)
}


連接池

可以建立多條連線且不釋放,可避免與redis建立連線所需的時間。

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

var pool *redis.Pool

func init() {
pool = &redis.Pool{
MaxIdle: 16, //最大的閒置連線數
MaxActive: 1024,//最大的啟動連線數
IdleTimeout: 300, //最大的閒置連線等待時間
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
}

func main() {
c := pool.Get()
defer c.Close()

_, err := c.Do("Set", "username", "jack")
if err != nil {
fmt.Println(err)
return
}

r, err := redis.String(c.Do("Get", "username"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(r)
}


管道操作與併發

用戶端在發送請求到伺服器時,可以在伺服器「還沒回應」的情況下不斷發送請求,最後再一次接收所有資料。

package main

import (
"fmt"
"github.com/gomodule/redigo/redis"
)

func main() {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("conn redis failed, err:", err)
return
}
defer c.Close()

//Send()會先輸入到輸出緩存
c.Send("SET", "username1", "jim")
c.Send("SET", "username2", "jack")

//Flush()會凊空輸出緩存
c.Flush()

//Receive()會依照FIFO讀取回應
v, err := c.Receive()
fmt.Printf("v:%v,err:%v\n", v, err)
v, err = c.Receive()
fmt.Printf("v:%v,err:%v\n", v, err)
v, err = c.Receive()
fmt.Printf("v:%v,err:%v\n", v, err)
}




7會員
112內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
[Database][SQL]基礎語法
閱讀時間約 1 分鐘
[Go][MySQL]使用方法
閱讀時間約 11 分鐘
[Go][Redis]使用方法
閱讀時間約 2 分鐘
你可能也想看
迎新活動「方格新手村」:新格友註冊加入方格子,知名日料吃到飽餐券送給你! 👉 還不是 vocus 的會員嗎?點此註冊,參與新手村活動 👈 近期站上也出現了不少新格友,為了歡迎各位的加入,「方格新手村」隨之登場! 即日起,只要是新註冊帳號於活動期間內發佈 3 則文章,就有機會抽獎獲得知名日料吃到飽餐券。原格友也可以一起同樂,我們準備了小任
Thumbnail
2024-06-21
閱讀心得:展現自我的生活態度|成熟大人的說話課我們每天都在說話,但說出的話合適嗎? Sunny最近讀完一本有關溝通的書籍。 這是由世紀奧美公關的創辦人「丁菱娟」所寫的書,書的全名《丁菱娟的成熟大人說話課:如何說,才能得體又不傷人?反擊時,如何堅定又有力量?任何情境都可用的38個溝通之道》。 會找這本書來看,主要是因為Sunny 近期發
Thumbnail
2024-07-10
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
Go Stronger新賽季新希望,每隻球隊都有自己的中心思想、歡呼口號、應援歌曲,然而不變的最終目標就是贏得年度總冠軍,在那之前所能做的、就是全力以赴,永不退縮。
Thumbnail
【Go】學習資源紀錄:Ultimate Go Programming(Ardan Labs)原本的計畫是寫系列文,一天嗑一點,雖然完整影片約17小時,分批消化卻花了我近10天,現在回去看我第一天寫的草稿,編輯時間已經是半年前...。
2024-04-04
Go Ready Love.親了,然後呢? 過了一兩分鐘姐姐似乎是回神過來,丟下一句妳先不要下車,接著關上我這邊的車門,回到駕駛座,我內心的OS:完了完了巴比Q了༼⁠⁰⁠o⁠⁰⁠;⁠༽ 「明天早上幾點來接妳?」 我???(⁠ʘ⁠ᗩ⁠ʘ) 「妳的機車不是停在公司那?親了我後就忘了?」 『不麻煩主管了,我可以搭計程車或者我
2024-03-20
GO知識+Rt7集訓班 (1) 事前準備今年FGO台服終於預計在年底進入2-7,又常常看到很多人說對中南美洲文化不熟, 因此想再把文章統整成一下成更適合作為遊戲補充資料的版本,希望大家在到時遊玩2-7時有更多樂趣。 第一篇基本上是以基礎知識為主,不太會有遊戲劇透。
Thumbnail
2024-03-01
「GO START」- 從《UX in the Jungle》談人人適用的專案管理心法(下)之前已經與大家談過讓我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法當中的 G、O、S,現在就來繼續分享 T、A、R、T。請容我再次強調,這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
Thumbnail
「GO START」- 從《UX in the Jungle》談人人適用的專案管理心法(上)與大家分享我第一次挑戰就成功設計出有趣桌遊教具的「GO START」專案管理心法。這篇先介紹心法當中的 G、O、S,下一篇會繼續分享 T、A、R、T。這是人人都適用的專案管理心法,上下兩篇一起看完後,你就會發現要掌握專案管理的要點沒有想像中那麼困難。
Thumbnail
GO喝著shot,苦辣嗆辣令眼淚噴出變得很合理,乾杯這苦悶的日子。 她豪邁的大腿一開坐著喝shot,崇拜過像霹靂嬌娃那樣來個霹靂腿一掃的快感。 這裡不是皇后區,只有跟她從來不熟的算數公式與做人的外星球,又是苦悶的一天過去,她懷念著跳著舞的快樂就那樣子一直跳!跳!跳!哈哈哈的過了每一天的有她存在的意義
2023-10-31
go1111
2022-02-24