I’ve been doing detailed prototyping on Aerospike. Our product currently uses an open source Java variant of LevelDB, which works well for small to medium sized data sets, but will not scale to anything approaching ‘big data’. I was very impressed by Aerospike’s ease of installation and configuration, as well as its performance and clear scalability. It also offers the basics I was looking for - put and get key value pair operations where the key can be a string, integer or byte array.
However one fundamental that is badly lacking, in my opinion, is the area of primary key iteration. We need (and I anticipate that this is a universal requirement, and these functions are ubiquitous in competitor products) the ability to iterate a set using a primary key. Furthermore we need a ‘seek’ function which places an iterator at the first primary key value equal to or higher than the seek target value. This needs to work for String keys, not just for integer keys.
These seem to be to be functions that are universally available in other non SQL database products. I have spent a lot of time googling as to how to fulfil these requirements in other ways using Aerospike. Obviously record sets and queries are the way to go, and I will be able to make a go of it using various workarounds, but even there I am hampered by the fact that ranges cannot be set for String keys. I also have to mess about creating secondary indices representing the primary keys which just seems plain silly and expensive overhead wise.
I cannot understand why these to my mind fundamental capabilities are not provided. I have seen references to the primary index being organised using BTrees etc. so positioning an iterator at a node in a tree and then traversing the rest of the nodes in that tree in alphabetical or numerical order depending upon the key type does not sound like a Labour of Hercules to me.
It’s a real shame, and will probably lead to us not being able to use Aerospike.