Redis 列表操作实战(全)

目录

LINDEX 获取指定下标元素

LSET 指定下标添加元素

LPUSH 将元素插入列表头

LPUSHX

RPUSH 将元素插入列表尾

RPUSHX

LINSERT 将元素插入列表某位置之前

LLEN 列表长度

LPOP 取列表头元素

RPOP  取列表尾元素

BLPOP 阻塞式取列表头元素

BRPOP 阻塞式取列表尾元素

RPOPLPUSH 取尾元素插入头部

BRPOPPUSH 阻塞取尾元素插入头元素

LRANGE 返回指定区间元素

LREM 移除特定元素

LTRIM 保留特定区间元素


LINDEX 获取指定下标元素

LINDEX key index:返回列表 key 中,下标为 index 的元素。

  • index可以是正数:0为第一个,1为第二个,以此类推
  • index可以是负数:-1为最后一个,-2为倒数第二个元素,以此类推
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> lpush mylist banana
(integer) 2
127.0.0.1:6379> lpush mylist orange
(integer) 3
127.0.0.1:6379> lpush mylist pear
(integer) 4

# 0取第一个
127.0.0.1:6379> lindex mylist 0
"pear"

# -1取最后一个
127.0.0.1:6379> lindex mylist -1
"apple"
127.0.0.1:6379> lindex mylist 20
(nil)

时间复杂订为O(N),N为下标index经过的元素数量。

返回值

  • 返回列表下标为index位置的值
  • 若index不在列表的区间范围内,返回nil

LSET 指定下标添加元素

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

  • 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误
  • key必须存在
127.0.0.1:6379> flushdb
OK

# key不存在
127.0.0.1:6379> lset mylist 0 apple
(error) ERR no such key

# 初始化key 并插入值
127.0.0.1:6379> lpush mylist app
(integer) 1
127.0.0.1:6379> lindex mylist 0
"app"

# 用lset
127.0.0.1:6379> lset mylist 0 apple
OK
127.0.0.1:6379> lindex mylist 0
"apple"

时间复杂度为O(N)

  • 表头和表尾,复杂度为O(1)
  • 其它情况为O(N),N为列表的长度

返回值

  • 成功返回OK,否则返回错误信息

LPUSH 将元素插入列表头

LPUSH key value [value ...]:将一个或多个值 value 插入到列表 key 的表头

  • 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头
  • 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作
  • 当 key 存在但不是列表类型时,返回一个错误
  • 允许重复插入
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4

# 重复插入
127.0.0.1:6379> lpush mylist apple banana orange pear 
(integer) 8

# 查看列表数据
127.0.0.1:6379> lrange mylist 0 -1
1) "pear"
2) "orange"
3) "banana"
4) "apple"
5) "pear"
6) "orange"
7) "banana"
8) "apple"

时间复杂度为O(1)。

返回执行LPUSH后的列表长度。

LPUSHX

LPUSHX key value:将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。

  • 和 LPUSH相似, 不同的是,当 key 不存在时, LPUSHX 命令什么也不做
127.0.0.1:6379> flushdb
OK

# mylist不存在
127.0.0.1:6379> lpushx mylist apple banana orange pear 
(integer) 0

# 初始化mylist
127.0.0.1:6379> lpush mylist apple
(integer) 1

# lpushx操作
127.0.0.1:6379> lpushx mylist apple banana orange pear 
(integer) 5

# 查看mylist数据
127.0.0.1:6379> lrange mylist 0 -1
1) "pear"
2) "orange"
3) "banana"
4) "apple"
5) "apple"

时间复杂度为O(1)。

返回执行LPUSHX后的列表长度。

RPUSH 将元素插入列表尾

RPUSH key value [value ...]

  • 操作与LPUSH相似,只有一点不同是 RPUSH 是从尾部插入(LPUSH从头插入)

RPUSHX

RPUSHX key value

  • 操作与LPUS X相似,只有一点不同是 RPUSHX 是从尾部插入(LPUSHX从头插入)

LINSERT 将元素插入列表某位置之前

LINSERT key BEFORE|AFTER pivot value:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

  • 当 pivot 不存在于列表 key 时,不执行任何操作
  • 当 key 不存在时, key 被视为空列表,不执行任何操作
  • 如果 key 不是列表类型,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple
(integer) 1

# 插入到apple之前
127.0.0.1:6379> linsert mylist before apple banaba
(integer) 2
# 插入到apple
127.0.0.1:6379> linsert mylist after apple banaba
(integer) 3

# pivot不存在
127.0.0.1:6379> linsert mylist after pear banaba
(integer) -1

# 清空列表
127.0.0.1:6379> lpop mylist
"banaba"
127.0.0.1:6379> lpop mylist
"apple"
127.0.0.1:6379> lpop mylist
"banaba"
127.0.0.1:6379> lpop mylist
(nil)

# key为空或key不存在
127.0.0.1:6379> linsert mylist before apple banana
(integer) 0
127.0.0.1:6379> linsert mylist1 before apple banana
(integer) 0

时间复杂度O(N), N 为寻找 pivot 过程中经过的元素数量

返回执行后的列表长度

  • 若没有找到 pivot ,返回 -1
  • 若key 不存在或为空列表,返回 0

LLEN 列表长度

LLEN key:返回列表长度。

  • 若 key 不存在,则 key 被解释为一个空列表,返回 0
  • 若 key 不是列表类型,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear 
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4

时间复杂度O(1)。

返回列表 key 的长度。

LPOP 取列表头元素

LPOP key:移除并返回列表 key 的头元素。

  • 若列表为空,返回nil
  • 若key不存在,返回nil
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear 
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4
127.0.0.1:6379> lpop mylist
"pear"

# 头元素已不存在
127.0.0.1:6379> lrange mylist 0 -1
1) "orange"
2) "banana"
3) "apple"

127.0.0.1:6379> lpop mylist
"orange"
127.0.0.1:6379> lpop mylist
"banana"
127.0.0.1:6379> lpop mylist
"apple"

# 列表为空 或 key不存在时
127.0.0.1:6379> lpop mylist
(nil)
127.0.0.1:6379> lpop mylist1
(nil)

时间复杂度为O(1)。

返回移除的头元素

  • 若列表为空 或 key不存在时,返回nil

RPOP  取列表尾元素

RPOP key:操作与LPOP相似

  • RPOP是从尾部移除,LPOP是从头部移除

BLPOP 阻塞式取列表头元素

BLPOP key [key ...] timeout:列表的阻塞式(blocking)弹出原语

  • timeout单位为秒,若为0 表示无限阻塞
  • 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止
  • 当给定多个 key 参数至少有一个不为空列表,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple # 初始化列表并添加一个元素
(integer) 1
127.0.0.1:6379> blpop mylist 10
1) "mylist"
2) "apple"
127.0.0.1:6379> blpop mylist 10
(nil)
(10.05s)    # 超时秒数,未取出数据退出
127.0.0.1:6379> lpush mylist apple # 添加一个元素
(integer) 1

# 而mylist2不存在 跳过;mylist存在且不为空,紧接着 command 列表的第一个元素被弹
127.0.0.1:6379> blpop mylist2 mylist 10
1) "mylist" # 弹出元素所属的列表
2) "apple"  # 弹出元素所属的值
  • 所给的key为空 或不存在,命令将阻塞连接
    • 直到等到超时退出
    • 或直到任何一个key有值为止

Redis 列表操作实战(全)_第1张图片

  • 多客户端执行相同命令时,多个客户端先后放到同一个阻塞队列中,某个key有数据时,先放入阻塞队列的客户端先获取元素

  • 在MULTI/EXEC事务的BLPOP中
    • 事务行为为了保证事务的原子性,是阻止对key进行push操作的,所以在MULTI/EXEC事务中BLPOP与LPOP一样不会阻塞,对空列表返回nil,对非空列表返回头元素
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi       # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000    # 对不存在key进行blpop
QUEUED
127.0.0.1:6379(TX)> exec    # 提交事务
1) (nil)                    # 不阻塞立即返回
127.0.0.1:6379> lpush mylist apple               # 创建mylist并初始化一个元素
(integer) 1
127.0.0.1:6379> multi       # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000    # 对非空列表进行blpop
QUEUED
127.0.0.1:6379(TX)> exec    # 提交事务
1) 1) "mylist"              # 返回元素所在的列表
   2) "apple"               # 返回元素
127.0.0.1:6379> multi       # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000    # 对空列表进行blpop
QUEUED
127.0.0.1:6379(TX)> exec    # 提交事务 
1) (nil)                    # 不阻塞直接返回nil

时间复杂度为o(1)。

返回

  • 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值
  • 如果列表为空,返回一个 nil

BRPOP 阻塞式取列表尾元素

BRPOP key [key ...] timeout:操作与BLPOP相似

  • 不同点:BRPOP是取第一个非空列表的尾部元素;BLPOP是取第一个非空列表的头部元素。

RPOPLPUSH 取尾元素插入头部

RPOPLPUSH source destination:在一个原子时间内,执行以下两个动作

  • 取出source尾元素,并返回给客户端
  • 从source取出的元素插入到destination列表的头部
127.0.0.1:6379> flushdb
OK

# source和dectination均不存在
127.0.0.1:6379> rpoplpush mylist mylist2
(nil)

# 初始化一个列表 添加一个元素
127.0.0.1:6379> lpush mylist banana
(integer) 1
127.0.0.1:6379> rpoplpush mylist mylist2
"banana"
127.0.0.1:6379> lrange mylist2 0 -1    # 从mylist中出放入到了mylist2
1) "banana"
127.0.0.1:6379> lrange mylist 0 -1     # 已取出,mylist为空列表
(empty array)

127.0.0.1:6379> lpush mylist apple     # mylist再插入元素
(integer) 1
127.0.0.1:6379> rpoplpush mylist mylist2 # 再执行一次rpoplpush
"apple"
127.0.0.1:6379> lrange mylist2 0 -1    # 打印mylist2 证实是插入到表头
1) "apple"
2) "banana"

127.0.0.1:6379> rpoplpush mylist mylist2 # mylist为空时执行 rpoplpush 返回nil
(nil)
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> rpoplpush mylist age    # mylist为空,不管destination是什么数据结构,返回nil
(nil)

127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> rpoplpush mylist age    # mylist非空,destination是字符串,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> rpoplpush age mylist2   # age非队列,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回:(RPOPLPUSH是先rpop 再 lpush)

  • source为空队列或source不存在时,返回nil(只执行rpop,不执行lpush)
  • source为非空队列,且destination不存在或为队列,返回source的尾元素,并插入到destination中(destination不存在就创建一个队列,执行rpop和lpush)
  • source存在且不是队列 或 source非空队列且destination不是队列,报错(对非队列key执行rpop)

BRPOPPUSH 阻塞取尾元素插入头元素

BRPOPLPUSH source destination timeout:是 RPOPLPUSH 的阻塞版本

  • 若source为空,则阻塞,直到超时
  • timeout以秒为单位,0表示无限超时
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> brpoplpush mylist mylist2 10 # source不存在或空队列,阻塞超时
(nil)
(10.09s)
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> brpoplpush mylist mylist2 10 # source为非空队列,取出并lpush到mylist2中
"apple"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> brpoplpush age mylist mylist2 10    # source不是队列
(error) ERR wrong number of arguments for 'brpoplpush' command
127.0.0.1:6379> brpoplpush mylist2 age 10           # source非空队列,dectination不是队列
(error) WRONGTYPE Operation against a key holding the wrong kind of value
  • 阻塞期间有别的客户端插入元素

时间复杂度O(1)。

返回:

  • source为空队列或source不存在时阻塞,直到超时返回nil 和 超时时间(只执行rpop,不执行lpush);或者有别的客户端向source 插入数据才返回元素 和 等待时间(执行rpop 和 lpush)
  • source为非空队列,且destination不存在或为队列,返回source的尾元素,并插入到destination中(destination不存在就创建一个队列,执行rpop和lpush)
  • source存在且不是队列 或 source非空队列且destination不是队列,报错(对非队列key执行rpop)

LRANGE 返回指定区间元素

LRANGE key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定

  • 0表示第一个元素,1表示第二个元素,以此类推
  • -1表示最后一个元素,-2表示倒数第二个元素,以此类推
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> brpoplpush mylist mylist2 0
"banana"
(12.53s)
127.0.0.1:6379> lrange mylist2 0 -1
1) "banana"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
127.0.0.1:6379> lrange mylist 0 1
1) "pear"
2) "orange"
127.0.0.1:6379> lrange mylist -2 -1
1) "banana"
2) "apple"
127.0.0.1:6379> lrange mylist 1 0    # start 大于 stop 
(empty array)
127.0.0.1:6379> lrange mylist -1 -2  # start 大于 stop 
(empty array)
127.0.0.1:6379> lrange mylist 100 110 # start 大于列表长度
(empty array)

时间复杂度为O(S+N),S为偏移量 start , N 为指定区间内元素的数量。

返回:

  • 若start 小于等于 stop,返回[start, stop] 区间的元素
  • 若start 大于 stop,返回空列表

LREM 移除特定元素

LREM key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素

  • count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
  • count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
  • count = 0 : 移除表中所有与 value 相等的值
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lrem mylist 0 apple
(integer) 0
127.0.0.1:6379> lpush mylist apple banana apple orange apple pear apple #插入4个apple
(integer) 7
127.0.0.1:6379> lrem mylist 2 apple    # 移除2个apple
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1     # 还剩2个apple
1) "pear"
2) "orange"
3) "apple"
4) "banana"
5) "apple"
127.0.0.1:6379> lrem mylist 0 apple    # 移除所有apple
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1     # 剩0 个apple
1) "pear"
2) "orange"
3) "banana"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> lrem age 0 apple       # 对非队列执行lrem
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 为列表的长度

返回:

  • 被移除元素的数量
  • 若key不存在,则key视为空列表,返回0
  • 若key存在且不为列表,对非列表执行lrem报错

LTRIM 保留特定区间元素

LTRIM key start stop:只保留指定区间 [start, stop] 内的元素,不在指定区间之内的元素都将被删除

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ltrim mylist 0 5    # 不存在的key似为空列表
OK
127.0.0.1:6379> lpush mylist 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(integer) 15
127.0.0.1:6379> ltrim mylist 0 5    # 保存区间 [0, 5] 的元素
OK
127.0.0.1:6379> lrange mylist 0 -1  # 查看列表元素
1) "15"
2) "14"
3) "13"
4) "12"
5) "11"
6) "10"
127.0.0.1:6379> set age 22           # 对非列表执行ltrim
OK
127.0.0.1:6379> ltrim age 0 5        # 对非列表执行ltrim
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度为O(N),N 为被移除的元素的数量

返回:

  • 对列表或不存在key执行ltrim,返回OK
  • 对非列表执行ltrim,报错

你可能感兴趣的:(Redis,java,redis,缓存,后端,数据库)