阿里云Redis典型场景:如何构建可扩展通用排行榜系统

摘要

本文主要介绍通用排行榜的需求功能,并介绍了基于Redis的ZSET数据结构的排序方法,另外探讨了通用排行榜的架构及用户如何通过阿里云Redis解决通用排行架构的技术问题。

背景

移动互联网时代的春风刮来了各种不同的业务场景,直播元年、短视频元年、类微博信息流、各种电商业务也在这个移动互联网快车上集中爆发。在这些业务中信息成为了各种场景的关键,而信息的价值往往隐藏在各种排行中,对于一个直播大V可能关注直播人数的排行榜,因为他希望萃取他家长处;对于一个商家可能关注商品浏览排行榜,因为他希望更好的区做店铺引流;对于一个游戏用户他可能关注自己在某一个群组的排行榜,因为他希望他喜欢的人能关注到他名列前茅。以此我们希望在这个文章中探讨一个基于阿里云Redis的可扩展通用的排行榜系统构建的方法。

排行榜特性

排行榜看起来简单,实际上对于通用的排行榜系统具有很高的复杂度和系统能力要求。排行榜系统首先需要定义数据源,不同数据对于排行榜系统也有不同的能力要求,我们总结了一下排行榜的特点。

排行精确性

如果一个排行榜的结果关系到用户的权益问题,这个时候一个排行榜的精确性就需要非常高,比如一个运营同学进行了根据微博转发数量的营销活动,这个时候微博转发数量的排行榜就需要非常精确,否则会影响用户权益的分发。

排行榜实时性

游戏和社交互动的结合是目前的趋势,对于热门游戏的排行是用户的关注重点,在这部分用户中对于排行的实时性有很高的要求,如果一个用户升级了自己的装备和能力,而自己的排名一直没有更新,那这个用户一定要非常伤心抛弃这个游戏了。所以通过离线计算等平台来构建一个非实时的排行榜系统就不太适合这样的模型。

排行榜功能自定义

在排行系统中有些用户只需要定期对数据进行更新即可,所以我们在排行榜系统中需要提供自定义的功能,让用户可以定义排序的周期,可以按照小时、日、周不同的周期对数据进行处理,用户再进行简单配置之后可以生成对应的排行榜单。

海量数据排行

海量数据是目前的一个趋势,比如对于淘宝全网商品的一个排行,这个榜单将会是一个亿级别的,所以我们设计的榜单也需要具备弹性伸缩能力,同时在对海量数据进行排行的时候拥有一定的实时性。

排行算法

在排行系统中我们选用Redis提供的ZSET作为基础的数据结构,ZSET是一个有序的数据集合,在这个数据集合中用户可以添加不同SCORE值的MEMBER,并且用户可以通过接口对这些有序集合根据SCORE值进行排序。ZSET这样的数据结构可以很方便的用于排行榜系统中。
假设我们需要对一个动物运动会的比赛成绩做一个排序,我们先简单的构造一个ZSET的KEY,并添加每种动物的成绩。Redis命令如下:

$redis-cli -p 10391
# dog的分数为98,我们通过调用zadd进行添加
127.0.0.1:10391> zadd rank 98 dog
# Redis后端返回添加成功元素个数
(integer) 1
# cat的分数为80,我们通过调用zadd进行添加
127.0.0.1:10391> zadd rank 80 cat
# Redis后端返回添加成功元素个数
(integer) 1
# rabbit分组为95,我们通过调用zadd进行添加
127.0.0.1:10391> zadd rank 95 rabbit
# Redis后端返回添加成功元素个数
(integer) 1
# tiger分组为100,我们通过调用zadd进行添加
127.0.0.1:10391> zadd rank 100 tiger
# Redis后端返回添加成功元素个数
(integer) 1

添加完成每个商家的销售额之后,我们可以调用Redis的zrange命令进行排序获取指定排名的商家,Redis命令如下:

$redis-cli -p 10391
# 通过调用zrevrange命令返回排行榜信息
27.0.0.1:10391> zrevrange rank 0 3 withscores
1) "tiger"
2) "100"
3) "dog"
4) "98"
5) "rabbit"
6) "95"
7) "cat"
8) "80"

如下显示了ZSET相关的命令使用方法

  • ZADD key score1 member1 [score2 member2]
    添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
  • ZCARD key
    得到的有序集合成员的数量
  • ZCOUNT key min max
    计算一个有序集合成员与给定值范围内的分数
  • ZINCRBY key increment member
    在有序集合增加成员的分数
  • ZINTERSTORE destination numkeys key [key …]
    多重交叉排序集合,并存储生成一个新的键有序集合。
  • ZLEXCOUNT key min max
    计算一个给定的字典范围之间的有序集合成员的数量
  • ZRANGE key start stop [WITHSCORES]
    由索引返回一个成员范围的有序集合。
  • ZRANGEBYLEX key min max [LIMIT offset count]
    返回一个成员范围的有序集合(由字典范围)
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
    按分数返回一个成员范围的有序集合。
  • ZRANK key member
    确定成员的索引中有序集合
  • ZREM key member [member …]
    从有序集合中删除一个或多个成员
  • ZREMRANGEBYLEX key min max
    删除所有成员在给定的字典范围之间的有序集合
  • ZREMRANGEBYRANK key start stop
    在给定的索引之内删除所有成员的有序集合
  • ZREMRANGEBYSCORE key min max
    在给定的分数之内删除所有成员的有序集合
  • ZREVRANGE key start stop [WITHSCORES]
    返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分
  • ZREVRANGEBYSCORE key max min [WITHSCORES]
    返回一个成员范围的有序集合,按分数,以分数排序从高分到低分
  • ZREVRANK key member
    确定一个有序集合成员的索引,以分数排序,从高分到低分
  • ZSCORE key member
    获取给定成员相关联的分数在一个有序集合
  • ZUNIONSTORE destination numkeys key [key …]
    添加多个集排序,所得排序集合存储在一个新的键
  • ZSCAN key cursor [MATCH pattern] [COUNT count]
    增量迭代排序元素集和相关的分数

通用排行榜系统架构

对于一个通用性的排行榜系统,我们需要对服务进行Qos保证,为了达到服务分级Qos保证的能力,我们引入MetaQ或者Kafka等组件进行数据的接入,整体系统功能如下。

对于排行榜系统每个系统存在存储和计算两个流程,原始数据的存储可以选择MYSQL进行存储,计算排行阶段选择了阿里云Redis进行排行计算。阿里云Redis具有主从、集群、读写分离、异地多活等形态的产品,我们可以随着业务的变化进行灵活的更改配置。整个排行版的数据流图如下。

热点读问题

对于热门排行的榜单可以选用阿里云Redis读写分离来解决单个榜单的读问题。

海量榜单问题

对于海量榜单的需求可以选用阿里云Redis的集群版本,阿里云Redis集群版本的容量可以达到TB级别,并且可以轻松扩容,可以按照自愿使用量进行弹性伸缩。

单元化问题

对于单元化的榜单,可以选用阿里云Redis的多中心方案,配置一个中心的写入,多个中心的读取,阿里云Redis提供的BLS服务可以轻松搭建两个中心的同步通道。

总结

本文主要对基于阿里云Redis的通用排行榜系统的构建进行了探讨,详细介绍了如何利用Redis的ZSET进行常用的数据排行,另外对通用排行榜系统的功能及数据流程进行了探讨,并介绍了不同场景下可以选用的阿里云Redis产品。为了方便用户交流开源和Redis技术我们也建立了Redis交流钉钉群,欢迎有兴趣的同学移步这里加入,另外也欢迎大家使用阿里云Redis服务。对于有兴趣从事云数据库内核或者管控相关工作可以移步这里,欢迎C++/JAVA/GOLANG/PYTHON等各种开发人才加盟。

时间: 2024-11-10 01:11:30

阿里云Redis典型场景:如何构建可扩展通用排行榜系统的相关文章

如何用阿里云Redis构建高性能在线广告系统

摘要 本文主要介绍在线广告系统,以及如果使用阿里云Redis方便快捷的构建大数据量,低延迟的在线广告服务. 背景 在线广告作为互联网最主要的盈利模式之一,支撑着互联网行业的发张.早期的在线广告主要是展示广告,和在报纸,期刊上刊登广告相似.通过建立个性化数据,Google推出了AdSense产品,通过AdSense的合作网站,采集到访客在这些网站的访问足迹,并利用这些数据提高其广告的相关性:以Facebook为代表的社交网络由于具备了完善的用户个性化数据,利用这些数据,网站可以将定向技术使用到展示

阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

阿里云数据库全新功能Redis读写分离,全维度技术解析 https://yq.aliyun.com/articles/277325 文末有彩蛋,请务必记得看完整哦 背景 秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台知名度.一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而提升秒杀活动的最大价值.本次主要讨论阿里云云数据库Redis缓存设计高并发的秒杀系统. 秒杀的特征 秒杀活动对稀缺或者特价的商品进行定时

阿里云Redis助力互联网+新媒体

    互联网+时代,传统媒体正在积极尝试各种方式拥抱互联网,实践全媒体融合新模式.行业不断涌现多元化的栏目内容,探索嘉宾观众实时互动新模式,增强用户参与度,增强用户粘性,提高用户观看时长.      阿里云Redis云数据库帮助企业以数据为基础,实现高可靠.高稳定的互联网+基础数据服务平台,为多媒体化晚会.活动互动评论.摇一摇红包.咻一咻等场景提供完美解决方案.     目前,众多行业客户已经选择阿里云Redis云数据库承载核心应用.央视CCTV利用Redis承载款跨年晚会的用户互动评论及红包

干货来袭!Redis技术盛宴——阿里云Redis交流会火热召开

    2016年5月15日,阿里云Redis用户交流会在阿里巴巴北京国家广告园办公区万松书院火热召开,来自各个行业的Redis技术爱好者齐聚一堂,共同交流探讨最前沿的Redis技术,分享最干货的Redis应用案例.我们邀请到了阿里云数据库产品线的各位大咖,新浪微博的资深专家,CCTV的数据库技术核心成员,高德的数据库技术专家等行业大牛为大家做精彩分享. 阿里云Redis发展历程及未来展望--阿里云数据库产品总监  何云飞(何导)     何导主要介绍了Redis项目的发展历程及本次会议的主要目

阿里云Redis LUA脚本功能上线——轻量嵌入,极速扩展,业务轻松跨平台

    阿里云Redis云数据库,全面支持LUA脚本功能,助力企业轻松迁移自建Redis数据库的业务逻辑,实现业务的跨平台复用,快速驱动业务上云.LUA语言作为目前最流行的轻量级嵌入式脚本语言,凭借其语法简单.高效稳定.支持复杂数据结构以及自动内存管理等特点,已经在众多著名的游戏程序中大量被使用,如:愤怒的小鸟.星际争霸.魔兽世界等. 了解Redis详细配置及价格>> Redis支持LUA脚本的主要优势      LUA脚本的融合将使Redis数据库产生更多的使用场景,迸发更多新的优势: 高效

解密阿里云Redis助力双十一背后的技术

双11如火如荼的结束了,阿里云Redis(ApsaraDB for Redis原KVStore)也圆满完成了双11Redis的保障工作.目前阿里云Redis提供了单机版本和集群版本的Redis. 单机版本Redis具有很高的兼容性,并且支持Lua脚本及地理位置计算. 集群版本具有大容量.高性能的特性,能够突破Redis单线程的单机性能极限. 阿里云Redis默认双机热备并提供了备份恢复支持,同时阿里云Redis源码团队持续对Redis进行优化升级,提供了强大的安全防护能力.本文将选取双11的一些

阿里云Redis加速Typecho博客访问

写在开始 一不小心,博主趁着阿里云搞活动,一口气把Redis服务续费了3年(到期时间:2021-05-03,不知那时候博客是否健在?) 尽管只有小小256MB的容量,但是对于目前网站的访问量来说已足矣了. 继上次,论坛加速飞起来之后,缓存也就用了区区的50MB+左右,很显然是有点浪费了. 前几日,博客也上了把安全套(HTTPS),提升了逼格并小小的装逼了一下.都说加S会影响网站的速度,显然这是毋庸置疑的.尽管很早就上了阿里云智能CDN,显然挡不住我追求速度的极限. 突然,又好想装逼了. 相关环境

阿里云Redis加速Discuz论坛访问

写在开始 由于阿里云ECS服务器内存只有悲催的的1G,并且只剩下了几十MB,实在不想再糟蹋她了. 你是否还在为网站访问速度而苦恼,你是否还在恐惧全国各地而来的访客.不用慌.不用怕 阿里云Redis为你保驾护航排忧解难,在这互联网的冬天让你依靠温暖的胸膛. 不要699,不要299,一年只需要99,没错你没听错.只要99元 完美缓存领回家!99元你买了不吃亏,99元你买了也不上当.不要怀疑你的眼睛,先到先得,只要99元 全能Redis领回家,不用你接不用你送,一键购买服务直达.尽管只有256MB,但

Redis · 最佳实践 · 阿里云Redis助力双11业务

双11如火如荼的结束了,阿里云Redis(ApsaraDB for Redis原KVStore)也圆满完成了双11Redis的保障工作.目前阿里云Redis提供了单机版本和集群版本的Redis. 单机版本Redis具有很高的兼容性,并且支持Lua脚本及地理位置计算. 集群版本具有大容量.高性能的特性,能够突破Redis单线程的单机性能极限. 阿里云Redis默认双机热备并提供了备份恢复支持,同时阿里云Redis源码团队持续对Redis进行优化升级,提供了强大的安全防护能力.本文将选取双11的一些