redis 6 資料結構 List列表型別

2021-10-18 19:29:44 字數 3204 閱讀 9382

如果要將redis中文章進行分頁展示到前端,但是中間有可能有的文章已經刪除,若用hash儲存,則需要判斷改文章是否存在。現在繼續看redis的第三種資料結構list,可以完全規避上面問題;

redis將列表資料結構命名為list而不是array,是因為列表的儲存結構用的是鍊錶而不是陣列,而且鍊錶還是雙向鍊錶。因為它是鍊錶,所以隨機定位效能較弱,首尾插入刪除效能較優。如果list的列表長度很長,使用時我們一定要關注鍊錶相關操作的時間複雜度。

這種特性使列表型別能非常快速地完成關聯式資料庫難以應付的場景:如社交**的新鮮事,我們關心的只是最新的內容,使用列表型別儲存,即使新鮮事的總數達到幾千萬個,獲 取其中最新的100條資料也是極快的。同樣因為在兩端插入記錄的時間複雜度是o(1),列表型別也適合用來記錄日誌,可以保證加入新日誌的速度不會受到已有日誌數量的影響。 借助列表型別,redis還可以作為佇列使用.

與雜湊型別鍵最多能容納的字段數量相同,乙個列表型別鍵最多能容納2的32次方−1個元素。

1.向列表兩端增加元素

lpush key value [value …]

rpush key value [value …]

lpush命令用來向列表左邊增加元素,返回值表示增加元素後列表的長度。

lpush命令還支援同時增加多個元素,例如:

2.從兩端彈出元素

lpop key  從列表左邊彈出第乙個(1將列表左邊元素移除,2返回被移除的元素值)

rpop key 從列表右側彈出第乙個

llen numbers 類似sql中count
4.獲得列表片段
lrange key start stop 從key列表中獲取下標從start到stop的元素(包含兩端,下標從零開始)
5.刪除指定的值
lrem key count value
lrem命令會刪除列表中前count個值為value的元素,返回值是實際刪除的元素個數。根 據count值的不同,lrem命令的執行方式會略有差異。

當 count > 0時 lrem 命令會從列表左邊開始刪除前 count 個值為 value的元素。

當 count < 0時 lrem 命令會從列表右邊開始刪除前|count|個值為 value 的元素。

當 count = 0是 lrem命令會刪除所有值為 value的元素。

1.儲存文章id列表

設計key=posts:list記錄文章id列表,發布新文章時候lpush即可加入,刪除文章lrem posts:list 1 即可;

注意:如果文章過多,要修改中間文章,效能較差(鍊錶中找到中間元素效能慢)

$serializedcomment =

serialize

($author, $email, $time, $content)

lpush post:

42:comments, $serializedcomment

1.獲得/設定指定索引的元素值

lindex key index 

lset key index value

如果要將列表型別當作陣列來用,lindex命令是必不可少的。lindex命令用來返回 指定索引的元素,索引從0開始

2.只保留列表指定片段

ltrim key start end
ltrim 命令可以刪除指定索引範圍之外的所有元素,其指定列表範圍的方法和lrange 命令相同。

ltrim命令常和lpush命令一起使用來限制列表中元素的數量,比如記錄日誌時我們希 望只保留最近的100條日誌,則每次加入新元素時呼叫一次ltrim命令即可;

3.向列表中插入元素

linsert key before|after pivot value
linsert 命令首先會在列表中從左到右查詢值為 pivot 的元素,然後根據第二個引數是 before還是after來決定將value插入到該元素的前面還是後面。 linsert命令的返回值是插入後列表的元素個數;

4.將元素從乙個列表轉到另乙個列表

rpoplpush source destination
rpoplpush是個很有意思的命令,從名字就可以看出它的功能:先執行rpop命令再 執行lpush命令

rpoplpush命令會先從source列表型別鍵的右邊彈出乙個元素,然後將 其加入到destination列表型別鍵的左邊,並返回這個元素的值,整個``過程是原子的。其具體實 現可以表示為偽**:

def rpoplpush ($source, $destination) 

$value = rpop $source

lpush $destination, $value

return $value

當把列表型別作為佇列使用時,rpoplpush 命令可以很直觀地在多個佇列中傳遞資料

當source和destination相同時,rpoplpush命令會不斷地將隊尾的元素移到隊首,借助 這個特性我們可以實現乙個**監控系統:使用乙個佇列儲存需要監控的**,然後監控程式不斷地使用 rpoplpush 命令迴圈取出乙個**來測試可用性。這裡使用rpoplpush命令的好處在於在程式執行過程中仍然可以不斷地向**列表中加入新**,而且整個系統容易擴充套件,允許多個客戶端同時處理佇列。

redis資料結構之List

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

Redis的資料結構 List

列表結構 key elements 特點 有序 可以重複 左右彈出 api rpush key value1 value2 valuen 從列表右端插入值 1 n個 o 1 n lpush key value1 value2 valuen 從列表左端插入值 1 n個 o 1 n linsert ke...

Redis資料結構之list

lpush rpush 從左邊 右邊插入乙個或多個值,類似推箱子。lpop rpop 從左邊 右邊吐出乙個值。值在鍵在,值光鍵亡 rpoplpush 從列表右邊吐出乙個值,插到列表左邊 lrange 按照索引下標獲得元素 從左到右 lindex 按照索引下標獲得元素 從左到右 llen 獲得列表長度...