我用redis的排序集为游戏建立了快速的排行榜解决方案。我的任务需要两个主要的查询操作:
从索引a到索引b按降序获取元素及其得分(redis中的zrevrange)
按降序获得特定元素的索引和分数(redis中的zrevrank)
据我所知,redis对排序集使用特殊的数据结构,它结合了某种跳过列表和哈希表。
现在我想从redis迁移到现代imdg解决方案,在hazelcast和apacheignite之间进行选择。hazelcast/apacheignite中redis排序集和zrevrange、zrevrank操作的最相似之处是什么?
3条答案
按热度按时间mm5n2pyu1#
在hazelcast中,您可以创建
IndexType.SORTED
. 请查看相关文档,hazelcast参考手册:索引查询。uqjltbpv2#
似乎可以在中利用查询实体
Apache Ignite
. 这里有一个原始的例子。之后就可以使用常规的
SQL
从缓存中获取数据的查询。表名将是"USERINFO"
因为它是从类型名继承的:UserInfo
无论如何,可以重新配置。模式来自缓存名称。例如:它将进行范围索引扫描。你可以运行一个
EXPLAIN
命令来检查正在使用的索引(在本例中,我们有两个索引)。pexxcrt23#
在imdg这样的分布式系统中实现排行榜似乎是一项非常复杂的任务。如果我错了,请纠正我,但是zset更像是一个本地的东西
Redis
,你不能有一个排序集大于你最大的碎片。我想把这个问题分为两种情况:本地和分布式。本地的。总的来说
Ignite
它可以通过复制缓存来实现。可以使用本地SQL
查询LIMIT/OFFSET
但据我所知没有禁食(O(log(n)
)索引跳转以开始从具有特定数字的某行进一步扫描。这样就不可能实现系统的整体复杂性O(log(n) + m)
哪里m
是窗口大小。从理论上讲,这是有可能实现的。我已经开始讨论“apacheignite开发人员”列表。不管怎样,这都取决于你的实际用例:你有多少用户,目标延迟是多少,百分位数等等。分发。在这里,它变得更为复杂,因为无法保证在分区缓存的情况下,它足以从每个具有来自的列组的节点获取值
a
至b
因为数据分布(将密钥Map到节点的相似性)可能不是绝对均匀的。这意味着您需要扫描每个节点上的整个索引,直到到达b
(或上述最接近值)。