1. 程式人生 > >【Redis學習】:list資料型別詳解

【Redis學習】:list資料型別詳解

list資料結構 在redis中,list資料結構是按照插入順序的字串連結串列,和資料結構中的普通連結串列一樣,我們可以在其頭部(left)和尾部(right)新增新的元素。在插入時,如果該鍵並不存在,redis將為該鍵建立一個新的連結串列。與此相反,如果連結串列中所有的元素均被移除,那麼該鍵也將會被從資料庫刪除,list中可以包含最大元素數是4294967295. 從元素插入和刪除的效率來看,如果我們是在連結串列的兩頭插入或刪除元素時,這將會是非常高效的操作,即使連結串列中已經儲存了百萬條記錄,該操作也可以在常量時間內完成,然而需要說明的是,如果元素插入或刪除操作是作用於連結串列中間,那將會是非常低效的。
1、ArrayList使用陣列方式儲存資料,所以根據索引查詢資料速度快,而新增或者刪除元素時需要涉及到位移操作,所以比較慢。 2、LinkedList使用雙向連結串列方式儲存資料,每個元素都記錄前後元素的指標,所以插入、刪除資料時只是更改前後元素的指標指向即可。速度非常快,然後通過下標查詢元素需要從頭開始索引,所以比較慢。 3、雙向連結串列增加資料

4、雙向連結串列刪除資料
常用命令 兩端新增 lpush key values[value1 value2 ...] 在指定的key所關聯的list的頭部插入所有的values,如果該key不存在,該命令在插入的之前建立一個與該key關聯的空連結串列,之後再向該連結串列的頭部插入資料,插入成功,返回元素的個數。

rpush key values[value1 value2 ...] 在該list的尾部新增元素
檢視連結串列 lrange key start end 獲取list中從start到end的元素的值,start、end從0開始計數,也可以是負數,若為-1則表示list尾部的元素,-2則表示倒數第二個,以此類推...

另一個
兩端彈出 lpop key 返回並彈出指定的key關聯的list中的第一個元素,即頭元素,如果該key不存在,返回null,若key存在,則返回list的頭部元素。
rpop key 從尾部彈出元素
獲取列表中元素的個數 llen key
返回指定的key關聯的list中的元素的個數
lpushx key value 僅當引數中指定的key存在時,向關聯的list的頭部插入value,如果不存在,將不進行插入。
rpushx key value 在該list的尾部新增元素
lrem key count value 刪除count個值為value的元素,如果count大於0,從頭向尾比那裡並刪除count個值為value的元素,如果count小於0,則從尾部遍歷並刪除,如果count等於0,則刪除list中所有等於value的元素、
lset key index value 設定list中的index的下標的元素值,0代表list的頭元素,-1代表list的尾元素,操作列表的下標不存在丟擲異常。
linsert key before|after pivot value 在pivot元素前或者後插入value這個元素 在第一個3之前插入4

在第一個3之後插入5
rpoplpush resource destination list中的尾部元素彈出並新增到頭部,這是一個迴圈操作 將mylist右端彈出,壓入到mylist1左端

將mylist右端彈出,壓入到mylist左端
使用場景 rpoplpush的使用場景 redis的list經常會被用於訊息佇列的服務,以完成多程式之間的訊息轉換,假設一個應用程式正在執行lpush操作向列表中新增新的元素,我們通常將這樣的程式稱之為生產者(Producer),而另一個應用程式正在執行rpop操作從list中取出元素,我們稱這樣的程式為消費者(Consumer)。如果此時,消費者程式取出訊息元素後立即奔潰,由於該訊息已經被取出且沒有被正常處理,那麼我們就可以認為該訊息已經丟失,由此可能導致業務資料丟失,或業務狀態的不一致等現象的發生。直到消費者程式完成正常的處理邏輯後再將該訊息從備份佇列中刪除。同時我們還可以提供一個守護程序,當發現備份列表中的訊息過期時,可以重新將其再放回到主訊息佇列中,以便其它的消費者程式繼續處理。