我关注this answer的解决方案#1 。过了一会儿,表格中会有一些冗余的行。假设这个表:
+------+------------------+
| user | cookie |
+------+------------------+
| 1 | ojer0f934mf2... |
| 2 | ko4398f43043... |
| 2 | 34fjkg3j438t... |
| 3 | 0243hfd348i4... |
+------+------------------+
当用户1
删除其浏览器的Cookie时,该行仍然存在于数据库中:
| 1 | ojer0f934mf2... |
当他打开我的网站时,他需要再次登录。所以这是表格:
+------+------------------+
| user | cookie |
+------+------------------+
| 1 | ojer0f934mf2... | -- now this row is useless anymore
| 2 | ko4398f43043... |
| 2 | 34fjkg3j438t... |
| 3 | 0243hfd348i4... |
| 1 | 0243hfd348i4... |
+------+------------------+
将来肯定会增加这些无用行的数量。那我该怎么办呢?实际上,我可以通过删除冗余行来创建EVENT
来清理该表(每天)。但问题是:如何检测它们?如何指定行无用?
编辑:我可以添加新列并存储时间戳,然后按EVENT
(或cron作业)删除所有旧时戳行。但这不是一个完美的解决方案。我喜欢cookie一直有效,直到用户退出(所以我不喜欢cookie的任何限制(或过期时间)。
现在我正在寻找一种解决方案来确定冗余行(不是旧行)。
答案 0 :(得分:1)
添加带有时间戳的另一列。然后运行常规cron作业以删除时间戳早于某个阈值的任何行(例如,1天)。
您可以输入时间戳并在每次看到该用户时更新它,这意味着他们会退出"退出" x上次使用网站后的时间(但这意味着更多的数据库传输);或者你可以在第一次创建会话时插入一个时间戳,而不再触摸它,这将"将它们记录下来" x上次登录后的时间量(对用户来说不太方便,但这意味着数据库传输较少)。
答案 1 :(得分:0)
创建用于检查cookie表中已存在的用户的代码。
如果用户列中存在用户ID - 只需使用新的cookie信息更新它。如果用户ID不存在,请创建新记录。
或者您可以检查现有记录,删除它们,然后插入新记录。
答案 2 :(得分:0)
在这种情况下,不清楚冗余的含义。没有办法区分这两行:
+------+------------------+
| user | cookie |
+------+------------------+
| 1 | ojer0f934mf2... | -- now this row is useless anymore
| 1 | 0243hfd348i4... |
+------+------------------+
如果您添加一列以使第一行可识别,那么问题就会解决:在每个insert
之前,delete
它将取代的行。不需要cron;在最坏的情况下,每个user
将在数据库中有一个剩余的行,将在下次使用时删除。
我还建议使用主键来强制执行 no-redundant-rows 规则。
答案 3 :(得分:0)
当用户注销时,显式删除表中与其当前cookie对应的行。
为了安全起见,您应该在cookie中的随机值中存储数据库表中cookie的安全散列(例如SHA-2)。
为了处理不再使用特定浏览器的用户,请为最后使用日期存储另一个字段。一旦检测到用于访问应用程序的行的cookie,就立即更新此日期。
然后,您将需要每隔一段时间运行一次计划任务,以清理最近未使用过的会话。