list类型的应用场景 —— Redis实战经验

  

  list类型是简单的字符串列表,按照插入顺序排序。每一个列表最多能够存储 232 - 1 个元素(40多亿) ,list类型主要有如下应用场景。。html

  1. 消息队列redis

  list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而能够用Redis的list类型实现简单的点对点的消息队列。不过我不推荐在实战中这么使用,由于如今已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深刻地理解消息队列,否则我以为不必去重复造轮子。htm

  2. 排行榜blog

  list类型的lrange命令能够分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,经过page和size分页获取打擂金曲。(打个小广告,酷狗音乐“K歌擂台赛”天天都能产生一批优质翻唱做品,对普通人优质歌声有兴趣的朋友不妨来听听)。排序

    

  可是,并非全部的排行榜都能用list类型实现,只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜,以后在介绍有序集合sorted set的应用场景时会详细介绍实时计算的排行榜的实现。接口

  3. 最新列表队列

  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类型如何实现最新列表。字符串

 

  那么问题来了,对于排行榜和最新列表两种应用场景,list类型能作到的sorted set类型都能作到,list类型作不到的sorted set类型也能作到,那为何还要使用list类型去实现排行榜或最新列表呢,直接用sorted set类型不是更好吗?缘由是sorted set类型占用的内存容量是list类型的数倍之多(以后会在容量章节详细介绍),对于列表数量很少的状况,能够用sorted set类型来实现,好比上文中举例的打擂金曲排行榜,天天全国只有一份,两种数据类型的内存容量差距能够忽略不计,可是若是要实现某首歌曲的翻唱做品地区排行榜,数百万的歌曲,300多个地区,会产生数量庞大的榜单,或者数量更加庞大的朋友圈点赞列表,就须要慎重地考虑容量的问题了。get

 

  list类型的经常使用命令可参考http://www.runoob.com/redis/redis-lists.html

 

  加入list类型的应用场景后的思惟导图以下。

   

相关文章
相关标签/搜索