Redis之List 列表型別

2021-07-24 08:22:52 字數 3504 閱讀 9793

在redis中,list型別是按照插入順序排序的字串鍊錶。和資料結構中的普通鍊錶一樣,我們可以在其頭部(left)和尾部(right)新增新的元素。在插入時,如果該鍵並不存在,redis將為該鍵建立乙個新的鍊錶。與此相反,如果鍊錶中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。list中可以包含的最大元素數量是4294967295。

從元素插入和刪除的效率視角來看,如果我們是在鍊錶的兩頭插入或刪除元素,這將會是非常高效的操作,即使鍊錶中已經儲存了百萬條記錄,該操作也可以在常量 時間內完成。然而需要說明的是,如果元素插入或刪除操作是作用於鍊錶中間,那將會是非常低效的。相信對於有良好資料結構基礎的開發者而言,這一點並不難理 解。

鍊錶結構的小技巧:

針對鍊錶結構的value,redis在其官方文件中給出了一些實用技巧,如rpoplpush命令,下面給出具體的解釋。

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

命令原型

時間複雜度

命令描述

返回值lpush key value [value ...]

o(1)

在指定key所關聯的list value的頭部插入引數中給出的所有values。如果該key不存在,該命令將在插入之前建立乙個與該key關聯的空鍊錶,之後再將資料從鍊錶的頭部插入。如果該鍵的value不是鍊錶型別,該命令將返回相關的錯誤資訊。

插入後鍊錶中元素的數量。

lpushx key value

o(1)

僅有當引數中指定的key存在時,該命令才會在其所關聯的list value的頭部插入引數中給出的value,否則將不會有任何操作發生。

插入後鍊錶中元素的數量。

lrange key start stop

o(s+n)

時間複雜度中的s為start引數表示的偏移量,n表示元素的數量。該命令的引數start和end都是0-based。即0表示鍊錶頭部 (leftmost)的第乙個元素。其中start的值也可以為負值,-1將表示鍊錶中的最後乙個元素,即尾部元素,-2表示倒數第二個並以此類推。該命 令在獲取元素時,start和end位置上的元素也會被取出。如果start的值大於鍊錶中元素的數量,空煉表將會被返回。如果end的值大於元素的數 量,該命令則獲取從start(包括start)開始,鍊錶中剩餘的所有元素。

返回指定範圍內元素的列表。

lpop key

o(1)

返回並彈出指定key關聯的鍊錶中的第乙個元素,即頭部元素,。如果該key不存,返回nil。

鍊錶頭部的元素。

llen key

o(1)

返回指定key關聯的鍊錶中元素的數量,如果該key不存在,則返回0。如果與該key關聯的value的型別不是鍊錶,則返回相關的錯誤資訊。

鍊錶中元素的數量。

lrem key count value

o(n)

時間複雜度中n表示鍊錶中元素的數量。在指定key關聯的鍊錶中,刪除前count個值等於value的元素。如果count大於0,從頭向尾遍歷並刪 除,如果count小於0,則從尾向頭遍歷並刪除。如果count等於0,則刪除鍊錶中所有等於value的元素。如果指定的key不存在,則直接返回 0。

返回被刪除的元素數量。

lset key index value

o(n)

時間複雜度中n表示鍊錶中元素的數量。但是設定頭部或尾部的元素時,其時間複雜度為o(1)。設定鍊錶中指定位置的值為新值,其中0表示第乙個元素,即頭部元素,-1表示尾部元素。如果索引值index超出了鍊錶中元素的數量範圍,該命令將返回相關的錯誤資訊。

lindex key index

o(n)

時間複雜度中n表示在找到該元素時需要遍歷的元素數量。對於頭部或尾部元素,其時間複雜度為o(1)。該命令將返回鍊錶中指定位置(index)的元 素,index是0-based,表示頭部元素,如果index為-1,表示尾部元素。如果與該key關聯的不是鍊錶,該命令將返回相關的錯誤資訊。

返回請求的元素,如果index超出範圍,則返回nil。

ltrim key start stop

o(n)

n表示被刪除的元素數量。該命令將僅保留指定範圍內的元素,從而保證鏈結中的元素數量相對恆定。start和stop引數都是0-based,0表示頭部 元素。和其他命令一樣,start和stop也可以為負值,-1表示尾部元素。如果start大於鍊錶的尾部,或start大於stop,該命令不錯報 錯,而是返回乙個空的鍊錶,與此同時該key也將被刪除。如果stop大於元素的數量,則保留從start開始剩餘的所有元素。

linsert key before|after pivot value

o(n)

時間複雜度中n表示在找到該元素pivot之前需要遍歷的元素數量。這樣意味著如果pivot位於鍊錶的頭部或尾部時,該命令的時間複雜度為o(1)。該 命令的功能是在pivot元素的前面或後面插入引數中的元素value。如果key不存在,該命令將不執行任何操作。如果與key關聯的value型別不 是鍊錶,相關的錯誤資訊將被返回。

成功插入後鍊錶中元素的數量,如果沒有找到pivot,返回-1,如果key不存在,返回0。

rpush key value [value ...]

o(1)

在指定key所關聯的list value的尾部插入引數中給出的所有values。如果該key不存在,該命令將在插入之前建立乙個與該key關聯的空鍊錶,之後再將資料從鍊錶的尾部插入。如果該鍵的value不是鍊錶型別,該命令將返回相關的錯誤資訊。

插入後鍊錶中元素的數量。

rpushx key value

o(1)

僅有當引數中指定的key存在時,該命令才會在其所關聯的list value的尾部插入引數中給出的value,否則將不會有任何操作發生。

插入後鍊錶中元素的數量。

rpop key

o(1)

返回並彈出指定key關聯的鍊錶中的最後乙個元素,即尾部元素,。如果該key不存,返回nil。

鍊錶尾部的元素。

rpoplpush source destination

o(1)

原子性的從與source鍵關聯的鍊錶尾部彈出乙個元素,同時再將彈出的元素插入到與destination鍵關聯的鍊錶的頭部。如果source鍵不存 在,該命令將返回nil,同時不再做任何其它的操作了。如果source和destination是同乙個鍵,則相當於原子性的將其關聯鍊錶中的尾部元素 移到該鍊錶的頭部。

返回彈出和插入的元素。

Redis的列表型別 List

redis列表是簡單的字串列表,按照插入順序排序。你可以新增乙個元素導列表的頭部 左邊 或者尾部 右邊 乙個列表最多可以包含 232 1 個元素 4294967295,每個列表超過40億個元素 本次演示list的基本操作 為key為test list的list列表新增值,從左邊加 222 127.0...

Redis資料型別 List列表型別

介紹 列表型別 list 可以儲存乙個有序的字串列表,常用的操作時向列表兩端新增元素,或者或者列表的某乙個片段。列表型別內部是使用雙向鍊錶實現的。所以向列表兩端新增元素的時間複雜度為o 1 獲取越接近兩端的元素速度就越快。不過使用鍊錶的代價是通過索引訪問元素比較慢,列表也適合用來記錄日誌,可以保證加...

(五)Redis基本型別 列表型別(List)

1 介紹 列表型別可以儲存乙個有序的字串列表,常用的操作是向列表兩端新增元素,或者獲得列表的某乙個片段。列表內部是使用雙向鍊錶實現的,獲取越接近兩端的元素速度越快。乙個列表型別鍵最多能容納2的32次方 1個元素。2 命令 1 向列表兩端增加元素 lpush key value value rpush...