Pergunta

Estou construindo um site. Tem grupos que os usuários podem participar.

A diferença entre este e os grupos "normais" é que a associação é temporário - quando um usuário se junta a um grupo, ele decide a duração da adesão: 5 dias, um semana, 2 semanas, etc (opções são pré-definidas). Ou potencialmente tudo Associações poderiam ser definidas para ser do mesmo comprimento - digamos uma semana - se Isso torna a coisa mais simples.

Eu gostaria de ter uma contagem de contagem do número de membros de cada grupo. O número não precisa ser preciso até o último segundo. Mas não pode ser também desatualizado - digamos, deve ser atualizado uma vez um dia.

A maneira "óbvia" de calcular o número de membros parece ser executando um trabalho cron, digamos diariamente, e passe por todos os membros de cada grupo um por um. Se uma associação expirou, remova esse membro do grupo e decrementa a adesão do Grupo contagem 1.

Essa abordagem parece muito ineficiente e não é muito escalável. Com um grande número de grupos, pode levar para sempre.

Você pode pensar em uma maneira melhor de fazer isso? A adesão conta não precisa ser preciso para o segundo mais recente. Pode ser aproximado e (ligeiramente) desatualizado. Também se faz uma diferença tudo Associações podem ser definidas para ser do mesmo comprimento, digamos uma semana.

Foi útil?

Solução

Armazene uma lista de quantas pessoas estão atualmente em cada grupo.Também armazene uma lista de dias.Cada dia conterá uma lista de grupos e quantas pessoas subtrairam desse grupo naquele dia.

Quando uma pessoa se une a um grupo, adicione 1 ao total do grupo e adicione 1 ao povo para subtrair para esse grupo no dia em que sua associação expirará.

Se as alterações de data de expiração de uma pessoa, remova 1 da pessoa para subtrair da antiga data de expiração (para esse grupo) e adicione 1 à nova data de expiração.

Finalmente, é claro, uma vez por dia subtrair a quantidade correta de cada grupo para esse dia.

Outras dicas

Se todas as associações forem o mesmo tamanho, basta manter um FIFO de Associações devido a expirar.Toda vez que você recebe um novo membro, adicione uma entrada 'expira' ao final da lista, com a data definida 1 semana depois.

Agora, quantas vezes quiser, verifique a frente da lista para expirar membros e atualizar a contagem do grupo.Pare quando você chegar à primeira entrada que ainda não expirou.

Isso também pode funcionar para associações de comprimento variável, mas você teria que manter uma lista classificada.

Quando um membro se une, você sabe quando sua associação expirará.Então, em vez de procurar uma lista de membros para desativar diariamente (ou, no entanto, muitas vezes), você pode adicionar cada membro à lista apropriada de associações que expiram no mesmo dia.Então, todos os dias você acabou de passar e excluir as associações expiradas para esse dia.É bem o que você disse, exceto que, em vez de pesquisar, você armazena os resultados.

O tamanho do seu armazenamento é proporcional ao comprimento de sua maior associação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top