我正在建立一个类似于Twitter的社交网络应用程序,用户可以在其中使用新闻源,关注者,帖子等...
我试图在一段时间后实现一个功能,使帖子(我的申请中的帖子相当于Facebook上的帖子)EXPIRE。
到期时我的意思是什么?
1.帖子从新闻摘要中消失
2.帖子过期的用户,解除通知,提醒他们帖子
已过期。在程序级别,这只是一个在帖子到期时执行的插入语句。
到目前为止我做了什么?
让帖子从新闻源中消失很简单,我只是通过检查date_of_expiration列并将其与NOW()进行比较来调整返回新闻源的查询。
在帖子过期时创建通知比较棘手
我最初的方法是制作一个每2分钟运行一次的mysql CRON作业,触发一个事件,选择NOW()>所有的帖子。 date_of_expiration并使用所选数据在我的通知表中插入通知条目。
但是,这有效,我不想使用CRON作业。 2分钟的延迟意味着用户可能必须在帖子实际到期后等待整整2分钟,然后才会收到通知,告知用户他们的帖子已过期。我假设如果表有很多条目,这个等待时间可能更长,这取决于运行select和insert语句所需的时间。
我在寻找什么?
用户帖子过期时将通知插入通知表的另一种解决方案。
我在想,如果有一种方法可以创建某种事件,当每行(在posts表中)的到期日期值大于NOW()时会触发,这将是一个非常好的解决方案我的问题。这样的事情可能吗?在这种情况下通常做什么?
仅供参考我的筹码是:MYSQL,带有Android + IOS前端的JAVA,但我不介意离开我的筹码来完成此功能
答案 0 :(得分:2)
我不确定您的应用程序是如何工作的。但是这里有一个,我在一个应用程序中完成了与电话系统交互的每一秒计数。
我实现了server-sent event,脚本将每秒检查新的更新。然后,该脚本将使用任何新的/过期的通知更新客户端。
我不确定这是否是您正在寻找的,但值得分享。
<强> EDITED 强>
由于您更倾向于使用通知表,为什么现在在运行时在事务中创建通知?
START TRANSACTION;
INSERT INTO帖子(评论,createdBy ....)值(&#39;我的新评论&#39;,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;
更多的想法,取决于您应用程序将要考虑的繁忙程度
答案 1 :(得分:1)
这很难回答,因为我不太了解您的数据库架构或客户端的访问模式。但是,我有一些可能对您有所帮助的想法:
如果将posts表标记为已过期且单独的&#34;已过期&#34;柱?如果您这样做,您可以通过获取未标记为已过期的所有帖子来选择要发送给客户的帖子。这当然还包括新过期的消息(NOW()&gt; date_of_expiration)但尚未标记。在发送回复之前,让您的java程序对刚过期的帖子进行排序。在您的程序中,您已经拥有了需要标记的帖子,这些帖子与需要插入通知表中的帖子完全相同。您可以在Java程序中的这个位置执行此操作。
优势
根本不需要EVENTS或Cron工作。如果在表中正确设置索引,这应该是相当有效的。无需与通知表进行联接。
缺点
您需要在列中存储额外的过期信息,这可能需要更改架构。
答案 2 :(得分:0)
每隔x秒运行一次而不是玉米作业的存储过程呢?
你也可以使用MySQL触发器。但是,这不是一种推荐的方法,因为它一直在执行,导致操作较慢。