首頁  >  文章  >  資料庫  >  redis的list資料型別相關指令分析及如何使用

redis的list資料型別相關指令分析及如何使用

WBOY
WBOY轉載
2023-05-28 09:32:18995瀏覽

    list清單簡介

    • list是依照插入順序排序的字串陣列(說通俗點,仍然儲存字串)。你可以加一個元素到列表的頭部(左邊)或尾部(右邊),個列表最多可以包含^32-1個元素(每個列表超過40億個元素)。

    • Redis中的list和Java中的LinkedList很像,底層都是一種鍊錶結構,list的插入和刪除操作非常快,時間複雜度為0(1),不像數組結構插入、刪除操作需要移動資料。儘管表面上仍然是列表,但Redis中的列表底層實作並不僅限於簡單的雙向鍊錶。

    • 當資料量較少的時候它的底層儲存結構為一塊連續內存,稱之為ziplist(壓縮列表),它將所有的元素緊挨著一起存儲,分配的是一塊連續的記憶體;當資料量較多的時候將會變成quicklist(快速鍊錶)結構。

    • 可單純的鍊錶也是有缺陷的,鍊錶的前後指標prev和next會佔用較多的內存,會比較浪費空間,而且會加重記憶體的碎片化。自Redis 3.2之後,Redis使用混合資料結構quicklist(快速鍊錶),該結構由ziplist和鍊錶組成。

    常用指令

    新增指令

    #lpush key 值

    從左邊插入元素(將一個或多個值插入到列表頭)

    127.0.0.1:6379> lpush ids 1
    (integer) 1
    127.0.0.1:6379> lrange ids 0 -1
    1) "1"
    127.0.0.1:6379> lpush ids 2
    (integer) 2
    127.0.0.1:6379> lrange ids 0 -1
    1) "2"
    2) "1"

    rpush key value

    從右邊插入元素(將一個或多個值插入到列表的尾部(最右邊))

    127.0.0.1:6379> rpush ids 3
    (integer) 3
    127.0.0.1:6379> lrange ids 0 -1
    1) "2"
    2) "1"
    3) "3"

    linsert key BEFORE|AFTER pivot value
    向某個元素前/後插入元素,傳回結果為目前清單長度,注意清單不存在或指定元素不存在清單中時,都將不執行任何操作。

    //元素3前插入0
    127.0.0.1:6379> linsert ids before 3 0
    (integer) 4
    127.0.0.1:6379> lrange ids 0 -1
    1) "2"
    2) "1"
    3) "0"
    4) "3"
    //元素3后插入0
    127.0.0.1:6379> linsert ids after 3 4
    (integer) 5
    127.0.0.1:6379> lrange ids 0 -1
    1) "2"
    2) "1"
    3) "0"
    4) "3"
    5) "4"

    查詢指令

    lrange key start end
    取得清單中指定範圍內的元素清單;若start值大於清單end值則傳回空清單
    如上已經展示過了

    lindex key index
    取得清單指定索引下標的元素

    127.0.0.1:6379> lindex ids 0
    "2"
    127.0.0.1:6379> lindex ids -1
    "4"

    llen key
    #取得清單長度;清單不存在則傳回0

    127.0.0.1:6379> llen ids
    (integer) 5

    彈出/刪除指令

    #lpop key
    從清單左側彈出元素並傳回頭部元素

    127.0.0.1:6379> lpop ids
    "2"
    127.0.0.1:6379> lrange ids 0 -1
    1) "1"
    2) "0"
    3) "3"
    4) "4"

    rpop key
    從清單右側彈出元素並返回尾部元素

    127.0.0.1:6379> rpop ids
    "4"
    127.0.0.1:6379> lrange ids 0 -1
    1) "1"
    2) "0"
    3) "3"

    lrem key count value
    #從清單中找到等於value的元素進行刪除,依count的不同分為三種情況:
    count > 0,從表頭開始向表尾,移除數量為count個元素;
    count count = 0,移除表中所有與value 相等的值

    127.0.0.1:6379> lrem ids 0 3
    (integer) 1
    127.0.0.1:6379> lrange ids 0 -1
    1) "1"
    2) "0"

    ltrim key start end
    對一個清單進行修剪(trim),就是說,讓清單只保留指定區間內的元素,不在指定區間之內的元素都會被刪除

    127.0.0.1:6379> ltrim ids 0 0
    OK
    127.0.0.1:6379> lrange ids 0 -1
    1) "1"

    修改指令

    lset key index value
    修改指定下標的元素的值設定為value

    127.0.0.1:6379> lset ids 0 0
    OK
    127.0.0.1:6379> lrange ids 0 -1
    1) "0"

    阻塞彈出指令

    blpop key [key …] timeout
    移出並取得清單的第一個元素, 如果清單沒有元素會阻塞清單直到等待逾時(單位秒)或發現可彈出元素為止

    brpop key [key …] timeout
    移出並取得清單的最後一個元素, 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止
    示範:
    開啟三個reids連線窗口,第一個執行blpop ,第二個執行brpop ,第三個執行新增:
    可以看到視窗1和2執行完都已經阻塞在這裡,這是因為ids中沒有元素

    redis的list資料型別相關指令分析及如何使用

    redis的list資料型別相關指令分析及如何使用

    視窗3執行新增:lpush ids 1 2 3 4 5 6
    可以看到視窗1和2立即彈出對應元素:

    redis的list資料型別相關指令分析及如何使用

    redis的list資料型別相關指令分析及如何使用

    應用程式場景

    訊息佇列:lpop和rpush(或反過來,lpush和rpop)能實現佇列的功能

    朋友圈的讚列表、評論列表、排行榜:lpush指令和lrange指令能實現最新列表的功能,每次透過lpush指令往列表裡插入新的元素,然後透過lrange指令讀取最新的元素列表。

    以上是redis的list資料型別相關指令分析及如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除