redis | 五、redis之List

redis系列文章:
https://liudongdong.top/categories/redis
本篇來(lái)源:
https://liudongdong.top/archives/rediswu-redis-zhi-list
公眾號(hào):雨中散步撒哈拉
備注:歡迎關(guān)注公眾號(hào),一起學(xué)習(xí),共同進(jìn)步!

一、List概述

Redis列表是簡(jiǎn)單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)

一個(gè)列表最多可以包含 232 - 1 個(gè)元素 (4294967295, 每個(gè)列表超過(guò)40億個(gè)元素)。

list可以理解為一個(gè)通道,可以左邊進(jìn),也可以右邊進(jìn)。


image.png

根據(jù)上邊的通道,也可以變體為倆種方式:

  1. 左進(jìn)右出:隊(duì)列
  2. 左進(jìn)左出:桶

二、List分類

根據(jù)個(gè)人理解和便于學(xué)習(xí),個(gè)人進(jìn)行了list命令的分類!
根據(jù)命令性質(zhì)分為:

  1. 增:增加list數(shù)據(jù)
  2. 刪:刪除list數(shù)據(jù)
  3. 改:修改list數(shù)據(jù)
  4. 查:查詢list數(shù)據(jù)

1. List中的增

  1. lpush:左邊推進(jìn)一個(gè)或多個(gè)值
  2. lpushx左邊推進(jìn)一個(gè)值,列表不存在時(shí),無(wú)效
  3. rpush:右邊推進(jìn)一個(gè)或多個(gè)值
  4. rpushx:右邊推進(jìn)一個(gè)值,列表不存在時(shí),無(wú)效
  5. linsert:在某一個(gè)值的前邊或者后邊插入一個(gè)值

2. List中的刪

  1. lrem:移除指定值,重復(fù)值根據(jù)指定數(shù)量進(jìn)行移除
  2. lpop:頭部彈出一個(gè)值
  3. rpop:右部彈出一個(gè)值
  4. blpop:阻塞彈出頭部一個(gè)值,如果沒(méi)有值,則等待有值或超時(shí)
  5. brpop:阻塞彈出尾部一個(gè)值,如果沒(méi)有值,則等待有值或超時(shí)
  6. rpoplpush:尾部彈出一個(gè)值,并把該值壓入到新的列表頭部
  7. brpoppush:阻塞彈出一個(gè)值,并把該值壓入到新的列表頭部,如果沒(méi)有值,則等待有值或超時(shí)

3. List中的改

  1. lset:根據(jù)下標(biāo),進(jìn)行修改值
  2. ltrim:截取列表值(區(qū)間范圍內(nèi),定位值)

4. List中的查

  1. llen:查詢列表長(zhǎng)度
  2. lindex:根據(jù)下標(biāo)進(jìn)行獲取某一個(gè)值
  3. lrange:根據(jù)下標(biāo)范圍獲取list列表

三、命令實(shí)踐

根據(jù)分類,進(jìn)行命令操作

1. List中的增

127.0.0.1:6379> keys *
(empty list or set)
# 左邊推進(jìn)倆個(gè)值
127.0.0.1:6379> lpush lists one two
(integer) 2
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
# 右邊推進(jìn)倆個(gè)值
127.0.0.1:6379> rpush lists three four
(integer) 4
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
3) "three"
4) "four"
# 左邊推進(jìn)一個(gè)值,僅支持一個(gè)
127.0.0.1:6379> lpushx lists five
(integer) 5
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "four"
# 右邊推進(jìn)一個(gè)值,僅支持一個(gè)
127.0.0.1:6379> rpushx lists sex
(integer) 6
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "four"
6) "sex"
# 在某一個(gè)值的前邊或后邊進(jìn)行插入值
127.0.0.1:6379> linsert lists after three zero
(integer) 7
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "zero"
6) "four"
7) "sex"
127.0.0.1:6379> 

2. List中的刪

127.0.0.1:6379> keys *
1) "lists"
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "two"
3) "one"
4) "three"
5) "zero"
6) "four"
7) "sex"
# 頭部彈出一個(gè)值
127.0.0.1:6379> lpop lists
"five"
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
3) "three"
4) "zero"
5) "four"
6) "sex"
# 尾部彈出一個(gè)值
127.0.0.1:6379> rpop lists
"sex"
127.0.0.1:6379> lrange lists 0 -1
1) "two"
2) "one"
3) "three"
4) "zero"
5) "four"
# 頭部阻塞彈出two值,沒(méi)有two則取第一個(gè)值,如列表沒(méi)值則返回nil
127.0.0.1:6379> blpop lists two 3
1) "lists"
2) "two"
127.0.0.1:6379> lrange lists 0 -1
1) "one"
2) "three"
3) "zero"
4) "four"
127.0.0.1:6379> blpop lists two 3
1) "lists"
2) "one"
127.0.0.1:6379> lrange lists 0 -1
1) "three"
2) "zero"
3) "four"
# 創(chuàng)建一個(gè)新的列表
127.0.0.1:6379> lpush lists2 aa
(integer) 1
# 頭部阻塞彈出two值,沒(méi)有aa則取第一個(gè)值,如列表沒(méi)值則返回nil
127.0.0.1:6379> blpop lists2 aa 3
1) "lists2"
2) "aa"
127.0.0.1:6379> blpop lists2 aa 3
(nil)
(3.10s)
127.0.0.1:6379> lrange lists 0 -1
1) "zero"
2) "four"
127.0.0.1:6379> lrange lists2 0 -1
(empty list or set)
# 尾部彈出,并壓入新的列表頭部
127.0.0.1:6379> rpoplpush lists lists2
"four"
127.0.0.1:6379> lrange lists 0 -1
1) "zero"
127.0.0.1:6379> lrange lists2 0 -1
1) "four"
# 阻塞,尾部彈出,并壓入新的列表頭部
127.0.0.1:6379> brpoplpush lists lists2 3
"zero"
127.0.0.1:6379> lrange lists 0 -1
(empty list or set)
127.0.0.1:6379> lrange lists2 0 -1
1) "zero"
2) "four"
127.0.0.1:6379> brpoplpush lists lists2 3
(nil)
(3.04s)
# 移除指定值
127.0.0.1:6379> lrem lists2 1 zero
(integer) 1
127.0.0.1:6379> lrange lists2 0 -1
1) "four"
127.0.0.1:6379> 

3. List中的改

# 創(chuàng)建lists,并賦予值
127.0.0.1:6379> lpush lists one two three four five sex
(integer) 6
127.0.0.1:6379> lrange lists 0 -1
1) "sex"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
# 截取list,范圍位[1,4]
127.0.0.1:6379> ltrim lists 1 4
OK
127.0.0.1:6379> lrange lists 0 -1
1) "five"
2) "four"
3) "three"
4) "two"
# 根據(jù)下標(biāo)進(jìn)行設(shè)置值
127.0.0.1:6379> lset lists 0 "hello world"
OK
127.0.0.1:6379> lrange lists 0 -1
1) "hello world"
2) "four"
3) "three"
4) "two"
127.0.0.1:6379>

4. List中的查

127.0.0.1:6379> lrange lists2 0 -1
1) "four"
127.0.0.1:6379> llen lists2
(integer) 1
127.0.0.1:6379> lindex lists2 0
"four"
127.0.0.1:6379> lrange lists2 0 -1
1) "four"
127.0.0.1:6379> 

附錄

下表列出了列表相關(guān)的基本命令:

序號(hào) 命令及描述
1 [BLPOP key1 key2 ] timeout 移出并獲取列表的第一個(gè)元素, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
2 [BRPOP key1 key2 ] timeout 移出并獲取列表的最后一個(gè)元素, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
3 BRPOPLPUSH source destination timeout 從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它; 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
4 LINDEX key index 通過(guò)索引獲取列表中的元素
5 LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
6 LLEN key 獲取列表長(zhǎng)度
7 LPOP key 移出并獲取列表的第一個(gè)元素
8 [LPUSH key value1 value2] 將一個(gè)或多個(gè)值插入到列表頭部
9 LPUSHX key value 將一個(gè)值插入到已存在的列表頭部
10 LRANGE key start stop 獲取列表指定范圍內(nèi)的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通過(guò)索引設(shè)置列表元素的值
13 LTRIM key start stop 對(duì)一個(gè)列表進(jìn)行修剪(trim),就是說(shuō),讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。
14 RPOP key 移除列表的最后一個(gè)元素,返回值為移除的元素。
15 RPOPLPUSH source destination 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回
16 [RPUSH key value1 value2] 在列表中添加一個(gè)或多個(gè)值
17 RPUSHX key value 為已存在的列表添加值
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容