Multiple Columns with Redis Sorted Set

Tuesday, Mar 3, 2020 | 2 minute read

Ricardo Ferreira

Recently I had to build an application that would store and order players in a Redis Sorted Set, but using multiple columns as criteria for the score, instead of just one. After trying to find a proper solution on the web and failing to do so; I decided to put my head to work and figure out an way. This post will show how did I accomplished that.

It turns out that my application has players with the following fields:

  • Score : which is the total number of points received.
  • Level : which reveals how hard is being the game.
  • Losses : The number of times the player game-over.

I would like to order players using these fields as criteria, specifically using the following order:

  1. First by score. This is the default ordering. Players with higher scores would come first.
  2. Then by level. Players with the same score but with a higher level would come first.
  3. Then by losses. Players with the same score and level but with less losses would come first.

As you can see here, not only I need to use multiple columns as ordering criteria, but the columns also mix-and-match in terms of ascending and descending. The ordering for the ‘score’ and ’level’ fields would be ascending, as the order for the ’losses’ field would be descending.

The trick here is to come up with a single value that would encapsulate all this logic. Redis only accepts one number as parameter so there is no actual way to use them all. With that in mind, I decided to use the following formula:

finalScore = (score + level) - losses

In which I would have to compute before writing the data into Redis. Here is an example of this using Go:

func addPlayerToRedis(player *Player) {
  cache.Do("ZADD", "scoreboard", score(player), player.ID)
}

func score(player *Player) int {
  return (player.Score + player.Level) - player.Losses
}

That did the trick like a charm. I honestly don’t know if this is the best way to do this (feedback is more than welcome) but it helped me to implement the application. I do hope that helps you too.

© 2018 - 2026 Ricardo Ferreira

Search is powered by Pagefind. Just hit CTRL+K or CMD+K to start searching.

Powered by Hugo with Dream and Devrel themes.

Open Source

I contribute to LangChain4j, an idiomatic open source Java library for building LLM-powered applications on the JVM. Recent work includes adding native vector search embedding stores so developers can build RAG, recommendation engines, and AI memory systems.

I also ported RedisVL to Go, an open source, AI-native client that brings vector search, semantic caching, LLM memory, semantic routing, rerankers, and an MCP server to the Redis ecosystem for Golang developers.

Speaking

I’ve been speaking at conferences since 2008 and doing it full time as part of my work since 2018. Some of the events I’ve spoken at include AWS re:Invent, Microsoft Ignite, Google Cloud Next, KubeCon, Oracle OpenWorld, QCon, Strange Loop, Kafka Summit, Pulsar Summit, JavaOne, DevNexus, JFokus, JNation, and All Things Open.

Recordings of my talks live on my YouTube channel, and the code I write for talks, demos, and tutorials is on my GitHub.

Who am I?

I work at the intersection of distributed systems, AI, and data infrastructure, turning complex technology into things developers can understand, adopt, and build with.

Lately, that means hands-on AI engineering: building vector search, semantic caching, agent memory, and RAG into the data layer; contributing to LangChain4j and RedisVL for Golang; and figuring out how to make AI agents secure enough to ship.

The AI-native work isn’t a pivot. It draws on the same systems-design foundation I’ve built for 20+ years, moving data fast, at scale, close to compute, watching where systems break; now applied to vectors and agents. I have worked on event streaming with Apache Kafka and Flink at AWS and Confluent; observability at Elastic; as well as RDBMS, NoSQL, and Big Data at Oracle. That foundation is exactly what separates AI demos that work on stage from AI systems that survive production.

Social Links