目录
- 前言
- 向栈中从左压入数据(lpush)
- 取得指定索引位置的内容(lrange)
- 向栈中从右压入数据(rpush)
- 在指定元素前追加内容(linsert)
- 修改指定索引的内容(lset)
- 删除指定索引处的内容(lrem)
- 保留指定key的值范围内的数据(ltrim)
- 从指定`集合头部`删除元素,并返回删除元素(栈顶出栈 lpop)
- 从指定几个尾部删除数据并返回数据(栈底出栈rpop)
- 将移除的元素添加至指定的集合中(rpoplpush)
- 获取元素指定索引的内容(lindex)
- 返回集合中元素的个数(llen)
- 删除集合(del)
前言
上一篇博客中,主要说到了Hash类型,可以实现保存对象信息的基本操作,也就是说可以针对Java的对象信息做系列的存储。
在java中,也存在集合类型的数据,比如List、Set等,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”
发现:
- 遍历集合获取到的数据是倒序!
因为添加数据使用的命令为
lpush。push在栈内存中属于入栈,栈具有先进后出的特点。lpush表示向左侧做数据追加!
- 超过范围也能输出!
- 全部输出可以使用下列命令实现
127.0.0.1:6379> lrange xiangjiao 0
-11 ) “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
修改上述 test 中a的数据为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 test0aa
OK
127.0.0.1:6379> lrange test 0 -11 ) "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集合test中1~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>lpoptest
“b-before”
127.0.0.1:6379> lrange test 0 -11 ) "b-after"2 ) “b”
3 ) “b”
127.0.0.1:6379>lpoptest
“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
本来以为是
rpop和lpush两者的结合体,有其他的命令方式,结果测试没有!
例如:将test集合中的数据栈底出栈,采取栈顶压入数据的方式保存至test2集合中。
127.0.0.1:6379> lrange test 0 -1
1 ) “a”
2 ) “b”
3 ) “c”
4 ) “d”
127.0.0.1:6379> rpoplpushtesttest2“d”
127.0.0.1:6379> lrangetest0 -1
1 ) “a”
2 ) “b”
3 ) “c”
127.0.0.1:6379> lrangetest20 -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
test0 -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)
















