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

标签 mysql cron

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

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

过期是什么意思?
1. 帖子从动态消息中消失
2.帖子过期的用户解除通知,提醒他们该帖子 已过期。在程序层面上,这只是在帖子过期时执行的插入语句。

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

在帖子过期时创建通知比较棘手。
我最初的方法是制作一个每 2 分钟运行一次的 mysql CRON 作业,触发一个事件,该事件将选择 NOW() > date_of_expiration 的所有帖子,并使用所选数据将通知条目插入我的通知表。
< br/> 这可行,但是,我不想使用 CRON 作业。 2 分钟的延迟意味着用户可能必须在帖子实际过期后等待整整 2 分钟才能收到通知,告诉用户他们的帖子已过期。我假设如果表有很多条目,这个等待时间可能会更长,具体取决于运行选择和插入语句所需的时间。

我在找什么?
另一种在用户帖子过期时向通知表中插入通知的解决方案。

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

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

最佳答案

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

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

我不确定这是否是您正在寻找的,但值得分享。

已编辑

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

开始交易;

INSERT INTO posts(comment, createdBy....)Values('我的新评论',123);

SELECT @lastID := LAST_INSERT_ID();

-- 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;

更多的想法,取决于你的应用程序有多忙,需要考虑的事情

  • 确保您的服务器是用良好的硬件构建的。 64GB 以上的大量 RAM 和良好的硬盘驱动器,如果可能的话,SSD 会很棒,
  • 此外,您可以考虑使用 GTID 复制来获得更多的读取源。

关于mysql - 当列具有特定值时,如何在数据库中触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224374/

相关文章:

linux - 我怎么知道 cron 作业已经开始或完成?

php,mysql - 选择具有多个值的列的行

mysql - 根据时间戳更新类似行

php - 向数据库添加参数后,通过Postman POST数据时出现错误

javascript - 我如何使此代码每5分钟自动运行一次,以使即使关闭计算机电源,视频标题也与 View 匹配?

linux - CentOS : delete X-days old files using cron

MySQL:如何用特殊字符替换文字\r\n\r\n

mysql - SQL 查询以计算恰好有 91 个重复项的 ID

php - Laravel 框架外的 Artisan::call()

ruby-on-rails - 如何在Rails docker容器中以非root用户身份执行cron任务?