Redis 隊列
用redis作為隊列效率高,而且簡單易用
使用場景
-
用於處理比較耗時的請求,例如批量發送郵件,如果直接在網觸發執行發送,程序會出現耗時
-
高並發場景,當某個時刻請求瞬間增加時,可以把請求寫入到隊列,后台去處理這些請求
-
搶購場景,先入先出的模式
Redis 消息隊列
主要應用在網絡中實現異步任務,Reids可以充當消息隊列實現兩種模式:生產者 ->消費者,發布者->訂閱者 第一種方式是一對一,后者是一對多
生產者/消費者模型
生產者模型需要存在生產者和消費者兩方,而在redis中隊列的存儲和獲取可以作為消息隊列被生產者和消費者使用
生產者
redis 在其中做緩存的作用,將任放置到queue隊列里面,其實redis有lpush和rpush,意思是從左邊插入列隊還是右邊插入列隊,這就是生產者部分,將任務插入指定的隊列中。
消費者
簡單的說就是拿出來(BRPOP,RPOP),隊列是按順序取任務的,一般是左邊插入,右邊取出,redis有BRPOP和RPOP,可以設置時間以秒為單位,如果隊列是空的,那么先不返回,
等待一會(設置的時間【BRPOP queue 10】,等待10秒),如果在這期間有新的任務插入,那么就取出任務返回,還是沒有的話,返回空。
- 訂閱/發布模型
訂閱/發布模型簡單來說是由發布者向訂閱者發送任務,同樣任何訂閱者都可以獲取任務。
發布者使用publish channel task 來發布相關的任務,而訂閱者則是使用subscribe channel,這是一個監聽命令,redis會一直監聽這個channel,如果發布者發布新的任務,
監聽命令會返回任務,直到訂閱者主動退出監聽,但是redis也可以為這個設置超時,保證監聽的有效性,默認如果60秒內沒收到信息就異常退出,當然了這個可以配置。
Redis隊列功能介紹
常用命令:
-
Blpop刪除,並獲得該列表中的第一元素,或阻塞,直到有一個可用
-
Brpop刪除,並獲得該列表中的最后一個元素,或阻塞,直到有一個可用
-
Brpoplpush
-
Lindex獲取一個元素,通過其索引列表
-
Linsert在列表中的另一個元素之前或之后插入一個元素
-
Llen獲得隊列(List)的長度
-
Lpop從隊列的左邊出隊一個元素
-
Lpush從隊列的左邊入隊一個或多個元素
-
Lpushx當隊列存在時,從隊到左邊入隊一個元素
-
Lrange從列表中獲取指定返回的元素
-
Lrem從列表中刪除元素
-
Lset設置隊列里面一個元素的值
-
Ltrim修剪到指定范圍內的清單
-
Rpop從隊列的右邊出隊一個元素
-
Rpoplpush刪除列表中的最后一個元素,將其追加到另一個列表
-
Rpush從隊列的右邊入隊一個元素
-
Rpushx從隊列的右邊入隊一個元素,僅隊列存在時有效
-
Redis支持php、python、c等接口