【问题标题】:Best way to update expired users' statuses in a database?更新数据库中过期用户状态的最佳方法?
【发布时间】:2013-03-05 09:05:11
【问题描述】:

在具有定期(例如:每月)订阅的付费应用程序的 mysql 数据库中,检查订阅过期的用户并使他们处于非活动状态的最佳方法是什么? 通常我会在应用程序的过期日期过后查看应用程序,但有几种类型的帐户,例如免费、试用等。它们不会有过期时间。

我想在客户端应用程序方面保持简单,并使其只需要检查“活动”状态,并允许用户使用应用程序,而不是切换大小写所有帐户类型和到期日期。此外,帐户类型将来可能会有所不同,具体取决于客户的请求,如果逻辑位于 (php) 后端,那么这将允许更新,而无需新的客户端版本。

表格应该是这样的:

User ID | Expiry date | Status

我目前做事的方式是我有一个 cronjob,它会不时运行并更新所有过期日期已过当前时间的用户。

总结一下我的问题是:

  • 一旦我们投入生产并拥有大量用户,当前的方法是否会导致服务器负载激增?
  • 是否有更好、更清洁的方法来执行此操作?是不同的更新方法还是处理活跃/非活跃用户和过期时间的不同逻辑?

【问题讨论】:

  • 您可以检查用户登录时的到期日期,并在需要时更新状态
  • 也许我在这里太简单了,但是为什么不简单地检查用户登录时的到期日期并使用它来确定他们是否处于活动状态?您已经从数据库中获取了他们的数据,因此不会增加负载,这意味着您不必运行 CRON 作业或类似的作业(从实际的角度来看,这确实不应该给您的服务器增加太多负载,特别是如果你在非常规时间运行它)
  • 我的错。我又忘记了一个问题。问题是该应用程序是一个社交网络应用程序,当用户处于非活动状态时,他发布的所有内容都会被隐藏,直到他再次订阅。如果用户处于非活动状态并且不再订阅或登录,那么他将在数据库中保持活动状态,并且仍将显示他的帖子。

标签: php mysql database


【解决方案1】:

为什么不在用户登录时检查用户是否未过期。

即查询喜欢

SELECT COUNT(*), expiry IS NULL OR expiry > NOW()
FROM users
WHERE username = ?
AND password = ?

然后检查您可以检查用户名/密码组合是否正确,以及帐户是否已过期/未过期。对于没有到期日期的帐户,请使用 NULL。

这样做的好处是每天只需要检查一小部分帐户(这里猜测当用户登录时,他们会得到一个超时的会话)。

【讨论】:

  • 我的错。我又忘记了一个问题。问题是该应用程序是一个社交网络应用程序,当用户处于非活动状态时,他发布的所有内容都会被隐藏,直到他再次订阅。如果用户处于非活动状态并且不再订阅,那么他将在数据库中保持活动状态。
  • @BoonMcBoon - 这是另一个可见帖子的表格。 users 表只是为了检查他们是否可以登录。
  • 我的做法是,当另一个用户登录时,数据库将返回活跃用户的帖子,而不是非活跃用户的帖子。我在另一张表中没有活动/非活动帖子,因为还有许多其他事情取决于用户是否处于活动状态,例如,出现在人们的朋友列表中等等。这有点粗糙我知道:/
【解决方案2】:

您可以为此任务创建 CRON JOB。

http://en.wikipedia.org/wiki/Cron

【讨论】:

  • 这是我目前的定期实施。不过谢谢你的建议:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2016-06-15
  • 2013-07-21
  • 2020-09-28
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多