91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis中怎么實現生產消費模式

發布時間:2021-06-21 18:30:19 來源:億速云 閱讀:498 作者:Leah 欄目:大數據

本篇文章為大家展示了Redis中怎么實現生產消費模式,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

簡單隊列實現    

Redis中怎么實現生產消費模式

那么我們Redis剛好有一個數據類型符合這個就是List。list可以實現隊列(先進先出)和棧(先進后出),那么這個list又有兩種插入數據的方式:頭插法和尾插法。所以我們今天使用的結構是隊列,使用尾插法,關鍵的命令有rpush(尾插)和lpop(頭部獲取)。如下圖所示:

Redis中怎么實現生產消費模式

> rpush squeue zhangsan lisi mango    #插入隊列(integer) 3> lpop squeue    #獲取隊列"zhangsan"> rpush squeue wangwu(integer) 3> lpop squeue"lisi"> lpop squeue"mango"> lpop squeue"wangwu"> lpop squeue    #空隊列(nil)

上面是rpush/lpop結合使用的例子。還可以使用lpush/rpop結合使用,效果是一樣的。

注意:我們這里思考一個問題,在咱們實際開發中我們獲取隊列數據的時候如果這個隊列里面沒有任何值了,我們會一直pop,這樣我們的程序出現了一個死循環,而且此時的redis會不斷的處理服務器的pop指令使之內存增高。

此時mango靈光一閃,每次pop的時候判斷,如果隊列有值我們獲取這個值進行操作,如果隊列是空隊列,那么我們此時休息三秒鐘再請求,emmm,加雞腿。

> lpop squeue    #空隊列(nil).......sleep 3s old> lpop squeue...
隊列阻塞

通過后端程序控制redis服務器休息時間是一個好辦法,但是此處有一個問題,如果說服務器在休眠的時候隊列突然進來一個值,而此時需要及時反應獲取這個值該如何實現呢?

當然,redis早就考慮到這個問題,so提供了一個叫做隊列阻塞讀,其命令blpop和brpop,就是lpop和rpop的阻塞讀方法

Redis中怎么實現生產消費模式

blpop [第一個參數:key]... [第二個參數:time]key可以有多個key等待time就是阻塞時間,單位默認為秒

嗯,看似完美的解決了上面的方法

問題又來了,如果說此處設置的時間稍微長一點,阻塞請求的客戶端連接再多一點那么會出現下一個問題,那就是空閑連接問題。如果線程一直阻塞在哪里,Redis的客戶端連接就成了閑置連接,閑置過久,服務器一般會主動斷開連接,減少閑置資源占用。這個時候blpop/brpop會拋出異常來。

所以,魚與熊掌不可兼得,開發者當注意此處需要捕獲異常,然后重新請求。

延遲隊列  

上面我們介紹了阻塞隊列,深知空閑連接會被回收出現異常問題,那么我們可不可以實現延遲隊列,我提前一段時間比如5秒獲取隊列中的元素,當元素記錄的時間到達了我再去執行這個值,然后又提前5秒時間去獲取隊列中的值,依次反復。即可保證我在某一時刻去執行隊列中對應時間的值。

我們來分析,首先保證隊列是一個有序的我們才能依次執行,這里我們使用ZSet因為它帶有排序且不重復,保證客戶端沒有提交重復數據,那么值保證了,這個排序如何設計呢?我們不能使用'yyyyMMddHHmmssSSS'這種,第一個不適應這個排序類型可能會超出,第二就是每次轉換會帶來運算轉換的消耗,所有這里我們使用時間戳。那么zset提供一個獲取某段存在數據指令zrangebyscore,這個指令能夠獲取到我們想要的數據,然后通過zrem刪除zset里面的值即可完成消費。

####假設當前時間戳是0> zadd dqueue 4 zhangsan 8 lisi 12 mango    #添加元素(integer) 3####提前獲取后5秒的數據> zrangebyscore dqueue -inf 5 withscores    #提前獲取5秒內的數據1) "zhangsan"    #值2) 4.0           #當前排序索引> zrem dqueue zhangsan     #消費后刪除元素1####當前時間戳來到了5秒,提前5秒獲取就加上這個> zrangebyscore dqueue -inf 10 withscores    #獲取10以內的數據,輪訓調用1) "lisi"2) 8.0

上述內容就是Redis中怎么實現生產消費模式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新绛县| 长宁县| 克东县| 永泰县| 靖安县| 东莞市| 东兴市| 文水县| 梅河口市| 武清区| 江达县| 中山市| 且末县| 汶上县| 永清县| 荔浦县| 刚察县| 中卫市| 屏南县| 定南县| 隆回县| 江永县| 南阳市| 洪湖市| 乳山市| 沈阳市| 岱山县| 微博| 张掖市| 泽普县| 射洪县| 耒阳市| 宣恩县| 新乐市| 南投市| 仙桃市| 遵化市| 苍溪县| 孟津县| 台北县| 沛县|