目录

  • 前言
  • 向栈中从左压入数据(lpush)
  • 取得指定索引位置的内容(lrange)
  • 向栈中从右压入数据(rpush)
  • 在指定元素前追加内容(linsert)
  • 修改指定索引的内容(lset)
  • 删除指定索引处的内容(lrem)
  • 保留指定key的值范围内的数据(ltrim)
  • 从指定`集合头部`删除元素,并返回删除元素(栈顶出栈 lpop)
  • 从指定几个尾部删除数据并返回数据(栈底出栈rpop)
  • 将移除的元素添加至指定的集合中(rpoplpush)
  • 获取元素指定索引的内容(lindex)
  • 返回集合中元素的个数(llen)
  • 删除集合(del)


前言

上一篇博客中,主要说到了Hash类型,可以实现保存对象信息的基本操作,也就是说可以针对Java的对象信息做系列的存储。

在java中,也存在集合类型的数据,比如ListSet等,List集合属于有序集合,在Redis中也是一样,保存的数据也是一种有序集合。本篇博客重点说明List数据类型的基本使用命令。

List数据类型是一种比较麻烦的处理操作,List作为链表结构,具有很高的时间复杂度。其主要进行内容的保存、节点的设置、递归遍历。

向栈中从左压入数据(lpush)

lpush key value [value …]

list链表中新增数据:

lpush xiangjiao a b c d
(integer) 4

取得指定索引位置的内容(lrange)

lrange key 链表起索引start 链表终索引stop

链表无法通过简单的get操作获取数据,需要获取其中的数据信息,只能采取遍历的操作执行。

例如:获取上述List聊表中的数据

127.0.0.1:6379> lpush xiangjiao a b c d
(integer) 4
127.0.0.1:6379> lrange xiangjiao 0 100
1 ) “d”
2 ) “c”
3 ) “b”
4 ) “a”

发现:

  • 遍历集合获取到的数据是倒序!

因为添加数据使用的命令为lpushpush在栈内存中属于入栈,栈具有先进后出的特点。lpush表示向左侧做数据追加

  • 超过范围也能输出!
  • 全部输出可以使用下列命令实现

127.0.0.1:6379> lrange xiangjiao 0 -1 1 ) “d”
2 ) “c”
3 ) “b”
4 ) “a”

向栈中从右压入数据(rpush)

既然有lpush从做向栈中压入数据,那也应该存在向右压入数据的操作。

rpush key value [value …]

例如:从右至左向栈压入数据,并遍历!

127.0.0.1:6379> rpush banana a b c d e f
(integer) 6
127.0.0.1:6379> lrange banana 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) “e”
6 ) “f”

在指定元素前追加内容(linsert)

linsert 集合key BEFORE|AFTER 内容pivot 增加的value

  • 向指定集合的某个数据追加内容。

127.0.0.1:6379> lrange banana 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) “e”
6 ) “f”
127.0.0.1:6379> linsert banana before c c-before
(integer) 7
127.0.0.1:6379> lrange banana 0 -1
1 ) “a”
2 ) “b”
3 ) "c-before" 4 ) “c”
5 ) “d”
6 ) “e”
7 ) “f”

  • 在某个元素追加数据

127.0.0.1:6379> linsert banana after c c-after
(integer) 8
127.0.0.1:6379> lrange banana 0 -1
1 ) “a”
2 ) “b”
3 ) “c-before”
4 ) “c”
5 ) "c-after" 6 ) “d”
7 ) “e”
8 ) “f”

[问:]如果新增许多相同的数据,那么每次before/after的数据位置在哪?

127.0.0.1:6379> linsert test before b b
(integer) 7
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “b”
4 ) “b”
5 ) “b”
6 ) “b”
7 ) “c”
127.0.0.1:6379> linsert test before b b-before
(integer) 8
127.0.0.1:6379> linsert test after b b-after
(integer) 9
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b-before”
3 ) "b" 4 ) “b-after”
5 ) “b”
6 ) “b”
7 ) “b”
8 ) “b”
9 ) “c”

发现:

如果保存的集合内容存放多个重复数据,则以第一个数据为准进行数据保存。

修改指定索引的内容(lset)

和java中的数组结构一样,下标都是从0开始计数!

lset key 下标index 新value

修改上述 testa的数据为aa

127.0.0.1:6379> lrange test 0 -1
1 ) "a" 2 ) “b-before”
3 ) “b”
4 ) “b-after”
5 ) “b”
6 ) “b”
7 ) “b”
8 ) “b”
9 ) “c”
127.0.0.1:6379> lset test 0 aa
OK
127.0.0.1:6379> lrange test 0 -1
1 ) "aa" 2 ) “b-before”
3 ) “b”
4 ) “b-after”
5 ) “b”
6 ) “b”
7 ) “b”
8 ) “b”
9 ) “c”

删除指定索引处的内容(lrem)

lrem key 个数count 需要删除的value

删除上述数据test中的2个b

127.0.0.1:6379> lrange test 0 -1
1 ) “aa”
2 ) “b-before”
3 ) "b" 4 ) “b-after”
5 ) "b" 6 ) “b”
7 ) “b”
8 ) “b”
9 ) “c”
127.0.0.1:6379> lrem test 2 b
(integer) 2
127.0.0.1:6379> lrange test 0 -1
1 ) “aa”
2 ) “b-before”
3 ) “b-after”
4 ) “b”
5 ) “b”
6 ) “b”
7 ) “c”

保留指定key的值范围内的数据(ltrim)

ltrim key 起点下标start 终点下标stop

保留上述list集合test1~4的数据:

127.0.0.1:6379> lrange test 0 -1
1 ) "aa" 2 ) “b-before”
3 ) “b-after”
4 ) “b”
5 ) “b”
6 ) "b"7 ) "c" 127.0.0.1:6379> ltrim test 1 4
OK
127.0.0.1:6379> lrange test 0 -1
1 ) “b-before”
2 ) “b-after”
3 ) “b”
4 ) “b”

从指定集合头部删除元素,并返回删除元素(栈顶出栈 lpop)

lpop key

从集合头部删除test集合中的数据,并返回被删除的数据信息:

127.0.0.1:6379> lrange test 0 -1
1 ) "b-before" 2 ) “b-after”
3 ) “b”
4 ) “b”
127.0.0.1:6379> lpop test
“b-before”
127.0.0.1:6379> lrange test 0 -1
1 ) "b-after" 2 ) “b”
3 ) “b”
127.0.0.1:6379> lpop test
“b-after”
127.0.0.1:6379> lrange test 0 -1
1 ) “b”
2 ) “b”

从指定几个尾部删除数据并返回数据(栈底出栈rpop)

rpop key

创建一个新的集合,将这个集合中的数据从尾部依次删除并打印:

127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) "e" 127.0.0.1:6379> rpop test
“e”
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”

将移除的元素添加至指定的集合中(rpoplpush)

rpoplpush source destination

本来以为是rpoplpush两者的结合体,有其他的命令方式,结果测试没有!

例如:将test集合中的数据栈底出栈,采取栈顶压入数据的方式保存至test2集合中。

127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
127.0.0.1:6379> rpoplpush test test2 “d”
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
127.0.0.1:6379> lrange test2 0 -1
1 ) “d”

注:

可以将同一个集合中的数据,从栈底取出放入栈头

获取元素指定索引的内容(lindex)

lindex key index

获取test集合中的指定索引处的数据:

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rpush test a b c d e
(integer) 5
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) “e”

127.0.0.1:6379> lindex test 0
“a”
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) “e”

只是拿到数据,并未将栈中的数据删除!

返回集合中元素的个数(llen)

llen key

获取上述test集合中的元素个数(集合大小):

127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) “e”
127.0.0.1:6379> llen test
(integer) 5

删除集合(del)

之前在String类型中,删除某条记录使用Del命令,此处依旧可以使用该命令。

del key [key …]

例如:删除指定的集合

127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
5 ) “e”
127.0.0.1:6379> del test (integer) 1
127.0.0.1:6379> lrange test 0 -1
(empty list or set)