我们这篇文章开始讲解list类型。
什么是list
list是一个存储空间保存多个数据,底层使用双向链表存储结构实现的一种Redis数据类型,。list类型一般用在存储多个数据,并需要对数据进入存储空间的顺序进行区分的情况下。list的存储方式是一个存储空间保存多个数据,且可以通过数据可体现出数据进入的顺序。
前面提到了双向链表,那么我们就在这里简单的学一下与双向两边类似的另外两种数据结构顺序表和链表 。
- 顺序表
顺序表的结构如下图所示
从上图我们可以看出来,顺序表中数据与数据之间是紧密连接的,因此它能很快的检索数据,但是如果要在某个位置插入一个 新的数据就会很耗时,这是因为要插入新数据的位置的数据及其后面所有数据都要后移一位。 - 链表
链表的结构如下图所示
上图中的黄色部分是存储的数据,绿色部分是指向下一个数据存储位置的指针。这种结构解决了前面我们提到的顺序表所遇到的问题,每次插入新数据时只需要将上一个数据的指针指向新插入数据的位置,并将下一个数据的位置写入到当前写入数据的指针中。但是这种存储结构也存在问题,因为数据与数据之间的间距不同,因此查询数据会慢一些,并且每个数据都要额外的存储指向下一个数据位置的指针,这就增加了内存的开销。同时再插入数据时,因为要更改插入位置的前一个数据指针指向的位置,因此要遍历内存找到前一个数据并修改指针指向的地址,因此对内存的开销也很大。 - 双向链表:
双向链表的结果如下图所示
双向链表比链表多存储了前一个数据位置的指针(图中紫色部分),它解决了链表插入耗内存的问题。
list基本操作
了解完list的相关知识,我们来看一下list的基本操作指令。
- 添加/修改数据
当我们需要对数据进行 添加修改时,可以使用lpush和rpush指令,这两个指令都可以对数据进行添加数据,唯一的区别是,lpush表示从list的左侧添加数据而rpush表示从list的右侧添加数据。以lpush为例,语法是这样的(rpush语法相同)lpush key value1 value2 … valuen,例如我们向name中插入“anna”、“jack”,我们可以这么编写指令lpush name anna jack
- 获取数据
获取数据时可以使用lpush指令,语法是这样的lpush key start stop,其中start表述获取数据的起始位置,stop表获取数据的结束位置,例如我们要获取car的第1个到第4个的数据,我们可以这么编写指令lpush car 0 3
。如果要获取从起始位置到结尾的全部数据,那么我们可以将stop设置为-1。当然如果只需要获取某个数据我们可以使用lindex,语法是这样的lindex key index,index表示要获取的元素的位置,例如要获取car中的第五个数据,指令这么编写lindex car 4
。在开发中有时我们需要获取list中存储的数据的总数,这是我们可以llen指令,语法是llen key。 - 获取并移除数据
当我们需要获取数据并删除数据时可以使用lpop和rpop指令,这两个指令的区别是一个是从左侧获取并删除,另一个是从右侧获取并删除。以lopo为例,当我们需要获取car中的第一个数据时,我们可以这么编写指令lpop car
。
总结
这篇文章我们讲解了list类型和list的基本操作。