Redis資料結構詳解之List(二)

張龍豪發表於2015-11-19

序言

思來想去感覺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,晚安。

相關文章