Redis五大資料型別之 List(列表)

HuDu發表於2020-09-11

基本的資料型別,列表
在redis裡面,我們可以把list玩成棧或者佇列
這裡的L代表是左邊

127.0.0.1:6379[1]> LPUSH list one    # 將一個值或者多個值,插入到列表頭部(左)
(integer) 1
127.0.0.1:6379[1]> LPUSH list two
(integer) 2
127.0.0.1:6379[1]> LPUSH list three
(integer) 3
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379[1]> LRANGE list 0 1    # 通過區間獲取具體的值
1) "three"
2) "two"
127.0.0.1:6379[1]> RPUSH list right    # 將一個值或者多個值,插入到列表尾部(右)
(integer) 4
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379[1]> LPOP list    # 移除list的第一個元素
"three"
127.0.0.1:6379[1]> RPOP list    # 移除list的最後一個元素
"right"
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379[1]> LINDEX list 0
"two"
127.0.0.1:6379[1]> LINDEX list 1
"one"
  • 返回列表的長度
127.0.0.1:6379[1]> LPUSH list one two three
(integer) 3
127.0.0.1:6379[1]> LLEN list
(integer) 3
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
  • 移除指定的值
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379[1]> LREM list 1 one    # 移除list集合中指定個數的value,精確匹配
(integer) 1
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379[1]> LREM list 1 three
(integer) 1
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "three"
2) "two"
127.0.0.1:6379[1]> LPUSH list three
(integer) 3
127.0.0.1:6379[1]> LREM list 2 three
(integer) 2
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "two"
  • trim,修剪
127.0.0.1:6379[1]> RPUSH mylist hello hello1 hello2 hello3
(integer) 4
127.0.0.1:6379[1]> LRANGE mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379[1]> LTRIM mylist 1 2    # 通過下標擷取指定的長度,這個list已經被修改,階段了只剩下擷取的元素
OK
127.0.0.1:6379[1]> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"
  • rpoplpush
127.0.0.1:6379[1]> RPUSH mylist hello hello1 hello2
(integer) 3
127.0.0.1:6379[1]> RPOPLPUSH mylist myotherlist    # 移除列表的最後一個元素,將他移動到新的列表中
"hello2"
127.0.0.1:6379[1]> LRANGE myotherlist 0 -1    # 檢視新的列表
1) "hello2"
127.0.0.1:6379[1]> LRANGE mylist 0 -1    # 檢視原來的列表
1) "hello"
2) "hello1"
  • lset 將列表中指定下標的值替換為另一個值,更新操作
127.0.0.1:6379[1]> EXISTS list    # 判斷這個列表是否存在
(integer) 0
127.0.0.1:6379[1]> LSET list 0 item    # 如果不存在這個列我們去更新就會儲存
(error) ERR no such key
127.0.0.1:6379[1]> LPUSH list value1
(integer) 1
127.0.0.1:6379[1]> LRANGE list 0 0
1) "value1"
127.0.0.1:6379[1]> LSET list 0 item    # 如果存在,更新當前下標的值
OK
127.0.0.1:6379[1]> LRANGE list 0 0
1) "item"
127.0.0.1:6379[1]> LRANGE list 1 other    # 如果不存在,則會報錯
(error) ERR value is not an integer or out of range
  • linsert
127.0.0.1:6379[1]> RPUSH mylist hello world
(integer) 2
127.0.0.1:6379[1]> LINSERT mylist before world other
(integer) 3
127.0.0.1:6379[1]> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379[1]> LINSERT mylist after world new
(integer) 4
127.0.0.1:6379[1]> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"

小結

  • 它實際上是一個連結串列,Before Node After,left,right都可以插入值
  • 如果key不存在,建立新的連結串列
  • 如果key存在,新增內容
  • 如果移除了所有值,空連結串列,也代表不存在
  • 兩邊插入或者改動值,效率最高!中間元素,相對來說效率會低一點

訊息排隊!訊息佇列(Lpush Rpop),棧(Lpush Lpop)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章