Tabelas de classificação

O que é uma tabela de classificação?

Explicamos o conceito de uma tabela de classificação. Trata-se de um placar que mostra os nomes classificados e as pontuações atuais (ou outros dados) dos principais concorrentes. Ele é essencial no mundo dos jogos de computador, mas agora as tabelas de classificação vão além dos jogos. Estamos falando de gamificação, uma aplicação mais ampla que pode incluir qualquer grupo de pessoas com um objetivo comum (colegas de trabalho, estudantes, grupos de vendas, grupos de condicionamento físico, voluntários etc).

As tabelas de classificação podem estimular a competição saudável em um grupo, exibindo abertamente a classificação atual de cada membro do grupo. Eles também são uma maneira clara de ver as conquistas contínuas de toda a equipe à medida que os membros progridem em direção a uma meta.

Tabelas de classificação para gamificação

A gamificação de tarefas e metas por meio de tabelas de classificação é uma ótima maneira de motivar seus funcionários, fornecendo a eles um feedback constante sobre sua posição em relação a outros membros do grupo. Se bem estruturado, é possível incentivar a competição saudável que promove a coesão do grupo.

Aqui está um exemplo gráfico de uma tabela de classificação simples que uma empresa poderia usar a fim de motivar os funcionários a participarem de seu programa de saúde corporativo.

Neste exemplo, os funcionários podem ver os concorrentes mais bem classificados, juntamente com suas pontuações atuais. Eles também podem visualizar o tempo restante da competição e os prêmios motivacionais. É claro que, à medida que os dados mudam (quando os usuários carregam contagens de passos verificadas), as classificações são atualizadas em tempo real.

Esses são os dois tipos de placares de líderes:

Placares de líderes absolutos que classificam todos os concorrentes por alguma medida global. Normalmente, elas mostram os membros melhor classificados do grupo, como um Top 10.

Tabelas de classificação relativas, que ranqueiam os participantes em relação a diferentes características dos dados, de modo que os membros sejam agrupados de acordo com critérios mais restritos ou relativos. Podem exigir cálculos complexos para deslizar os dados de várias maneiras. Em um jogo comum, por exemplo, é uma exibição que mostra a classificação de um determinado concorrente e os competidores logo acima e abaixo dele.

Quais são os desafios das tabelas de classificação atuais?

Em nosso mundo conectado à Internet, as tabelas de classificação de jogos populares podem ser compartilhadas por centenas de milhares, até mesmo milhões, de concorrentes. O mesmo se aplica a usos não tradicionais das tabelas de classificação, como aplicativos de condicionamento físico, saúde e redes sociais, ou ainda tarefas organizacionais internas, como atendimento ao cliente, logística ou mitigação de fraudes.

Os dados usados pelas tabelas de classificação são atualizados constantemente e os usuários querem visualizá-los segmentados de várias maneiras. É por isso que as tabelas de classificação são um ótimo exemplo de análise em tempo real em ação, bem como uma demonstração da velocidade com que sua camada de dados lida com leituras, gravações, classificação e outras operações importantes.

Aqui estão alguns outros desafios técnicos apresentados pelas tabelas de classificação:

  • Escala maciça de milhões de usuários
  • Cálculos matemáticos em grande número de características (analisar os dados de várias maneiras para obter diferentes visões dos dados)
  • Fornecer acesso à tabela de classificação em tempo real com alta disponibilidade
  • Permitir que os usuários compartilhem suas estatísticas nas redes sociais
  • Permitir que os usuários recebam notificações quando os atributos nos quais estão interessados na tabela de classificação forem alterados
  • Permitir que os aplicativos atualizem as tabelas de classificação de forma distribuída em todo o mundo e onde quer que as ações sejam tomadas, além de fornecer uma visão global do status da tabela de classificação de qualquer local

Fornecer esses dados em tempo real e manter o sistema disponível está além do escopo de muitas tecnologias da Web. A boa notícia é que o Redis Enterprise resolve todos esses desafios com estruturas de dados criadas para casos de uso como esses e com a variedade de opções de implantação que o Redis Enterprise oferece.

Então, por que usar o Redis Enterprise para tabelas de classificação?

Os conjuntos ordenados (ZSETs) no Redis formam uma estrutura de dados integrada que simplifica a criação e a manipulação de tabelas de classificação.

O Redis Enterprise é baseado em uma arquitetura simétrica e de uso compartilhado que permite que o tamanho dos conjuntos de dados cresça de forma suave e linear, sem exigir alterações no código do aplicativo.

O Redis Enterprise oferece vários modelos de alta disponibilidade e possibilita implantar o Redis de forma geograficamente distribuída, permitindo latências locais a seus usuários quando necessário.

Várias opções de persistência (AOF e snapshots por gravação ou por segundo) que não afetam o desempenho garantem que os servidores de banco de dados não precisem ser reconstruídos após uma falha.

O suporte a conjuntos de dados extremamente grandes por meio do uso de acesso inteligente à memória em camadas (RAM, memória persistente ou Flash) garante que os conjuntos de dados possam ser dimensionados de acordo com as demandas dos usuários, sem afetar significativamente o desempenho.

Conjuntos ordenados por profundidade

Se você quiser criar um conjunto ordenado, é fácil usar o comando Redis ZADD. Por exemplo, imagine que você esteja adicionando um grupo de jogadores a uma tabela de classificação. Cada jogador consiste em um nome de exibição e sua pontuação, que mudará continuamente ao longo do tempo.

Adicionar um jogador a um conjunto ordenado é tão fácil quanto usar o comando ZADD e passar o nome do conjunto, uma pontuação e o nome do jogador:

ZADD jogador 200 Fred

Se o conjunto ainda não existir, o Redis o criará para você. Se já existir, o Redis adicionará os novos dados ao conjunto existente. Cada elemento ordenado deve ser exclusivo, portanto, se o nome do jogador (membro) não existir, ele será adicionado ao conjunto. E se o membro já existir, seu valor será definido como o novo valor fornecido. Os comandos incorporados de conjuntos ordenados permitem que você faça a classificação e a geração de relatórios de forma rápida e fácil.

Por exemplo, o comando ZRANGE retorna um intervalo de membros. ZRANGEBYSCORE retorna um intervalo de membros em um intervalo de pontuações. ZRANK retorna a classificação de um membro especificado.

O Redis facilita o aumento da classificação de qualquer jogador usando o comando ZINCRBY, indicando o nome do membro e o valor pelo qual a classificação deve ser aumentada.

Além disso, você pode gerenciar vários conjuntos ordenados para o seu jogo/aplicativo. Por exemplo, um conjunto ordenado global inclui as pontuações agregadas de todos os torneios e, em seguida, vários conjuntos ordenados, por torneio. Você pode usar a capacidade exclusiva do Redis de operar entre conjuntos classificados, por exemplo, ZUNIONSTORE à operação de junção com e sem pontuações.

Esses exemplos simples não mostram dados semelhantes a gráficos, mas isso faz parte das possibilidades oferecidas pelo Redis Sorted Sets: eles são dados puramente na memória e não estão vinculados a nenhuma visualização. Isso significa que você pode usar os dados para exibi-los da maneira que desejar.

Então, como posso criar uma tabela de classificação?

Vamos dar uma olhada rápida em como implementar uma tabela de classificação no Node.js junto com um aplicativo Web existente. Com o gerenciador de pacotes do Node (NPM), é fácil adicionar o Redis ao seu aplicativo Web usando o comando npm install redis.

Depois que os pacotes Node do Redis estiverem instalados no projeto do aplicativo Web, você poderá acessar a funcionalidade do Redis por meio de uma API JavaScript (para começar, use a documentação oficial no repositório node_redis do Github).

Vamos agora criar um banco de dados simples na memória usando o conjunto ordenado, para fins de demonstração. Criaremos membros chamados player:[uniqueId], em que uniqueId é um valor inteiro que pode ser facilmente gerado pelo seu código JavaScript ou Python quando um usuário entra na competição.

A pontuação pode ser qualquer dado numérico que você queira usar para classificar os jogadores (passos diários em um programa de saúde da empresa, alienígenas atingidos em um jogo de computador etc.).

Os dados básicos do jogador serão mais ou menos assim:

leaderboard-playerdata

Vejamos agora alguns códigos Node.js que você pode usar para exibir os dados.

Uso de um Hash para armazenar vários valores

Você pode criar um conjunto de dados segmentado usando diversas variáveis. Para fazer isso, é útil armazenar os dados em uma estrutura que represente cada concorrente. O Redis fornece exatamente essa estrutura, chamada de Hash. Um Hash pode conter vários pares nome-valor associados a uma chave.

Você pode usar uma chave numérica simples como um identificador exclusivo em seu hash e, em seguida, associar essa chave exclusiva a um conjunto ordenado, que conterá a pontuação e a chave. É possível obter rapidamente a pontuação de seus principais participantes ou de vários deles. Se quiser mais dados posteriormente, é fácil: você pode obtê-los do Hash usando o valor da chave armazenada no conjunto ordenado.

Criar um Hash do Redis é fácil. Esse Hash, chamado allPlayers, usa o seguinte formato:

hset [ id exclusivo (para identificar o hash)] [nome da propriedade] [valor da propriedade] ...

Por sua vez, crie um novo Hash com a chave player:100 e adicione uma propriedade screenName com o valor Fred. Você poderia simplesmente criar a chave de hash 100, mas o uso do formato [stringID:IntegerID] torna-o um pouco mais legível. Quando você adicionar outro jogador, criará uma nova chave Hash, como player:101.

hset jogador:100 screenName Fred

Se você quiser recuperar todas as propriedades e valores (pares nome-valor) armazenados para um determinado hash, basta usar este comando:

hgetall jogador:100

Nesse ponto, você verá que há um par nome-valor.

1) "screenName"
2) "Fred"

O Hash é uma estrutura flexível. Desta forma, é fácil adicionar propriedades e valores a ele de forma dinâmica.

Imagine que você queira salvar a data em que o jogador fez o último login:

hset player:100 lastLoggedIn 2019-07-30

Ao ativar o hgetall novamente, você verá o seguinte:

É só uma questão de adicionar cada usuário ao seu Hash allPlayers com seu IID exclusivo. Em seguida, associe-os a um conjunto ordenado que conterá a pontuação de cada jogador.

Dê uma olhada neste gráfico para ver como você pode unir os dados:

leaderboard-datachart

Depois de adicionar os hashes (player:NNN), você terá sua lista e poderá aproveitar essas chaves de dados do jogador usando-as ao adicionar dados ao conjunto ordenado. É assim que você aproveita o potencial do banco de dados na memória do Redis a fim de trabalhar com grandes conjuntos de dados (milhões de jogadores!) que rastreiam as classificações de cada integrante, mas com um desempenho incrivelmente rápido.

É fácil implementar uma solução que extrai os dados usando o Node e o pacote node redis com objetivo de manter a tabela de classificação atualizada em seu aplicativo da web. Isso é feito de maneira simples, com o uso da API do pacote node_redis, o qual permite recuperar o conjunto ordenado por nome (playerRank).

Lembre-se de que o Redis Enterprise é essencial para manter a tabela de classificação atualizada, permitindo aos usuários voltar e ver suas posições no ranking.

Próximas etapas