Search code examples
performancecachingin-memory-databasekey-value-store

Remote key-value storage allowing indexes?


In our project we already have an embedded in-memory key-value storage for objects, and it is very usable, because it allows us to make indexes for it and query the storage based on it. So, if we have a collection of "Student"s, and a compound index on student.group and student.sex, then we can find all male students from group "ABC". Same for deletion and so on.

Now we have to adopt our service for working in a cloud, so that there will be multiple servers, processing user requests, and they have a shared state, stored in this key-value indexed storage. We tried to adopt memcashed for our needs, and it's almost ideal -- it is fast, simple and proven solution, but it doesn't have indexes, so we can't used to search our temporary data.

Is there any other way to have a remote cache, just like the memcashed, but with indexes?

Thank you.


Solution

  • Try hazelcast, It is an in-memory data grid that distributes the data among servers. You can have indexes just like you described in your question and query for them.

    Usage is very simple. Just add Hazelcast.jar and start coding. It can be both embedded and remote.

    Here is the index and query usage

    add index

    IMap<Integer, Student> myDistributedMap = Hazelcast.getMap("students")
    myDistributedMap.addIndex("group", false);
    myDistributedMap.addIndex("sex", false);
    

    store in imdg

    myDistributedMap.put(student.id, student)
    

    ;

    query

    Collection<Student> result = myDistributedMap.values(new SqlPredicate("sex=male AND group=ABC"));
    

    Finally it works fine in the cloud. Ex: EC2