go+redis實(shí)現(xiàn)消息隊(duì)列發(fā)布與訂閱的詳細(xì)過程
在做項(xiàng)目過程中,實(shí)現(xiàn)websocket得時(shí)候,不知道哪里寫的不太合適,客戶端消息收到一定程度,剩下的消息收不到,修改了緩沖區(qū)大小,還是沒有解決問題,后面因?yàn)轫?xiàng)目結(jié)束期比較緊張,沒有時(shí)間調(diào)試消息的時(shí)候,改用了redis隊(duì)列去做了消息得暫存,客戶端輪詢?nèi)ツ脤?duì)應(yīng)的消息。
1.生產(chǎn)者隨機(jī)發(fā)布消息,用rpush發(fā)布。
2.消費(fèi)者用lpop訂閱消費(fèi),一旦沒有消息,隨機(jī)休眠。
redis做消息隊(duì)列的缺點(diǎn):沒有持久化。一旦消息沒有人消費(fèi),積累到一定程度后就會(huì)丟失
package main import ( "fmt" "time" "os" "strconv" "math/rand" "github.com/gomodule/redigo/redis" ) const RMQ string = "mqtest" func producer() { redis_conn, err := redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("hdiot")) if err != nil { fmt.Println(err) return } defer redis_conn.Close() rand.Seed(time.Now().UnixNano()) var i = 1 for { _,err = redis_conn.Do("rpush", RMQ, strconv.Itoa(i)) if(err!=nil) { fmt.Println("produce error") continue } fmt.Println("produce element:%d", i) time.Sleep(time.Duration(rand.Intn(10))*time.Second) i++ } } func consumer() { redis_conn, err := redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("hdiot")) if err != nil { fmt.Println(err) return } defer redis_conn.Close() rand.Seed(time.Now().UnixNano()) for { ele,err := redis.String(redis_conn.Do("lpop", RMQ)) if(err != nil) { fmt.Println("no msg.sleep now") time.Sleep(time.Duration(rand.Intn(10))*time.Second) } else { fmt.Println("cosume element:%s", ele) } } } func main() { list := os.Args if(list[1] == "pro") { go producer() } else if (list[1] == "con") { go consumer() } for { time.Sleep(time.Duration(10000)*time.Second) } }
到此這篇關(guān)于go+redis實(shí)現(xiàn)消息隊(duì)列發(fā)布與訂閱的詳細(xì)過程的文章就介紹到這了,更多相關(guān)go redis消息隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang Goroutine超時(shí)控制的實(shí)現(xiàn)
日常開發(fā)中我們大概率會(huì)遇到超時(shí)控制的場(chǎng)景,比如一個(gè)批量耗時(shí)任務(wù)、網(wǎng)絡(luò)請(qǐng)求等,本文主要介紹了golang Goroutine超時(shí)控制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09golang 如何獲取pem格式RSA公私鑰長(zhǎng)度
這篇文章主要介紹了golang 如何獲取pem格式RSA公私鑰長(zhǎng)度操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-12-12Go語(yǔ)言學(xué)習(xí)之WaitGroup用法詳解
Go語(yǔ)言中的?WaitGroup?和?Java?中的?CyclicBarrier、CountDownLatch?非常類似。本文將詳細(xì)為大家講講WaitGroup的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06windows下使用vscode搭建golang環(huán)境并調(diào)試的過程
這篇文章主要介紹了在windows下使用vscode搭建golang環(huán)境并進(jìn)行調(diào)試,主要包括安裝方法及環(huán)境變量配置技巧,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09如何使用大學(xué)教育郵箱下載golang等軟件(推薦)
這篇文章主要介紹了如何使用大學(xué)教育郵箱下載goland等軟件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Golang使用Gin框架實(shí)現(xiàn)http分塊傳輸
這篇文章主要為大家詳細(xì)介紹了Golang中如何使用Gin框架實(shí)現(xiàn)http分塊傳輸功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05