【Redis学习】:list数据类型详解

list数据结构
在redis中,list数据结构是按照插入顺序的字符串链表,和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库删除,list中可以包含最大元素数是4294967295.
从元素插入和删除的效率来看,如果我们是在链表的两头插入或删除元素时,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成,然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。
1、ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要涉及到位移操作,所以比较慢。
2、LinkedList使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可。速度非常快,然后通过下标查询元素需要从头开始索引,所以比较慢。
3、双向链表增加数据
【Redis学习】:list数据类型详解_第1张图片
4、双向链表删除数据
【Redis学习】:list数据类型详解_第2张图片
常用命令
两端添加
lpush key values[value1 value2 ...]
在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据,插入成功,返回元素的个数。

rpush key values[value1 value2 ...]
在该list的尾部添加元素

查看链表
lrange key start end
获取list中从start到end的元素的值,start、end从0开始计数,也可以是负数,若为-1则表示list尾部的元素,-2则表示倒数第二个,以此类推...
【Redis学习】:list数据类型详解_第3张图片
另一个
【Redis学习】:list数据类型详解_第4张图片
两端弹出
lpop key
返回并弹出指定的key关联的list中的第一个元素,即头元素,如果该key不存在,返回null,若key存在,则返回list的头部元素。
【Redis学习】:list数据类型详解_第5张图片
rpop key
从尾部弹出元素
【Redis学习】:list数据类型详解_第6张图片
获取列表中元素的个数
llen key
返回指定的key关联的list中的元素的个数
【Redis学习】:list数据类型详解_第7张图片
lpushx key value
仅当参数中指定的key存在时,向关联的list的头部插入value,如果不存在,将不进行插入。
【Redis学习】:list数据类型详解_第8张图片
rpushx key value
在该list的尾部添加元素
【Redis学习】:list数据类型详解_第9张图片
lrem key count value
删除count个值为value的元素,如果count大于0,从头向尾比那里并删除count个值为value的元素,如果count小于0,则从尾部遍历并删除,如果count等于0,则删除list中所有等于value的元素、
【Redis学习】:list数据类型详解_第10张图片
lset key index value
设置list中的index的下标的元素值,0代表list的头元素,-1代表list的尾元素,操作列表的下标不存在抛出异常。
【Redis学习】:list数据类型详解_第11张图片
linsert key before|after pivot value
在pivot元素前或者后插入value这个元素
在第一个3之前插入4
【Redis学习】:list数据类型详解_第12张图片
在第一个3之后插入5
【Redis学习】:list数据类型详解_第13张图片
rpoplpush resource destination
list中的尾部元素弹出并添加到头部,这是一个循环操作
将mylist右端弹出,压入到mylist1左端
【Redis学习】:list数据类型详解_第14张图片
将mylist右端弹出,压入到mylist左端
【Redis学习】:list数据类型详解_第15张图片
使用场景
rpoplpush的使用场景
redis的list经常会被用于消息队列的服务,以完成多程序之间的消息转换,假设一个应用程序正在执行lpush操作向列表中添加新的元素,我们通常将这样的程序称之为生产者(Producer),而另一个应用程序正在执行rpop操作从list中取出元素,我们称这样的程序为消费者(Consumer)。如果此时,消费者程序取出消息元素后立即奔溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能导致业务数据丢失,或业务状态的不一致等现象的发生。直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份列表中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
【Redis学习】:list数据类型详解_第16张图片



你可能感兴趣的:(Redis,MySQL从入门到精通)