list是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,可以在链表的左右两边分别操作(反向查找和遍历等),所以也称为“双向链表”,不过也带来了部分额外的内存开销,redis内部的很多实现,同时,如果是在链表的两头插入或删除,会非常高效,但是要是这些操作在链表的中间,那就比较低效了。
在插入时,若该key值不存在,redis将为该键创建一个新的链表。若链表中所有的元素都被移除,该键也会被数据库中删除。一个列表最多可以包含 232 - 1 个元素
常用命令lpush,rpush,rpop,lrange,blpop(阻塞版)等
应用1、消息队列的服务,完成多程序之间消息交换
假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。是不是特别像操作系统中的pv操作。如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
2、实现最新消息排行
如:Twitter的关注列表和粉丝列表,就可以用这个list来实现
在添加数据的时候,可以在原先添加的顺序访问数据,不需要再用sql order by操作,所以会非常快,容易扩展到百万级别的元素;在博客引擎实现中,可以为每篇日志设置一个list,在list中推入进博客评论。
3、要指定长度
> rpush mylist 1 2 3 4 5
(integer) 5
> ltrim mylist 0 2
OK
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
存入的形式
就是存放pre和next两个指针,以及节点的一些相关信息。每增加一个节点,重新分配一块内存。
(这里关于redis的每一篇文章,都是初稿,因为小编还在研究中,会不断更新的)