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ù)上邊的通道,也可以變體為倆種方式:
- 左進(jìn)右出:隊(duì)列
- 左進(jìn)左出:桶
二、List分類
根據(jù)個(gè)人理解和便于學(xué)習(xí),個(gè)人進(jìn)行了list命令的分類!
根據(jù)命令性質(zhì)分為:
- 增:增加list數(shù)據(jù)
- 刪:刪除list數(shù)據(jù)
- 改:修改list數(shù)據(jù)
- 查:查詢list數(shù)據(jù)
1. List中的增
- lpush:左邊推進(jìn)一個(gè)或多個(gè)值
- lpushx左邊推進(jìn)一個(gè)值,列表不存在時(shí),無(wú)效
- rpush:右邊推進(jìn)一個(gè)或多個(gè)值
- rpushx:右邊推進(jìn)一個(gè)值,列表不存在時(shí),無(wú)效
- linsert:在某一個(gè)值的前邊或者后邊插入一個(gè)值
2. List中的刪
- lrem:移除指定值,重復(fù)值根據(jù)指定數(shù)量進(jìn)行移除
- lpop:頭部彈出一個(gè)值
- rpop:右部彈出一個(gè)值
- blpop:阻塞彈出頭部一個(gè)值,如果沒(méi)有值,則等待有值或超時(shí)
- brpop:阻塞彈出尾部一個(gè)值,如果沒(méi)有值,則等待有值或超時(shí)
- rpoplpush:尾部彈出一個(gè)值,并把該值壓入到新的列表頭部
- brpoppush:阻塞彈出一個(gè)值,并把該值壓入到新的列表頭部,如果沒(méi)有值,則等待有值或超時(shí)
3. List中的改
- lset:根據(jù)下標(biāo),進(jìn)行修改值
- ltrim:截取列表值(區(qū)間范圍內(nèi),定位值)
4. List中的查
- llen:查詢列表長(zhǎng)度
- lindex:根據(jù)下標(biāo)進(jìn)行獲取某一個(gè)值
- 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 為已存在的列表添加值 |