Pregunta

Estoy construyendo un sitio web. Tiene grupos que los usuarios pueden unirse.

La diferencia entre este y los grupos "normales" es que la membresía es Temporario: cuando un usuario se une a un grupo, decide la duración de la membresía: 5 días, un Semana, 2 semanas, etc. (Las opciones están predefinidas). O potencialmente todos Las membresías podrían establecerse para ser de la misma longitud, por ejemplo, una semana, si Eso hace lo más sencillo.

Me gustaría tener una cuenta corriente del número de miembros de cada uno grupo. El número no necesita ser preciso hasta el último segundo. Pero no puede ser tampoco desactualizado, por ejemplo, debe actualizarse una vez un día.

La forma "obvia" de calcular el número de miembros parece ser Ejecutar un trabajo de Cron, digamos diariamente, y pase por cada miembro de cada grupo uno por uno. Si una membresía ha caducado, elimine ese miembro del grupo y decrementan el recuento de miembros del grupo por 1.

Ese enfoque parece muy ineficiente y no muy escalable. Con un Gran cantidad de grupos, podría tomar para siempre.

¿Puedes pensar en una mejor manera de hacer esto? Los conteos de membresía hacen No es necesario ser preciso al último segundo. Puede ser aproximado y (ligeramente) fuera de fecha. También si hace una diferencia todo Las membresías se pueden establecer para ser de la misma longitud, por ejemplo una semana.

¿Fue útil?

Solución

Almacenar una lista de cuántas personas están actualmente en cada grupo.También almacenar una lista de días.Cada día contendrá una lista de grupos, y cuántas personas restan de ese grupo en ese día.

Cuando una persona se une a un grupo, agregue 1 al total del grupo y agregue 1 a la gente a restar para ese grupo el día en que expirará su membresía.

Si la fecha de caducidad de una persona cambia, retire 1 de las personas a restar de la fecha de vencimiento anterior (para ese grupo) y agregue 1 a la nueva fecha de vencimiento.

Finalmente, por supuesto, una vez al día reste la cantidad correcta de cada grupo para ese día.

Otros consejos

Si todas las membresías son la misma longitud, simplemente mantienen un FIFO de membresías debido a la expiración.Cada vez que recibe un nuevo miembro, agregue una entrada 'expira' al final de la lista, con la fecha establecida 1 semana después.

Ahora, con la frecuencia que desee, revise la parte frontal de la lista para vencer las membresías y actualice el recuento del grupo.Pare cuando llegue a la primera entrada que aún no ha caducado.

Esto también podría funcionar para membresías de longitud variable, pero tendrías que mantener una lista ordenada.

Cuando un miembro se une, usted sabe cuándo expirará su membresía.Por lo tanto, en lugar de buscar una lista de miembros para desactivar diariamente (o, sin embargo, a menudo), puede agregar cada miembro a la lista correspondiente de membresías que caduquen el mismo día.Luego, todos los días acaba de pasar y eliminar las membresías caducadas para ese día.Es prácticamente lo que dijiste, excepto que en lugar de buscar, almacena los resultados.

El tamaño de su almacenamiento es proporcional a la longitud de su membresía más larga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top