Folks, please disregard my previous email. I confused the range search task
when (the search boundaries are defined in a query) with the K largest
elements problem described by Vladimir.

Personally, I don't think there is a practical need for partitioned sorted
sets. Even if you store thousands of scores in a sorted set it will fit and
perform nicely on a single node. If a read rate is high, then you can keep
a full copy of the set on 2, 3, etc. nodes and load balance reads among
the replicas.

It should not be challenging to support such a data structure in Ignite.
Rough idea:

   - You store a sorted set by a unique key in our system cache (or
   whenever we keep other data structures).
   - Configure a number of full replicas for the set across the cluster (if
   you want to load balance reads).
   - Updates: it might be too expensive to use Java SortedSet as the actual
   data structure on the nodes due to frequent serialization<->deserialization
   on updates. We can think of our version.
   - Reads: we need to figure out how to load balance reads across
   replicas. A naive approach can use some round-robin algorithm on the
   client-side. For instance, imagine we introduced IgniteSortedSet API and
   the client calls IgniteSortedSet.range(start, end) method. Internally,
   IgniteSortedSet implementation can maintain a variable that keeps an id of
   a server node whose turn is to serve the next request; the variable gets
   updated in the round-robin fashion.

Btw, Redis SortedSet is not scalable or partitioned, and that's not a big
deal:
https://stackoverflow.com/questions/6948492/will-rediss-sorted-sets-scale

-
Denis


On Fri, Sep 4, 2020 at 2:36 PM Valentin Kulichenko <
valentin.kuliche...@gmail.com> wrote:

> Hi Vladimir,
>
> As far as I know, Redis' SortedSet is not shared. Is this correct? Is it
> even possible to support similar functionality for a partitioned dataset?
>
> -Val
>
> On Fri, Sep 4, 2020 at 8:58 AM Denis Magda <dma...@apache.org> wrote:
>
> > Hi Vladimir,
> >
> > Usually, LSM-storage engines serve the range searches the best (Cassandra
> > is one of the examples). The SortedSet of Redis is one of the typical
> > components you can find in LSM-engines.
> >
> > Presently, Ignite neither supports an LSM store nor a SortedSet data
> > structure. However, the range searches with Ignite still have O(log(n))
> > complexity, it just takes more steps for the B-tree to collect all the
> > records of a range.
> >
> > -
> > Denis
> >
> >
> > On Fri, Sep 4, 2020 at 3:26 AM Vladimir Pligin <vova199...@yandex.ru>
> > wrote:
> >
> > > Hi Igniters,
> > >
> > > It seems that it's not possible to implement effective leader-board
> with
> > > the
> > > current Ignite indexes.
> > > Leader-board stores a score and an id of a player of some game. Score
> is
> > > indexed. One of the possible requests to that data structure is to get
> > some
> > > range of scores based on their rank (it's effectively a number of a
> > row). I
> > > suppose it's required for pagination. For example Redis has an index
> > > (https://redis.io/topics/data-types#sorted-sets) that can be scanned
> > > (https://redis.io/commands/zrange) to a particular line with O(log(n))
> > > complexity. As far as I know it's node-local. Correct me if I'm wrong
> but
> > > in
> > > Ignite we scan an index until we find a row corresponding to a
> > limit/offset
> > > clause. It looks like a linear complexity. I suppose it could be
> possible
> > > to
> > > implement it for REPLICATED caches and local queries. But it's really
> > > difficult for me to estimate the efforts. By the way it would be useful
> > for
> > > analytical tools, most of them paginate. So what do you think is it
> > > possible
> > > to make that happen in Ignite and do we need it at all? Ignite 3.0
> maybe?
> > >
> > >
> > >
> > > --
> > > Sent from: http://apache-ignite-developers.2346864.n4.nabble.com/
> > >
> >
>

Reply via email to