Redis从入门到实战(十三、列表(List))

137 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

1、LPUSH key value1 [value2]

将一个或多个值插入到列表头部(左侧)。

127.0.0.1:6379> lpush cat xiaohua
(integer) 1

2、LPOP key

移出并获取列表的第一个元素(左侧),当列表 key 不存在时,则返回nil。

127.0.0.1:6379> lpop cat1
(nil)
127.0.0.1:6379> lpop cat
"xiaohua"

3、RPUSH key value1 [value2]

向列表右侧插入一个或多个元素。

127.0.0.1:6379> rpush cat xiaolan xiaoming
(integer) 2

4、RPOP key

移除并返回列表右侧的第一个元素。

127.0.0.1:6379> rpop cat
"xiaoming"

5、LRANGE key start stop

获取列表指定范围内的元素。

其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推

0,-1范围是全部查出。

127.0.0.1:6379> lrange cat 0 2
1) "xiaolan"

6、LREM key count value

根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

127.0.0.1:6379> lrem cat 1 "xiaolan"
(integer) 1

7、LTRIM key start stop

对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
127.0.0.1:6379> RPUSH mylist "bar"
(integer) 4
127.0.0.1:6379>  LTRIM mylist 1 -1
OK
127.0.0.1:6379>  LRANGE mylist 0 -1
1) "hello"
2) "foo"
3) "bar"

8、RPOPLPUSH source destination

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

127.0.0.1:6379> rpoplpush mylist myotherlist
"bar"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"

9、LSET key index value

将列表 key 下标为 index 的元素的值设置为 value 。

127.0.0.1:6379> exists mylist    # 对空列表(key 不存在)进行 LSET
(integer) 1
127.0.0.1:6379> lset mylist 0 item  # 对非空列表进行 LSET
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "item"
2) "foo"

10、LINSERT key BEFORE|AFTER pivot value

在列表的元素前或者后插入元素。

127.0.0.1:6379> LINSERT mylist BEFORE "foo" "world"
(integer) 3
127.0.0.1:6379> Lrange mylist 0 -1
1) "item"
2) "world"
3) "foo"

11、LLEN key

获取哈希表中字段的数量。

127.0.0.1:6379> Llen mylist
(integer) 3

12、Lindex key index

按照索引下标获得元素(-1代表最后一个,0代表是第一个,即所有)

相当于 Java 链表操作中的 get(int index) 操 作;

127.0.0.1:6379> Lindex cat 1
(nil)
127.0.0.1:6379> Lindex cat 0
"xiaolan"
127.0.0.1:6379> Lindex cat -1
"xiaolan"

13、总结

  • 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就低了。
  • 它是一个字符串链表,left,right 都可以插入添加 。
  • 如果键不存在,创建新的链表 如果键已存在,新增内容。
  • 如果值全移除,对应的键也就消失了。

list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。

Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部 添加或者删除元素,这样List即可以作为栈,也可以作为队列。

14、问题

1、list 实现队列

队列是先进先出的数据结构,常用于消息排队和异步逻辑处理,它会确保元素的访问顺序:

127.0.0.1:6379> RPUSH books python java golang
(integer) 3
127.0.0.1:6379> LPOP books
"python"
127.0.0.1:6379> LPOP books
"java"
127.0.0.1:6379> LPOP books
"golang"
127.0.0.1:6379> LPOP books
(nil)

2、list 实现栈

栈是先进后出的数据结构,跟队列正好相反:

127.0.0.1:6379> RPUSH books python java golang
(integer) 3
127.0.0.1:6379> RPOP books
"golang"
127.0.0.1:6379> RPOP books
"java"
127.0.0.1:6379> RPOP books
"python"
127.0.0.1:6379> RPOP books
(nil)
127.0.0.1:6379>