ListKeys or MapReduce

Jeremiah Peschka jeremiah.peschka at
Tue Feb 12 09:51:53 EST 2013

They're both pretty crappy in terms of performance - they read all data off
of disk. If you're using LevelDB you can use the $keys index to pull back
just the keys that in a single bucket.

A better approach is to maintain a separate bucket - e.g. DocumentCount -
that is used for counting documents. Unfortunately, you can't guarantee
transactional consistency around counts in Riak today, so you'll want to
move maintaining the counts out of Riak and into something else. If you
search the list archives [1], you'll find that Redis has been mentioned as
a good way to solve this problem - counters are stored in Redis and flushed
to Riak on a regular schedule. Because of the lack of consistency
(especially around MapReduce operations), Riak isn't the best choice if you
require counters/aggregations to be stored in the database.

Once CRDTs [2] make it into mainstream Riak, you can make use of those data
structures to implement distributed counters in Riak.


Jeremiah Peschka - Founder, Brent Ozar Unlimited
MCITP: SQL Server 2008, MVP
Cloudera Certified Developer for Apache Hadoop

On Mon, Feb 11, 2013 at 10:30 AM, <rkevinburton at> wrote:

> Say I need to determine how many document there are in my database. For a
> CorrugatedIron application I can do ListKeys and get the warning that it is
> an expensive operation or I can do a MapReduce query. Which is the the
> least expensive? Is there an option that I am missing?
> _______________________________________________
> riak-users mailing list
> riak-users at
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the riak-users mailing list