Mysql 当列具有特定值时,如何在数据库中触发事件?

Mysql 当列具有特定值时,如何在数据库中触发事件?,mysql,cron,Mysql,Cron,我正致力于构建一个类似于twitter的社交网络应用程序,用户可以在其中获得新闻源、关注者、帖子等… 我正在尝试实现一项功能,该功能将使帖子(我的应用程序中的帖子相当于facebook上的帖子)在一定时间后过期。 过期是什么意思? 1.帖子从新闻提要中消失 2.post过期的用户将解除通知,提醒他们post已过期 已经过期了。在编程级别上,这只是post过期时执行的insert语句。 到目前为止我做了什么? 使帖子从新闻提要中消失很简单,我只是通过检查date_of_expiration列来调整

我正致力于构建一个类似于twitter的社交网络应用程序,用户可以在其中获得新闻源、关注者、帖子等…

我正在尝试实现一项功能,该功能将使帖子(我的应用程序中的帖子相当于facebook上的帖子)在一定时间后过期。

过期是什么意思?
1.帖子从新闻提要中消失
2.post过期的用户将解除通知,提醒他们post已过期 已经过期了。在编程级别上,这只是post过期时执行的insert语句。

到目前为止我做了什么?
使帖子从新闻提要中消失很简单,我只是通过检查date_of_expiration列来调整返回新闻提要的查询,并将其与NOW()进行比较

在post过期时创建通知更为棘手。
我最初的方法是制作一个mysql CRON作业,每2分钟运行一次,触发一个事件,该事件将选择所有POST where NOW()>date of_expiration,并使用所选数据将通知条目插入我的通知表中。

这是可行的,但是,我不想使用CRON作业。2分钟的延迟意味着用户可能必须在帖子实际过期后等待整整2分钟,然后才能收到通知,告知用户他们的帖子已过期。我假设如果表中有许多条目,那么根据运行select和insert语句所需的时间,此等待时间可能会更长。

我在找什么
另一种在用户过期后将通知插入通知表的解决方案。

我在想,如果有一种方法可以创建某种事件,当每一行(posts表中)的过期日期值大于NOW()时触发该事件,这将是解决我的问题的一个非常好的方法。这样的事情可能吗?在这种情况下通常做什么?


仅供参考,我的堆栈是:MYSQL,JAVA,带有Android+IOS前端,但我不介意走出堆栈来完成此功能

这很难回答,因为我对您的数据库模式或客户端的访问模式了解不够。但是,我有一些想法可能会对您有所帮助:

用一个单独的“过期”列将posts表标记为过期怎么样?如果这样做,您可以通过获取所有未标记为过期的帖子来选择要发送到客户端的帖子。当然,这也将包括新过期(现在()>date\u of\u expiration)但尚未标记的消息。在发送回复之前,让java程序对刚过期的帖子进行排序。此时,您的程序中已经有了需要标记的帖子,这些帖子与需要插入通知表的帖子完全相同。您可以在Java程序中的这个位置执行此操作

优势

根本不需要事件或Cron作业。如果在表中正确设置索引,这应该是相当有效的。不需要与通知表进行联接

劣势


您需要将过期的信息额外存储在一列中,这可能需要更改架构。

我不确定您的应用程序如何工作。但这里有一个例子,我在一个与电话系统交互的应用程序中做过,在这个应用程序中,每一秒都很重要

我实现了一个脚本,脚本将每秒检查一次新的更新。然后,脚本将使用任何新的/过期的通知更新客户端

我不确定这是否是你想要的,但值得分享

已编辑

既然您更倾向于为通知创建一个表,那么为什么现在在事务中创建运行时通知

启动交易

在帖子中插入(注释,createdBy…)值(“我的新注释”,123)

选择@lastID:=LAST_INSERT_ID()

更多想法,取决于应用程序的繁忙程度,需要考虑的事项

  • 确保您的服务器是用良好的硬件构建的。大量的RAM 64GB+和一个好的硬盘驱动器,如果可能的话,SSD将非常棒
  • <>也可以考虑使用GTID复制来读取更多的资源。
我只是想澄清一下。对于CRON,您是指真正的CRON任务(操作系统级)还是指mysql事件?是否在posts表中用标志或其他东西标记过期的帖子?或者,您如何知道是否已经创建了通知?是的,CRON job不是正确的术语,我只是出于习惯使用了这个术语。事件通过Mysql事件调度器执行。此外,POST将被移动到过期POST表,以使POST表更小,从而更快地查询。然而,这只是一个未来的计划。现在我使用的是您提到的join,难道您不能执行服务器发送的事件,应用程序将检查数据库中的新事件或过期事件吗?你可以在这里读到更多,我喜欢这个主意。谢谢是的,谢谢你的回复!我以前从未听说过服务器发送事件,但听起来很有用。但是,我正在寻找一种以编程方式生成通知的方法,而无需不断地查询我的表(这就是我现在正在做的)。我不确定插入/更新通知是否比使用服务器发送的事件查询新数据更好。插入/更新可能很昂贵。如果您想使用通知表,我用另一种方法更新了我的答案
-- Create temporary table with all the friends to notify
-- "this will help you with performance" Hint then engine type
-- Make sure the final userId list is unique otherwise you will be
-- inserting duplicate notifications which I am sure you want to avoid
CREATE TEMPORARY TABLE myFriends (KEY(user_id)) ENGINE=MEMORY
SELECT 1 FROM users AS s
INNER JOIN friends AS f ON f.friedId = s.userId
WHERE s.userID = su.userID

-- insert the notifications all at once
-- This will also help you with the performance a little
INSERT INTO notifications(userID, postId, isRead)
SELECT userID, @lastID AS postId,'0' AS isRead
FROM users AS su
INNER JOIN myFriends AS f ON f.userId = su.userId;


-- commit the transaction if everything passed
commit; 
-- if something fails
rollback;