一.概述
Java中 : 数组 Arraylist ,链表 linkedList
数组的特点:根据索引取值速度是极快的(和数据量的大小无关)
数组的增删改查,效率极低(数据量越大,效率越低)
链表的特点:链表的元素增删,效率极高(和数据量的大小无关)
根据索引取值,效率极低(数据量越大,效率越低)
为什么redis选取了链表?
因为redis操作中,做的最多的操作是元素的增删
使用环境:
1. 做大数据集合的增删
2. 做任务队列
二.List的命令
注意:redis中是用链表来存储数据的,链表的头称为左端,链表的尾称为右端
1.取值
1.查看列表
lrangkey start end
获取链表中从start到end的元素的值,start、end从0开始计数;也可以为负数,若为-1,则表示链表尾部的元素,-2表示倒数第二个,依次类推
2.赋值
1.俩端添加
lpush key values[value1,value2…]
在指定的key所关联的list头部插入所有的values,如果该key不存在,该命令在执行插入之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数
rpush key values[value1,value2…]
在该list的尾部添加元素,返回元素的个数
注意:这俩个命令的添加效果是不一样的
lpush list1 a,b,c,d -------------à添加后的顺序:d,c,b,a
rpush list2 a,b,c,d ------------à添加后的顺序:a,b,c,d
3.删除
1.两端弹出(本质就是删除)
lpop key
返回并弹出指定的key关联的链表中的第一个元素,即头部元素,如果该key不存在,则返回(nil),若key存在,则返回链表的头部元素
rpop key
返回并弹出指定的key关联的链表中的最后一个元素,即尾部元素,如果该key不存在,则返回(nil)若key存在,则返回链表的尾部元素
注意:redis是不会保留空字符串,空键值对的
三.list的扩展命令
获取列表中的元素个数
llen key
返回指定的key关联的链表中的元素数量
删除某个元素(效率极为低下,了解即可)
lrem key count value
删除count个值为value的元素,如果count大于0,从头到尾遍历并删除count 个值为value的元素;如果count小于0,从尾到头遍历并删除count个值为value的元素;如果count等于0,则删除链表中所有等于value的数据
通过索引替换元素(效率不高)
lset keyindex value
设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素,操作链表的脚标,不存在则抛异常
在索引前/后插入元素(效率不高)
linsert key before/after pivot value
在pivot元素前或者后插入value这个元素
做任务队列需要
rpoplpush resource destination
将链表中的尾部元素弹出并添加到头部(可以循环操作)
例如:
两排队列
rpoplpush list1 list2
把list1中的尾部元素弹出,并添加到list2
循环列表
rpoplpush list1 list1
把list1中的尾部元素弹出,添加到list1的头部