说您正在跟踪游戏中玩家的分数。每个播放器的名称,您将分数关联。我很高兴总是知道谁是前50名左右的球员,并且如果排名更改,则获得更新。
要实现此类功能,我们可以使用Redis排序的设置数据结构,pub/sub和graphql订阅。
这篇文章与前一个帖子,称为**Redis as a Database — Live Data Updates With PubSub and GraphQL Subscriptions **,因此我强烈建议您先检查一个。
tl; dr
我正在使用可视化器,**我的宠物项目我在以前的有关Redis的帖子中谈到了这一点,以展示如何实现排行榜。它的要旨是**可视化器从Twitter的V2 API摄入推文,并在Redis实例中在本地存储它们。使用REDIS的许多功能,可视化器提供了一组不错的功能,包括排行榜(尽管在可视化器中它称其为不同)。
算法:不断跟踪排行榜的顶部,将当前版本与上一个版本进行比较,并发布更新,以防有差异。
排名的主题标签
在可视化器中,而不是游戏排行榜,我会跟踪摄入推文中使用的所有主题标签。主题标签根据其频率进行排名,即,他们使用的越越越高。前端可以订阅带有GraphQL订阅的顶部 标签。当顶部 n 主题标签发生变化时,即某些主题标签的等级,前端将收到具有当前顶部 n的更新 hashtags。
后端
可视化器API 和可视化器摄入都参与提供顶部 n 的最新列表主题标签。
每当前端订阅顶部 n 通过GraphQL订阅订阅标签时,可视化器API 都会跟踪订阅数量和订阅对象。
同时,可视化器摄入可能正在摄取推文。首先将每个遇到的主题标签添加到标签排序的集合中,该集合会自动对其进行排名,然后在 hashtagranked pub/sub Channe中发布该主题标签。
回到可视化器API 中,每次排名的主题标签消息都到达 hashtagranked *通道时,每个订户都会在必要时进行更新。对于每个订户,计算了包含前面* n **主题标签的排序集的键。然后,将每个 presotrankedhashtagsforamount:n 排序的集合与当前的顶部 n hashtag从 hashtags 排序的集合进行了比较。 In case a discrepancy between the current top n hashtags and the previous top n hashtags is detected, then the current顶部 n 主题标签已发布到GraphQL订阅中,并且 presotrankedhashtagsforamount: n * 排序设置**被当前值覆盖。
**注意*:可能有一种更有效的方法检查是否必须使用ZDIFF/ZDIFFSTORE将更新发送给订户(请参阅All sorted set command),但我没有尝试过。让我知道您是否对此感兴趣。
要完成后端部分,让我们看一下GraphQL订阅定义。
订阅 toprankedhashtags 在 getrankedhashtagsobservable(â€�)中处理_t* weethashtagservice.getToprankedhashtagsevice.getToprankedHashtagSsoBservable(量) (请参阅第一个代码要素)。
前端
可视化器前端使用优秀的阿波罗客户端与graphql-codegen一起使用GraphQl API时的生活更轻松。
首先,前端检索当前的顶部 n 主题标签,以便它可以显示一些东西。
但是,GraphQl-Codegen没有手动调用此查询,而是生成一个我可以调用的漂亮小钩子
接下来,前端订阅 toprankedhashtags。
看起来像这样的钩子
从这里开始,没有什么超级有趣的事情发生。每当可以从订阅中获得新数据时, usetoprankedhashtagschangedsubscription hook hook触发了重新渲染,并且当前数据显示在单词云中 - 固定链接到整个组件https://github.com/mariusmuntean/VisualizerFrontend/blob/8db3b9f1770b9ea74a60ac88fedc4a89c0301e71/src/components/rankedHashtagsChanged/liveRankedHashtags.tsx#L1301111
因此,诸如实时更新排行榜之类的功能的本质是利用Redis分类集以获取数据的最新视图并将其与以前的状态进行比较。
感谢您的阅读。如果您喜欢这个锅,请给它一个!this,然后跟随我与Redis保持最新状态。