文章目录
  1. Redis基本命令的使用-列表
  2. 1. 简介
  3. 2. 命令
    1. 2.1 添加
    2. 2.2 查找
    3. 2.3 删除
    4. 2.4 修改
    5. 2.5 阻塞操作
  4. 3. 内部编码
    1. 3.1 ziplist(压缩列表)
    2. 3.2 linkedlist(链表)
    3. 3.3 quicklist
  5. 4. 使用场景
    1. 4.1 消息队列
    2. 4.2 其他使用列表的场景
    3. 4.3 其他

[TOC]

Redis基本命令的使用-列表

1. 简介

列表(List)类型用来存储多个有序字符串,列表中每个字符串被称为元素。一个列表最多可以存储2^32-1个元素。有如下特点:

  • 有序
  • 元素可重复

2. 命令

2.1 添加

  • 从右插入元素
1
2
3
4
5
6
7
8
9
10
# 从右插入元素
$ rpush key value [value ...]

> 示例
127.0.0.1:6379> rpush listkey a b c
(integer) 3
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
  • 从左插入元素
1
2
3
4
5
6
7
8
9
10
11
12
# 从左插入元素
$ lpush key value [value ...]

> 示例
127.0.0.1:6379> lpush listkey a1 b1
(integer) 5
127.0.0.1:6379> lrange listkey 0 -1
1) "b1"
2) "a1"
3) "a"
4) "b"
5) "c"
  • 指定位置插入元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 想某个元素前/后插入元素
# pivot表示找到相等的元素,然后插入,否则不插入
$ linsert key BEFORE|AFTER pivot value

> 示例
127.0.0.1:6379> linsert listkey AFTER c c1
(integer) 6
127.0.0.1:6379> lrange listkey 0 -1
1) "b1"
2) "a1"
3) "a"
4) "b"
5) "c"
6) "c1"

2.2 查找

  • 指定范围查找
1
2
3
4
5
6
7
8
9
10
$ lrange key start stop

# 下标从0开始(可能是负数),注意包含首尾
* 从左到右分别是 0 ~ (N-1)
* 从左到右分别是 -1 ~ -N

> 示例
127.0.0.1:6379> lrange listkey 0 1
1) "b1"
2) "a1"
  • 指定位置查找
1
2
3
4
5
6
7
$ lindex key index

# 下标从0开始(可能是负数)

> 示例
127.0.0.1:6379> lindex listkey 0
"b1"
  • 获取列表长度
1
2
3
4
5
$ llen key

> 示例
127.0.0.1:6379> llen listkey
(integer) 6

2.3 删除

  • 从列表左侧弹出
1
2
3
4
5
6
7
8
9
10
11
$ lpop key

> 示例
127.0.0.1:6379> lpop listkey
"b1"
127.0.0.1:6379> lrange listkey 0 -1
1) "a1"
2) "a"
3) "b"
4) "c"
5) "c1"
  • 从列表右侧弹出
1
2
3
4
5
6
7
8
9
10
$ rpop key

> 示例
127.0.0.1:6379> rpop listkey
"c1"
127.0.0.1:6379> lrange listkey 0 -1
1) "a1"
2) "a"
3) "b"
4) "c"
  • 删除指定元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ lrem key count value

# 找到等于value的元素进行删除
* count>0,从左到右删除最多count个元素
* count<0,从右到左删除最多|count|个元素
* count=0,删除素有

> 示例
127.0.0.1:6379> lrem listkey 1 a1
(integer) 1
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
  • 按索引范围修剪列表
1
2
3
4
5
6
7
8
9
10
$ ltrim key start stop

# 保留索引为start~stop的元素

> 示例
127.0.0.1:6379> ltrim listkey 1 2
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "c"

注意:关于为什么redis为什么没有提供按索引删除可以参考https://stackoverflow.com/questions/31580535/remove-element-at-specific-index-from-redis-list

2.4 修改

  • 指定索引修改
1
2
3
4
5
6
7
8
9
10
$ lset key index value

# index需要在索引范围内

> 示例
127.0.0.1:6379> lset listkey 0 a
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "c"

2.5 阻塞操作

  • 命令如下
1
2
3
4
$ blpop key [key ...] timeout
$ brpop key [key ...] timeout

# 命令除了弹出位置是左和右外,其他基本一样
  • 可以指定多个列表的键
  • timeout:阻塞时间,单位是秒

说明

  • 当列表不为空的时候,客户端会立即返回数据
  • 当列表为空时
    • timeout>0,客户端要等timeout秒返回
    • timeout=0,客户端会一直阻塞下去
  • 如果是多个键,命令会从左至右遍历键,一旦有一个能弹出元素,客户端就立即返回
  • 如果是多个客户端执行命令,那么最先执行pop命令的获取到弹出元素

3. 内部编码

3.1 ziplist(压缩列表)

当列表的元素个数小于list-max-ziplist-entries(默认512个),并且每个的元素的值都小于list-max-ziplist-value(默认64字节)时,Redis会使用ziplist作为列表的内部实现。

3.2 linkedlist(链表)

当无法满足ziplist条件时,Redis会使用linkedlist的方式。

3.3 quicklist

Redis3.2提供了quicklist的内部编码,结合了ziplist和linkedlist两者的优势。

4. 使用场景

4.1 消息队列

使用lpush+brpop组合实现阻塞队列。

4.2 其他使用列表的场景

4.3 其他

  • lpush + lpop = Stack(栈)
  • lpush + rpop = Queue(队列)
  • lpush + ltrim = 有限集合
  • lpush + brpop = MQ(消息队列)
文章目录
  1. Redis基本命令的使用-列表
  2. 1. 简介
  3. 2. 命令
    1. 2.1 添加
    2. 2.2 查找
    3. 2.3 删除
    4. 2.4 修改
    5. 2.5 阻塞操作
  4. 3. 内部编码
    1. 3.1 ziplist(压缩列表)
    2. 3.2 linkedlist(链表)
    3. 3.3 quicklist
  5. 4. 使用场景
    1. 4.1 消息队列
    2. 4.2 其他使用列表的场景
    3. 4.3 其他