redis基本数据类型List

实战场景:

  1. timeline:例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
一、常用命令

未学习命令:BLPOP,BRPOP,BRPOPLPUSH

列表是线性有序的数据结构,它内部的元素是可以重复的,并且一个列表最多能存储2^32-1个元素

1.1 从列表的左侧添加

lpush key value [value ...] :将一个或多个值 value 插入到列表 key 的表头,返回执行命令后,列表的长度

如果 key 不存在,一个空列表会被创建并执行 lpush 操作。

127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"

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

当 key 不存在时, lpushx 命令什么也不做。且lpushx一次只能插入一个值

# 对空列表执行 LPUSHX
127.0.0.1:6379 > llen greet # greet 是一个空列表
(integer) 0
127.0.0.1:6379> lpushx greet "hello" # 尝试 LPUSHX,失败,因为列表为空
(integer) 0
# 对非空列表执行 LPUSHX
127.0.0.1:6379> lpushx greet "hello" # 先用 LPUSH 创建一个有一个元素的列表
(integer) 1
127.0.0.1:6379> lpushx greet "good morning" # 这次 LPUSHX 执行成功
(integer) 2
127.0.0.1:6379> lrange greet 0 -1
1) "good morning"
2) "hello"
1.2 从列表的右侧添加

rpush key value [value ...]:将一个或多个值 value 插入到列表 key 的表尾(最右边)。返回执行命令后,列表的长度

如果 key 不存在,一个空列表会被创建并执行 rpush 操作。

127.0.0.1:6379> rpush mylist 1 2 3
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"

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

和 rpush 命令相反,当 key 不存在时, rpush 命令什么也不做。

127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> rpush mylist 5
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "5"
1.3 从列表左侧弹出一个数据

lpop key:移除并返回列表 key 的头元素。如果值都没了,那么会删除键
返回值:列表的头元素。当 key 不存在时,返回 nil 。

127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "5"
127.0.0.1:6379> lpop mylist
"1"
1.4 从列表右侧弹出一个数据

rpop key:移除并返回列表 key 的尾元素。如果值都没了,那么会删除键
返回值:列表的尾元素。当 key 不存在时,返回 nil 。

127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> rpop list
"1"
127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "3"
3) "2"
1.5 弹出指定数据

lrem key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素。返回值:被移除元素的数量。当 key 不存在时, LREM 命令总是返回 0 。

count 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。

127.0.0.1:6379> lrange demo 0 -1
1) "w"
2) "5"
3) "4"
4) "w"
5) "2"
6) "1"
7) "w"
127.0.0.1:6379> lrem demo 2 w
(integer) 2
127.0.0.1:6379> lrange demo 0 -1
1) "5"
2) "4"
3) "2"
4) "1"
5) "w"
1.6 保留指定区间内的元素

ltrim key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end :返回值:命令执行成功时,返回 ok 。

举个例子,执行命令 ltrim list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
当 key 不是列表类型时,返回一个错误。

# 情况 1: 常见情况, start 和 stop 都在列表的索引范围之内

127.0.0.1:6379> lrange alpha 0 -1       # alpha 是一个包含 5 个字符串的列表
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"

127.0.0.1:6379> ltrim alpha 1 -1        # 删除 alpha 列表索引为 0 的元素
OK

127.0.0.1:6379> lrange alpha 0 -1       # "h" 被删除了
1) "e"
2) "l"
3) "l"
4) "o"


# 情况 2: stop 比列表的最大下标还要大


127.0.0.1:6379> ltrim alpha 1 10086     # 保留 alpha 列表索引 1 至索引 10086 上的元素
OK

127.0.0.1:6379> lrange alpha 0 -1       # 只有索引 0 上的元素 "e" 被删除了,其他元素还在
1) "l"
2) "l"
3) "o"


# 情况 3: start 和 stop 都比列表的最大下标要大,并且 start < stop

127.0.0.1:6379> ltrim alpha 10086 123321
OK

127.0.0.1:6379> lrange alpha 0 -1        # 列表被清空
(empty list or set)


# 情况 4: start 和 stop 都比列表的最大下标要大,并且 start > stop

127.0.0.1:6379> rpush new-alpha "h" "e" "l" "l" "o"     # 重新建立一个新列表
(integer) 5

127.0.0.1:6379> lrange new-alpha 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"

127.0.0.1:6379> ltrim new-alpha 123321 10086    # 执行 LTRIM
OK

127.0.0.1:6379> lrange new-alpha 0 -1           # 同样被清空
(empty list or set)
1.7 双list操作

rpoplpush source destination:在一个原子时间内,将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。

如果 source 不存在,值 nil 被返回,并且不执行其他动作。
如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

127.0.0.1:6379> lrange source 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange destination 0 -1
1) "e"
2) "w"
3) "q"
127.0.0.1:6379> rpoplpush source destination
"1"
127.0.0.1:6379> lrange source 0 -1
1) "3"
2) "2"
127.0.0.1:6379> lrange destination 0 -1
1) "1"
2) "e"
3) "w"
4) "q"
1.8 查询指定区间内的元素

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

下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

超出范围的下标值不会引起错误。
如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。
如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。

127.0.0.1:6379> lrange destination 0 -1
1) "1"
2) "e"
3) "w"
4) "q"
1.9 查询指定下标的元素

lindex key index:返回列表 key 中,下标为 index 的元素。返回值:列表中下标为 index 的元素。如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。

下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
如果 key 不是列表类型,返回一个错误。

127.0.0.1:6379> lrange destination 0 -1
1) "1"
2) "e"
3) "w"
4) "q"
127.0.0.1:6379> lindex destination  0
"1"
127.0.0.1:6379> lindex destination  10
(nil)
1.10 返回列表长度

llen key:返回列表 key 的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0 .如果 key 不是列表类型,返回一个错误。

127.0.0.1:6379> lrange destination 0 -1
1) "1"
2) "e"
3) "w"
4) "q"
127.0.0.1:6379> llen destination
(integer) 4
1.11 指定位置插入

linsert key before |after pivot value:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
返回值:如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到 pivot ,返回 -1 。如果 key 不存在或为空列表,返回 0

当 pivot 不存在于列表 key 时,不执行任何操作。
当 key 不存在时, key 被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误。

127.0.0.1:6379> lrange demo 0 -1
1) "5"
2) "4"
3) "2"
4) "1"
127.0.0.1:6379> linsert demo before 4 new4
(integer) 5
127.0.0.1:6379> lrange demo 0 -1
1) "5"
2) "new4"
3) "4"
4) "2"
5) "1"
127.0.0.1:6379> linsert demo after 4 after4
(integer) 6
127.0.0.1:6379> lrange demo 0 -1
1) "5"
2) "new4"
3) "4"
4) "after4"
5) "2"
6) "1"

lset key index value:将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。返回值:操作成功返回 ok ,否则返回错误信息。

# 对空列表(key 不存在)进行 LSET

127.0.0.1:6379> EXISTS list
(integer) 0

127.0.0.1:6379> LSET list 0 item
(error) ERR no such key


# 对非空列表进行 LSET

127.0.0.1:6379> LPUSH job "cook food"
(integer) 1

127.0.0.1:6379> LRANGE job 0 0
1) "cook food"

127.0.0.1:6379> LSET job 0 "play game"
OK

127.0.0.1:6379> LRANGE job  0 0
1) "play game"


# index 超出范围

127.0.0.1:6379> LLEN list                    # 列表长度为 1
(integer) 1

127.0.0.1:6379> LSET list 3 'out of range'
(error) ERR index out of range
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值