redis 数据结构之链表 List
为了解释 List 数据类型,最好从一点理论开始,因为术语 List 经常被信息技术人员以不正当的方式使用。例如,“Python Lists” 不是名称所暗示的(Linked Lists),而是Arrays(实际上相同的数据类型在 Ruby 中称为 Array)。
一般看来,List 只是一系列有序元素。例如:10,20,1,2,3 是一个 List。但是使用 Array 实现的 List 的属性与使用 Linked List 实现的 List 的属性有很大区别。
Redis 的 List 通过 Linked List 实现。这意味着即使List中有数百万个元素,在 List 的头部或尾部添加新元素也会在常量时间内。使用 LPUSH 命令将新元素添加到一个具有十个元素的 List 的头部的速度与将具有 1000 万个元素的元素添加到 List 头部的速度相同。
由链表实现的 List 有什么缺点?在使用Array(常量时间索引访问)实现的 List 中,通过索引访问元素非常快,而在由链表实现的 List 中则不是那么快(其中操作需要与所访问元素的索引成比例的工作量)。
Redis List 使用 Linked List 实现,因为对于数据库系统,能够以非常快的方式将元素添加到很长的 List 中是至关重要的。正如您稍后将看到的那样,Redis Lists 可以在恒定时间内保持恒定长度。
当需要快速访问大量元素集合的中间位置时,可以使用不同的数据结构,称为排序集(Sorted sets)。排序集将在本教程后面介绍。
1. 使用 Redis List的第一步
LPUSH 命令将新元素添加到左侧(头部)的 List 中,而 RPUSH 命令将新元素添加到右侧(尾部)的 List 中。最后,LRANGE 命令从List中提取元素范围:
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1 // 这里使用 0 -1 表示显示所有元素,注意是