第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

從 Redis 退訂似乎不起作用

從 Redis 退訂似乎不起作用

Go
繁星點(diǎn)點(diǎn)滴滴 2022-06-06 15:15:48
我正在嘗試在 Redis 中使用 pub-sub。我要做的是打開兩個(gè)redis-cli. 第一個(gè)我發(fā)出命令flushall以確保以綠色啟動(dòng)。然后在另一個(gè)終端中,我打開MONITOR以打印來(lái)自 Golang 示例客戶端的所有命令(代碼如下)。這是我從 MONITOR 打印的內(nèi)容:1590207069.340860 [0 127.0.0.1:58910] "smembers" "user:Ali:rooms"1590207069.341380 [0 127.0.0.1:58910] "sadd" "user:Ali:rooms" "New"1590207069.345266 [0 127.0.0.1:58910] "smembers" "user:Ali:rooms"1590207069.353706 [0 127.0.0.1:58910] "sadd" "user:Ali:rooms" "Old"1590207069.354219 [0 127.0.0.1:58912] "subscribe" "New"1590207069.354741 [0 127.0.0.1:58910] "smembers" "user:Ali:rooms"1590207069.355444 [0 127.0.0.1:58912] "unsubscribe" "New" "Old"1590207069.356754 [0 127.0.0.1:58910] "sadd" "user:Ali:rooms" "OldPlusPlus"1590207069.357206 [0 127.0.0.1:58914] "subscribe" "New" "Old"1590207069.357656 [0 127.0.0.1:58910] "smembers" "user:Ali:rooms"1590207069.358362 [0 127.0.0.1:58912] "unsubscribe" "OldPlusPlus" "New" "Old"1590207069.361030 [0 127.0.0.1:58916] "subscribe" "OldPlusPlus" "New" "Old"我試圖讓客戶端對(duì)隨著時(shí)間的推移打開的所有通道都有一個(gè)連接。而不是一個(gè)連接/線程來(lái)處理 Redis 的每個(gè)通道。因此,每當(dāng)需要新的訂閱請(qǐng)求時(shí),我都會(huì)嘗試從客戶端刪除所有以前的訂閱,并對(duì)舊頻道和新頻道進(jìn)行新訂閱。但似乎該unsubscribe命令沒(méi)有按預(yù)期工作(或者我遺漏了一些東西)!因?yàn)楫?dāng)我嘗試獲取每個(gè)頻道的客戶端數(shù)量時(shí),從第一個(gè)終端:127.0.0.1:6379> pubsub numsub OldPlusPlus New Old1) "OldPlusPlus"2) (integer) 13) "New"4) (integer) 25) "Old"6) (integer) 2除了當(dāng)我嘗試向“新”頻道發(fā)送消息時(shí),我的 go 客戶端收到了兩次消息!
查看完整描述

1 回答

?
冉冉說(shuō)

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊

問(wèn)題與訂閱頻道的 *redis.PubSub 類型的對(duì)象不是用于取消訂閱頻道的對(duì)象有關(guān)。


因此,我必須維護(hù)對(duì)此類對(duì)象的引用,然后使用該引用取消訂閱所有頻道。


這是修改和工作的代碼:



package main


import (

    "fmt"

    "github.com/go-redis/redis/v7"

    "log"

)


type user struct {

    name        string

    rooms       []string

    stopRunning chan bool

    running     bool

    roomsPubsub map[string]*redis.PubSub

}


func (u *user) connect(rdb *redis.Client) error {

    // get all user rooms (from DB) and start subscribe

    r, err := rdb.SMembers(fmt.Sprintf("user:%s:rooms", u.name)).Result()

    if err != nil {

        return err

    }

    u.rooms = r


    if len(u.rooms) == 0 {

        return nil

    }


    u.doSubscribe("", rdb)


    return nil

}


func (u *user) subscribe(room string, rdb *redis.Client) error {

    // check if already subscribed

    for i := range u.rooms {

        if u.rooms[i] == room {

            return nil

        }

    }


    // add room to user

    userRooms := fmt.Sprintf("user:%s:rooms", u.name)

    if err := rdb.SAdd(userRooms, room).Err(); err != nil {

        return err

    }


    // get all user rooms (from DB) and start subscribe

    r, err := rdb.SMembers(userRooms).Result()

    if err != nil {

        return err

    }

    u.rooms = r


    if u.running {

        u.stopRunning <- true

    }


    u.doSubscribe(room, rdb)


    return nil

}


func (u *user) doSubscribe(room string, rdb *redis.Client) {

    pubSub := rdb.Subscribe(u.rooms...)

    if len(room) > 0 {

        u.roomsPubsub[room] = pubSub

    }


    go func() {

        u.running = true

        fmt.Println("starting the listener for user:", u.name, "on rooms:", u.rooms)

        for {

            select {


            case msg, ok := <-pubSub.Channel():

                if !ok {

                    break

                }

                fmt.Println(msg.Payload, msg.Channel)


            case <-u.stopRunning:

                fmt.Println("Stop listening for user:", u.name, "on old rooms")


                for k, v := range u.roomsPubsub {

                    if err := v.Unsubscribe(); err != nil {

                        fmt.Println("unable to unsubscribe", err)

                    }

                    delete(u.roomsPubsub, k)

                }

                break

            }

        }

    }()

}


func (u *user) unsubscribe(room string, rdb *redis.Client) error {

    return nil

}


var rdb *redis.Client


func main() {


    rdb = redis.NewClient(&redis.Options{Addr: "localhost:6379"})


    u := &user{

        name:        "Wael",

        stopRunning: make(chan bool),

        roomsPubsub: make(map[string]*redis.PubSub),

    }


    if err := u.connect(rdb); err != nil {

        log.Fatal(err)

    }


    if err := u.subscribe("New", rdb); err != nil {

        log.Fatal(err)

    }


    if err := u.subscribe("Old", rdb); err != nil {

        log.Fatal(err)

    }


    if err := u.subscribe("OldPlusPlus", rdb); err != nil {

        log.Fatal(err)

    }


    select {}

}



查看完整回答
反對(duì) 回復(fù) 2022-06-06
  • 1 回答
  • 0 關(guān)注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)