用于redis的hazelcast和apache ignite模拟

q1qsirdb  于 2021-06-08  发布在  Redis
关注(0)|答案(3)|浏览(457)

我用redis的排序集为游戏建立了快速的排行榜解决方案。我的任务需要两个主要的查询操作:
从索引a到索引b按降序获取元素及其得分(redis中的zrevrange)
按降序获得特定元素的索引和分数(redis中的zrevrank)
据我所知,redis对排序集使用特殊的数据结构,它结合了某种跳过列表和哈希表。
现在我想从redis迁移到现代imdg解决方案,在hazelcast和apacheignite之间进行选择。hazelcast/apacheignite中redis排序集和zrevrange、zrevrank操作的最相似之处是什么?

mm5n2pyu

mm5n2pyu1#

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

uqjltbpv

uqjltbpv2#

似乎可以在中利用查询实体 Apache Ignite . 这里有一个原始的例子。

<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 无论如何,可以重新配置。模式来自缓存名称。例如:

SELECT * FROM "testCache"."USERINFO" WHERE SCORE > ? AND SCORE < ?;

它将进行范围索引扫描。你可以运行一个 EXPLAIN 命令来检查正在使用的索引(在本例中,我们有两个索引)。

explain SELECT * FROM "testCache"."USERINFO" WHERE SCORE > ? AND SCORE < ?;
pexxcrt2

pexxcrt23#

在imdg这样的分布式系统中实现排行榜似乎是一项非常复杂的任务。如果我错了,请纠正我,但是zset更像是一个本地的东西 Redis ,你不能有一个排序集大于你最大的碎片。我想把这个问题分为两种情况:本地和分布式。
本地的。总的来说 Ignite 它可以通过复制缓存来实现。可以使用本地 SQL 查询 LIMIT/OFFSET 但据我所知没有禁食( O(log(n) )索引跳转以开始从具有特定数字的某行进一步扫描。这样就不可能实现系统的整体复杂性 O(log(n) + m) 哪里 m 是窗口大小。从理论上讲,这是有可能实现的。我已经开始讨论“apacheignite开发人员”列表。不管怎样,这都取决于你的实际用例:你有多少用户,目标延迟是多少,百分位数等等。
分发。在这里,它变得更为复杂,因为无法保证在分区缓存的情况下,它足以从每个具有来自的列组的节点获取值 ab 因为数据分布(将密钥Map到节点的相似性)可能不是绝对均匀的。这意味着您需要扫描每个节点上的整个索引,直到到达 b (或上述最接近值)。

相关问题