Redis的List的应用场景

时间:2024-03-18 15:24:22

一、概述

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命令阻塞式的争抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用;

Redis的List的应用场景

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的应用场景时会详细介绍实时计算的排行榜的实现。