Blog do Phil

Tecnologia e opinião

Rankings com Redis

Se você deseja criar um ranking para sua aplicação, é muito provável que precisará saber:

  • o total de registros;
  • a posição de um elemento específico;
  • os primeiros colocados;
  • os ultimos colocados;

Além disso, você vai querer inserir e retirar elementos de forma transparente e rápida.

Para isso, recomendo que use o Redis e seus sorted sets! Funciona de maneira bem simples e pode ser implementado em várias linguagens que possuam o cliente do Redis Acredito que seja muito mais rápido e eficiente do que armazenar em uma base convencional, fazer consultas ordenadas por score e salvar posição.

Exemplos

Todos os comandos a seguir estão muito bem(!) documentados no site do redis

Adicionando membros ao ranking

Comando: ZADD

Cria o ranking(sorted set), se não existir, e adiciona “membro_um” com 100 pontos de score:

1
ZADD rankingx 100 "membro_um"

Adiciona “membro_dois” com 422.1 de score e “membro_tres” o 142 de score:

1
2
ZADD rankingx 422.1 "membro_dois"
ZADD rankingx 142 "membro_tres"

“Selecionando” membros do ranking por range

Comando: ZRANGE e ZREVRANGE

Você pode selecionar membros de determinado ranking passando um range:

1
ZRANGE rankingx 0 10

O comando acima vai devolver 11 elementos, ordenados de forma crescente. Para ordenar de forma decrescente, utilize o ZREVRANGE.

Obtendo a posição de um elemento

Comando: ZRANK e ZREVRANK

Algumas vezes é preciso saber a posição de um elemento relativo a todo o ranking. Isso se torna um pouco complicado quando se faz utilizando SQL e bancos convencionais. No Redis é muito simples:

1
ZRANK rankingx "membro_tres"

Para pegar a posição relativa ao ranking ordenado de forma decrescente, utilize o ZREVRANK:

1
ZREVRANK rankingx "membro_tres"

Total de membros no ranking

Comando: ZCARD

O total de membros de um determinado ranking pode ser obtido com:

1
ZCARD rankingx

Conclusão

O Redis foi muito útil em uma historia onde era preciso otimizar a performance de páginas de rankings no Kademi. Especialmente porque usávamos vários rankings na mesma página e fazíamos grandes consultas para saber a posição atual de um membro relativo ao ranking. Utilizamos Ruby e o cliente redis-rb, e foi bem legal ver os resultados(a página em questão carrega em média 10x mais rápido agora)!

Há vários outros comandos disponíveis para Sorted set e outras estruturas de dados. Para saber mais sobre o Redis e testar os comandos em questão, acesse o site do projeto e siga o @antires, seu criador.

Comments