上篇文章:
Redis數據類型之hashhttps://blog.csdn.net/sniper_fandc/article/details/149139615?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139615&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
目錄
1 lpush、lpushx和lrange
2 rpush和rpushx
3 lpop和rpop
4 lindex、linsert和llen
5 lrem
6 ltrim和lset
7 blpop和brpop
8 list的使用場景
????????list是列表,實際上更接近雙端隊列,支持頭插、尾差、頭刪和尾刪等基本操作,可以用來充當棧或隊列的使用。
1 lpush、lpushx和lrange
????????命令:lpush key value1 value2 ...
????????頭插插入list多個元素。時間復雜度O(N),N表示插入元素的個數。返回值是list的長度。如果key不存在就創建;如果key存在就頭插。因為是頭插,所以最后插入的元素會在list的第一個位置。
????????命令:lrange key start end
????????查詢list下標范圍[start,end]的元素。時間復雜度O(N),N表示查詢元素的個數。返回值按下標順序的各元素。同樣,下標也支持負數下標(表示倒數第幾個)。如果下標超出范圍,redis就會盡可能糾正下標到正確范圍
????????命令:lpushx key value1 value2 ...
????????如果key存在,頭插插入list多個元素;否則不插入。時間復雜度O(N),N表示插入元素的個數。返回值是list的長度。
2 rpush和rpushx
????????命令:rpush key value1 value2 ...
????????尾插插入list多個元素。時間復雜度O(N),N表示插入元素的個數。返回值是list的長度。如果key不存在就創建;如果key存在就尾插。因為是尾插,所以最先插入的元素會在list的第一個位置。
????????命令:rpushx key value1 value2 ...
????????如果key存在,尾插插入list多個元素;否則不插入。時間復雜度O(N),N表示插入元素的個數。返回值是list的長度。
3 lpop和rpop
????????命令:lpop key
????????頭刪key的list的元素。時間復雜度O(1)。返回值是被刪除的元素或nil。
????????命令:rpop key
????????尾刪key的list的元素。時間復雜度O(1)。返回值是被刪除的元素或nil。
????????可以搭配lpush和rpush實現隊列或棧。(lpush和lpop)或(rpush和rpop)是棧,(lpush和rpop)或(rpush和lpop)是隊列。
????????注意:在redis 6.2版本后引入count參數可以一次刪除多個元素。比如lpop key count,連續頭刪key對應list的count個元素。
4 lindex、linsert和llen
????????命令:lindex key index
????????獲取list中下標index的元素。時間復雜度O(N),N是list的長度,這里因為list的底層實現可能是鏈表,鏈表查詢是O(N)的復雜度。返回值是查詢的元素或nil。
????????命令:linsert key before | after element value
????????在element元素前(before)或后(after)插入value。時間復雜度O(N),N是list的長度。返回值是list的長度。
????????如果list中有重復的元素,就會從list頭開始從左向右遍歷找到第一個重復的元素進行插入:
????????命令:llen key
????????返回list的長度。時間復雜度O(1)。
5 lrem
????????命令:lrem key count element
????????刪除list中count個元素element。時間復雜度O(N+M),N是list長度,M是刪除的個數。如果count>0,從左往右刪:
????????如果count<0,從右往左刪:
????????如果count==0,刪除全部滿足value==element的元素:
6 ltrim和lset
????????命令:ltrim key start end
????????保留[start,end]的元素,其余的全部刪除。時間復雜度O(N),N是list長度。
????????命令:lset key index element
????????把下標index的元素修改為element。時間復雜度O(N),N是list長度。如果下標越界則報錯。
7 blpop和brpop
????????blpop和brpop是lpop和rpop的阻塞版本,即當list為空時,執行blpop和brpop會阻塞(在此期間redis服務器可以執行其他命令),直到超出設置的阻塞時間或list不空;如果list不空,執行效果就如同lpop和rpop。
????????blpop和brpop命令可以同時指定多個key,從左向右遍歷key,只要有一個key的list彈出元素,就視為執行成功,命令立即返回。
????????如果多個客戶端并發對一個key執行blpop或brpop,在list為空時,如果阻塞時間內list有新元素,則會優先給最先執行的命令返回元素。
????????命令:blpop key1 key2 ... timeout
????????返回值是二元組,包括哪個key和對應彈出的元素。
????????當list6和list7都沒有元素了,此時再執行命令就會阻塞,直到其他客戶端使用相關命令向list6或list7插入元素。
????????31.63s表示阻塞的時間。brpop命令類似,不再演示。
????????注意:timeout在redis 5設置時必須是整數的秒,但是redis 6以后就引入了小數的秒。
8 list的使用場景
????????list最常用于多個同屬于一個元素的值的存儲(一對多場景),比如一個班級有多個學生。還有個作用是作為消息隊列使用:消息隊列需要使用阻塞隊列作為數據結構,而list的實現類似雙端隊列,提供兩端的存和取。利用lpush和brpop(需要用到阻塞),可以實現生產者往阻塞隊列放元素,消費者取元素,如果沒有元素可取就阻塞等待。
????????在分布式系統中,往往需要解耦。對消息的傳遞也可以解耦,即利用多個頻道,每個頻道傳遞不同的消息,生產者負責往不同頻道寫消息,消費者負責從多個不同頻道讀消息,這里的多個頻道就是多個list。
下篇文章:
Redis數據類型之sethttps://blog.csdn.net/sniper_fandc/article/details/149139848?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139848&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link