首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hazelcast和Apache模拟Redis得分排序集

Hazelcast和Apache模拟Redis得分排序集
EN

Stack Overflow用户
提问于 2020-09-01 07:48:50
回答 3查看 724关注 0票数 1

我已经使用Redis的排序集为游戏构建了快速的主板解决方案。我的任务需要两个主要的查询操作:

  1. 按降序从指数A到指标B获取元素及其分数(泽夫朗在Redis中)
  2. 按降序获取特定元素的索引和分数(兹雷瓦纳在Redis中)

据我所知,Redis对排序集使用特殊的数据结构,它结合了某种跳过列表和哈希表。

现在,我想从Redis迁移到现代IMDG解决方案,并在Hazelcast和Apache之间进行选择。在Hazelcast/Apache中,与Redis排序集和ZREVRANGE、ZREVRANK操作最相似的是什么?

EN

回答 3

Stack Overflow用户

发布于 2020-09-04 11:55:00

在像IMDG这样的分布式系统中实现领导板似乎是一项非常复杂的任务。如果我错了,请纠正我,但是在Redis中,ZSET是一个更本地的东西,你不能有一个排序集比你最大的碎片更大。我想把这个问题分成两个独立的案例:本地的和分布式的。

  • 本地的。一般来说,在Ignite中,可以通过创建一个缓存复制来实现这一点。可以在SQL中使用本地LIMIT/OFFSET查询,但据我所知,没有快速(O(log(n))索引跳转来从具有特定编号的行开始进一步扫描。这使得不可能实现O(log(n) + m)的总体复杂性,其中m是一个窗口大小。从理论上讲,这是可以实现的。我在"Apache开发人员“列表中启动了讨论。不管怎样,这都取决于你的实际用例:你有多少用户,目标延迟是多少,百分位数等等。
  • 分发。在这里,它变得更加复杂,因为不能保证在分块缓存的情况下,从从ab级别的每个节点获得值就足够了,因为数据分布 (关联映射到节点的键)可能不是绝对均匀的。这意味着您需要扫描每个节点上的整个索引,直到到达b (或最近的值)为止。
票数 1
EN

Stack Overflow用户

发布于 2020-09-01 08:42:47

在Hazelcast中,您可以创建IndexType.SORTED。请查看相关文件,Hazelcast参考手册:索引查询

票数 0
EN

Stack Overflow用户

发布于 2020-09-01 09:25:10

查询实体中使用Apache Ignite似乎是可能的。这是一个原始的例子。

代码语言:javascript
复制
<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="testCache"/>
    <property name="queryEntities">
        <list>
            <bean class="org.apache.ignite.cache.QueryEntity">
                <property name="keyType" value="com.company.ScoreAndId"/>

                <property name="keyFields">
                    <list>
                        <value>score</value>
                        <value>id</value>
                    </list>
                </property>

                <property name="valueType" value="com.company.UserInfo"/>

                <property name="fields">
                    <map>
                        <entry key="score" value="java.lang.Long"/>
                        <entry key="id" value="java.lang.Long"/>
                        <entry key="name" value="java.lang.String"/>
                    </map>
                </property>

                <property name="indexes">
                    <list>
                        <bean class="org.apache.ignite.cache.QueryIndex">
                            <constructor-arg value="id"/>
                        </bean>
                        <bean class="org.apache.ignite.cache.QueryIndex">
                            <constructor-arg>
                                <list>
                                    <value>score</value>
                                    <value>id</value>
                                </list>
                            </constructor-arg>
                            <constructor-arg value="SORTED"/>
                        </bean>
                    </list>
                </property>
            </bean>
        </list>
    </property>
</bean>

在此之后,可以使用常规的SQL查询从缓存中获取数据。表名将是"USERINFO",因为它是从类型名称:UserInfo继承的,无论如何,重新配置可以这样做。架构来自缓存名称。例如:

代码语言:javascript
复制
SELECT * FROM "testCache"."USERINFO" WHERE SCORE > ? AND SCORE < ?;

它将进行范围索引扫描。您可以运行一个EXPLAIN命令来检查所使用的索引(在示例中有两个索引)。

代码语言:javascript
复制
explain SELECT * FROM "testCache"."USERINFO" WHERE SCORE > ? AND SCORE < ?;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63683458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档