一、概述
Redis中列表(list)类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储2^32 - 1个元素。
在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,可以充当栈和队列的角色,在实际开发中有很多应用场景。
列表类型有以下特点:
-
列表中的元素是有序的,即可以通过索引下标获取某个元素或者某个范围内的元素列表;
-
列表中的元素可以是重复的;
二、常用命令
1.添加操作:
-
rpush key value [value...]:从右边插入元素;
-
lpush key value [value...]:从左边插入元素;
-
linsert key before | after pivot value:向某个元素前/后插入元素,返回结果为当前列表长度;
2.查找操作:
-
lrange key start end:获取指定范围内的元素列表;如lrange key 0 -1,获取列表全部元素;
-
lindex key index:获取列表指定索引下标的元素,如lindex key -1,获取最后一个元素;
-
llen key:获取列表长度;
3.删除操作:
-
lpop key :从列表左侧弹出元素;
-
rpop key :从列表右侧弹出元素;
-
lrem key count value:lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况;
-
count>0,从左到右,删除最多count个元素;
-
count<0,从右到左,删除最多count绝对值个元素;
-
count=0,删除所有元素。
-
-
ltrim key start end:按照索引范围修建列表,相当于切片操作。
4.修改操作:
- lset key index newValue:修改指定下标的元素
5.阻塞操作:
阻塞式弹出:
-
blpop key [key ...] timeout
-
brpop key [key....] timeout
三、应用场景
1、消息队列
l如下图所示,Redis的lpush + brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的争抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用;
2、最新列表
list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。
但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现。对于需要分页并且会频繁更新的列表,需用使用有序集合sorted set类型实现。另外,需要通过时间范围查找的最新列表,list类型也实现不了,也需要通过有序集合sorted set类型实现,如以成交时间范围作为条件来查询的订单列表。之后在介绍有序集合sorted set类型的应用场景时会详细介绍sorted set类型如何实现最新列表。
3、排行榜
list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。
但是,并不是所有的排行榜都能用list类型实现,只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜,之后在介绍有序集合sorted set的应用场景时会详细介绍实时计算的排行榜的实现。