序言
思來想去感覺redis中的list沒什么好寫的,如果單寫幾個命令的操作過於乏味,所以本篇最后我會根據redis中list數據類型的特殊屬性,同時對比成熟的消息隊列產品rabbitmq,使用redis實現一個消息隊列。
為啦讓本篇更有魅力,我再介紹下redis中list的基本屬性,以及為什么使用redis中list列表類型,為什么使用消息隊列,為什么不用rabbitmq而使用redis實現消息隊列?呢,到這里為止,如果你是大咖,大牛,大神,大爺!不要聽我吹牛逼啦,Close Page and forget me ! —_—
首先回答序言中的4大疑問
1、redis中的list的基本屬性?
List數據結構是鏈表結構,這意味這無論數據量多大,頭尾操作數據還是很快的,list的容量是2的32次方減1個元素,即4294967295個元素數量。
2、為什么使用redis中的list數據類型?
依靠redis內存中操作數據的優勢,又提供一些列實用獨特的Api操控數據,用着簡便,速度又快,又能實現特有的數據特征排序讀寫,做時間軸數據,評論列表,消息傳遞等等,又提供簡便的分頁,讀寫操作。你用不用。
3、為什么使用消息隊列?
舉個簡單的例子,功能是這樣子的,你要呈現頁面給用戶看,在你呈現頁面之前有一個很復雜耗時的運算要操作,但是這個操作不影響頁面呈現的數據,也不作為頁面呈現的數據。
方案一:運算完,呈現頁面。
方案二:把要計算的數據,拋到持久化的消息隊列中,不做耗時的運算,直接呈現頁面。然后用另外一個程序來對消息隊列中的數據單獨做運算。
顯而易見,方案二是最佳答案,你用不用消息隊列。
4、為什么不使用成熟的rabbitmq而使用redis實現的消息隊列?
Rabbitmq只關注數據的先進先出,沒有數據優先級的概念,假如你想給那個數據來個先處理的特權,那么不好意思,我不支持,但是rabbitmq也可以變通着來處理,就是建立多個隊列用程序路由來實現這個特權功能。那么redis實現的消息隊列,是可以靈活掌控的,后面做示范。
Redis中關於List列表的命令詳解
1、redis中list列表的數據插入命令:lpush,rpush,linsert
127.0.0.1:6379>rpush mylist 1 ---結果為:(integer) 1
127.0.0.1:6379>rpush mylist 2 ---結果為:(integer) 2
127.0.0.1:6379>rpush mylist 3 ---rpush命令:向mylist列表中,從右邊插入3條數據,返回值為當前列表的容量。結果為:(integer) 3
127.0.0.1:6379>lrange mylist 0 -1 ---lrange命令:查看mylist列表中的數據,0開始位置,-1結束位置,結束位置為-1時,表示列表的最后一個位置,即查看所有。結果為:1> "1" 2> "2" 3> "3"
127.0.0.1:6379>lpush mylist 0 ---lpush命令:向mylist列表中,從左邊插入一條數據為0的數據
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"0" 2>"1" 3>"2" 4>"3"
127.0.0.1:6379>linsert mylist after 3 4 ---linsert命令,表達式為linsert key before|after pivot value ;這句命令的意思是在key為mylist的列表中查找值為3的數據,在其后插入一條值為4的數據。
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"0" 2>"1" 3>"2" 4>"3" 5>"4"
127.0.0.1:6379>linsert mylist before 0 -1 ---意思是:在key為mylist的列表中查找值為0的數據,在其前插入一條值為-1的數據。
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"-1" 2>"0" 3>"1" 4>"2" 5>"3" 6>"4"
127.0.0.1:6379>lisert mylist after 5 8 ---結果為:-1,由於mylist列表不存在值為5的數據,所以不執行任何操作,返回狀態值-1。如果key不存在時,返回錯誤提示。
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"-1" 2>"0" 3>"1" 4>"2" 5>"3" 6>"4"
2、redis中list列表的數據刪除命令:lpop,rpop
127.0.0.1:6379>lpop mylist ---lpop命令:從列表中的左邊移除一條數據,同時輸出被刪除的數據,這里輸出的結果為-1
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"0" 2>"1" 3>"2" 4>"3" 5>"4"
127.0.0.1:6379>rpop mylist ---rpop命令:從列表的右邊移除一條數據,同時輸出被刪除的數據,這里輸出的結果為4
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"0" 2>"1" 3>"2" 4>"3"
127.0.0.1:6379>ltrim mylist 1 3 ----ltrim命令:保留設定的兩個下標區間的值,刪除不在其區間的所有值。1為開始保留的下標值,3為結束保留的下標值。
127.0.0.1:6379>lrange mylist 0 -1 ---結果為:1>"1" 2>"2" 3>"3"
3、redis中list列表的數據查看命令:lrange,llen,lindex
127.0.0.1:6379>llen mylist ---llen命令:返回列表的長度,這里mylist只剩下4條數據,故輸出結果為4
127.0.0.1:6379>lindex mylist 3 ---lindex命令:獲取給定位置的數據,這里坐標為3的數據是"2",所以結果為2.
4、redis中list列表數據修改命令:lset
127.0.0.1:6379>lset mylist 2 zlh ---lset命令:把下標為2的值設置為zlh,如果下標值超出范圍或對一個空list列表進行lset,那么將返回一個錯誤提示
127.0.0.1:6379>lrange mylist 0 -1 ---結果為: 1>"1" 2>"2" 3>"zlh"
5、redis中list列表,兩個列表A,B,將A列表的尾元素添加到B列表的頭元素中,命令:rpoplpush
#這里我有連個列表A數據為{1,2,3} ,B列表數據為{4,5,6}
127.0.0.1:6379>rpoplpush A B
127.0.0.1:6379>lrange A ---結果為:1>"1' 2>"2"
127.0.0.1:6379>lrange B ---結果為:1>"3' 2>"4" 3>"5" 4>"6"
6、redis中的幾個帶阻塞的高級命令:blpop,brpop,brpoplpush
127.0.0.1:6379>blpop A 30 ---意思是:A列表有值的話,從左邊移除一個數據,如果沒有值的話,則等待A中插入數據為止,等待時間為30秒,如果時間設置為0表示阻塞時間無限延長
127.0.0.1:6379>blpop B30 ---意思是:A列表有值的話,從左邊移除一個數據,如果沒有值的話,則等待A中插入數據為止,等待時間為30秒,如果時間設置為0表示阻塞時間無限延長
127.0.0.1:6379>brpoplpush A B 30 ---意思是:將A列表的尾元素添加到B列表的頭元素中,如果A列表中有值則插入,如果沒值,則等待A中插入數據為止,等待時間為30秒,如果時間設置為0表示阻塞時間無限延長
Redis實現消息隊列,並自帶優先級功能
1、首先redis中的list是鏈表結構,具備消息隊列中的先進先出特征。
2、從上面的幾個高級命令中可以看出,list有幾個自帶阻塞功能,時間設置為0,可以視為永不休息的監聽進程。
實現:
1、說啦以上兩點我想你應該有想法啦。
2、對不起有點晚啦,明天還要上班,還要陪媳婦去吃個麻辣燙,回來睡覺啦,這里已經不難理解與實現啦,如需溝通交流學習,進左上角群,對不住啦,88,晚安。