滚动排行榜与一般排行榜的最大区别在于数据的存储和查询方式。在一般排行榜中,起始点是固定的,例如某一周或某一个月,存储和查询时的时间范围也是固定的。而滚动排行榜则不同,在滚动排行榜中,榜单的取值范围是随着时间的变化而不断变化的。
对于常用的Redis实现方案来说,如果是固定排行榜,我们只需要在每个固定的时间点将数据存入相应的Key中,查询时只需使用一条命令即可获取。因为在同一时间段内的任何一天都属于同一个周期。
然而,对于滚动排行榜,比如近7天榜,每次查询时都需要对今天及前6天的数据进行聚合计算才能得到最新的排行榜结果。在这种情况下,仅仅使用固定的Key无法解决问题,因为数据的存储和查询方式都需要特殊处理,以确保数据能够快速可用。
具体来说,在实现滚动排行榜时,我们可以采取以下策略:
1.存储方式:使用有序集合 (Sorted Set)存储每个时间点的排行榜数据,按照时间顺序存储,最新的数据排在前面。
2.数据更新:每次有新的数据需要加入排行榜时,先将其存入相应的时间点的有序集合中,然后根据设定的时间范围删除过期的数据,以保持榜单数据的更新和滚动。
3.查询方式:为了获得近7天(或其他时间范围)的排行榜数据,需要将对应时间范围内所有的Sorted Set进行聚合操作,计算出最终的排名结果。
通过这种存储和查询方式,我们能够实现滚动排行榜的功能。但是需要注意,在查询时由于需要对多个有序有序进行聚合计算,可能会对性能造成一定的影响,因此在实际实现中需要进行优化,例如增量计算、缓存等手段来提高查询效率。
实现有序集合的第一种方式:
1. 同时写n天的滚动榜单
实现一个同步写n天滚动榜单的方法,可简单地理解为与固定榜单的实现方式相同。以Redis实现7天滚动方式为例,假设我们每天使用礼物排行榜的键值为"gift_list_cache:20230101",类型选择有序集合 (ZSet)。每当用户获得一个礼物,其对应的价值就会增加,最终用于统计排行榜上主播的总收礼情况。