介紹
REDIS_LIST (列 表) 是 LPUSH 、 LRANGE 等 命 令 的 操 作 對 象, 它 使 用REDIS_ENCODING_ZIPLIST 和 REDIS_ENCODING_LINKEDLIST 這兩種方式編碼:
創建新列表時 Redis 默認使用 REDIS_ENCODING_ZIPLIST 編碼,當以下任意一個條件被滿足時,列表會被轉換成 REDIS_ENCODING_LINKEDLIST 編碼:? 試 圖 往 列 表 新 添 加 一 個 字 符 串 值, 且 這 個 字 符 串 的 長 度 超 過server.list_max_ziplist_value (默認值為 64 )。ziplist 包含的節點超過 server.list_max_ziplist_entries (默認值為 512)。
list 是一個鏈表結構,可以理解為一個每個子元素都是 string 類型的雙向鏈表。主要功能是 push、pop、獲取一個范圍的所有值等。操作中 key 理解為鏈表的名字。是一個雙端鏈表的結構。
指令
LPUSH key value [value ...]
將一個或多個值?value?插入到列表?key?的表頭
如果有多個?value?值,那么各個?value?值按從左到右的順序依次插入到表頭: 比如說,對空列表?mylist?執行命令?LPUSH?mylist?a?b?c?,列表的值將是?c?b?a?,這等同于原子性地執行?LPUSH?mylist?a?、?LPUSH?mylist?b?和?LPUSH?mylist?c?三個命令。
如果?key?不存在,一個空列表會被創建并執行?LPUSH?操作。
RPUSH key value [value ...]
將一個或多個值?value?插入到列表?key?的表尾(最右邊)。
如果有多個?value?值,那么各個?value?值按從左到右的順序依次插入到表尾:比如對一個空列表?mylist?執行?RPUSH?mylist?a?b?c?,得出的結果列表為?a?b?c?,等同于執行命令?RPUSH?mylist?a?、?RPUSH?mylist?b?、?RPUSH?mylist?c?。
如果?key?不存在,一個空列表會被創建并執行?RPUSH?操作。
LINSERT key BEFORE|AFTER pivot value
將值?value?插入到列表?key?當中,位于值?pivot?之前或之后。
當?pivot?不存在于列表?key?時,不執行任何操作。
當?key?不存在時,?key?被視為空列表,不執行任何操作。
如果?key?不是列表類型,返回一個錯誤。
LSET key index value
將列表?key?下標為?index?的元素的值設置為?value?。
當?index?參數超出范圍,或對一個空列表(?key?不存在)進行?LSET?時,返回一個錯誤。
LREM key count value
根據參數?count?的值,移除列表中與參數?value?相等的元素。
count?的值可以是以下幾種:
count?>?0?: 從表頭開始向表尾搜索,移除與?value?相等的元素,數量為?count?。
count?<?0?: 從表尾開始向表頭搜索,移除與?value?相等的元素,數量為?count?的絕對值。
count?=?0?: 移除表中所有與?value?相等的值。
LRANGE key start stop
返回列表?key?中指定區間內的元素,區間以偏移量?start?和?stop?指定。
下標(index)參數?start?和?stop?都以?0?為底,也就是說,以?0?表示列表的第一個元素,以?1?表示列表的第二個元素,以此類推。
你也可以使用負數下標,以?-1?表示列表的最后一個元素,?-2?表示列表的倒數第二個元素,以此類推。
LTRIM key start stop
對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
舉個例子,執行命令?LTRIM?list?0?2?,表示只保留列表?list?的前三個元素,其余元素全部刪除。
下標(index)參數?start?和?stop?都以?0?為底,也就是說,以?0?表示列表的第一個元素,以?1?表示列表的第二個元素,以此類推。
你也可以使用負數下標,以?-1?表示列表的最后一個元素,?-2?表示列表的倒數第二個元素,以此類推。
當?key?不是列表類型時,返回一個錯誤。
LPOP key
移除并返回列表?key?的頭元素。
RPOP key
移除并返回列表?key?的尾元素。
LLEN key
返回列表?key?的長度。
如果?key?不存在,則?key?被解釋為一個空列表,返回?0?.
如果?key?不是列表類型,返回一個錯誤。
RPOPLPUSH source destination
命令?RPOPLPUSH?在一個原子時間內,執行以下兩個動作:
將列表?source?中的最后一個元素(尾元素)彈出,并返回給客戶端。
將?source?彈出的元素插入到列表?destination?,作為?destination?列表的的頭元素。
舉個例子,你有兩個列表?source?和?destination?,?source?列表有元素?a,?b,?c?,?destination?列表有元素?x,?y,?z?,執行?RPOPLPUSH?sourcedestination?之后,?source?列表包含元素?a,?b?,?destination?列表包含元素?c,?x,?y,?z?,并且元素?c?會被返回給客戶端。
如果?source?不存在,值?nil?被返回,并且不執行其他動作。
如果?source?和?destination?相同,則列表中的表尾元素被移動到表頭,并返回該元素,可以把這種特殊情況視作列表的旋轉(rotation)操作。
LINDEX key index
返回列表?key?中,下標為?index?的元素。
下標(index)參數?start?和?stop?都以?0?為底,也就是說,以?0?表示列表的第一個元素,以?1?表示列表的第二個元素,以此類推。
你也可以使用負數下標,以?-1?表示列表的最后一個元素,?-2?表示列表的倒數第二個元素,以此類推。
如果?key?不是列表類型,返回一個錯誤。
阻塞處理
BLPOP 、BRPOP 和 BRPOPLPUSH 三個命令都可能造成客戶端被阻塞,以下將這些命令統稱為列表的阻塞原語。
阻塞原語并不是一定會造成客戶端阻塞:只有當這些命令被用于空列表時,它們才會阻塞客戶端。如果被處理的列表不為空的話,它們就執行無阻塞版本的 LPOP 、RPOP 或 RPOPLPUSH 命令。
?
BLPOP key [key ...] timeout
BLPOP?是列表的阻塞式(blocking)彈出原語。
它是?LPOP?命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被?BLPOP?命令阻塞,直到等待超時或發現可彈出元素為止。
當給定多個?key?參數時,按參數?key?的先后順序依次檢查各個列表,彈出第一個非空列表的頭元素。
BRPOP key [key ...] timeout
BRPOP?是列表的阻塞式(blocking)彈出原語。
它是?RPOP?命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被?BRPOP?命令阻塞,直到等待超時或發現可彈出元素為止。
當給定多個?key?參數時,按參數?key?的先后順序依次檢查各個列表,彈出第一個非空列表的尾部元素。
關于阻塞操作的更多信息,請查看?BLPOP?命令,?BRPOP?除了彈出元素的位置和?BLPOP?不同之外,其他表現一致。
BRPOPLPUSH source destination timeout
BRPOPLPUSH?是?RPOPLPUSH?的阻塞版本,當給定列表?source?不為空時,?BRPOPLPUSH?的表現和?RPOPLPUSH?一樣。
當列表?source?為空時,?BRPOPLPUSH?命令將阻塞連接,直到等待超時,或有另一個客戶端對?source?執行?LPUSH?或?RPUSH?命令為止。
超時參數?timeout?接受一個以秒為單位的數字作為值。超時參數設為?0?表示阻塞時間可以無限期延長(block indefinitely) 。