Redis的List的应⽤场景
⼀、概述
Redis中列表(list)类型是⽤来存储多个有序的字符串,列表中的每个字符串成为元素(element),⼀个列表最多可以存储2^32 - 1个元素。
在Redis中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是⼀种⽐较灵活的数据结构,可以充当栈和队列的⾓⾊,在实际开发中有很多应⽤场景。
列表类型有以下特点:
列表中的元素是有序的,即可以通过索引下标获取某个元素或者某个范围内的元素列表;
列表中的元素可以是重复的;
⼆、常⽤命令
1.添加操作:
rpush key value []:从右边插⼊元素;
lpush key value []:从左边插⼊元素;
linsert key before | after pivot value:向某个元素前/后插⼊元素,返回结果为当前列表长度;
2.查操作:
redis五种数据结构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 [] 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的应⽤场景时会详细介绍实时计算的排⾏榜的实现。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。