首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将最后N条消息存储到将自动删除旧消息的数据库中的方法

将最后N条消息存储到将自动删除旧消息的数据库中的方法
EN

Stack Overflow用户
提问于 2013-05-25 19:05:54
回答 3查看 427关注 0票数 2

我有一个聊天室申请和推手做的。我想将最后10条消息存储在数据库(MySQL)上。因此,会有频繁的写作。但是,只有10条将被存储,任何旧消息都将被删除。

示例:

  1. 消息1至10将存储在数据库中。
  2. 消息11传入,这是消息1将被删除的时间

只有当用户第一次访问并登录到聊天室时,才能检索最后10条消息,以便他/她能够备份读取聊天室上的最新消息。

是否有一种常见的“实践”,如何做到这一点,或者更好的方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-25 19:11:24

对此最好的MySQL解决方案如下.

首先,将表创建为InnoDB表,以防止写入时的表锁。

代码语言:javascript
复制
CREATE TABLE chat_messages (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ....
    message VARCHAR(255) NOT NULL
) ENGINE=InnoDB;

另外,在查询之前,您可能希望将事务隔离级别设置为“读取未提交”,该级别在执行前不会等待释放锁。

代码语言:javascript
复制
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

然后,只需通过id DESC和极限10进行排序来查询最后的10条记录。这将非常快,因为它使用聚集索引(主键)进行排序。

代码语言:javascript
复制
SELECT * 
FROM chat_messages
ORDER BY id DESC LIMIT 10

最后,您可以每晚在cron上运行清理过程,以便在活动较少时删除聊天消息。

代码语言:javascript
复制
0 0 * * * mysql -hlocalhost -uusername -ppassword -e "DELETE FROM chat_messages WHERE id < (SELECT MAX(id) - 10 FROM chat_messages)"
票数 0
EN

Stack Overflow用户

发布于 2013-05-25 19:18:47

我会考虑使用真正的mysql来解决这个问题,我认为使用ram-数据库是一个更好的选择。至少要用一个记忆引擎。

您可以创建一个后插入触发器,它对条目进行计数,并删除最古老的太多条目。或者创建一个cronjob来删除最古老的“太多”条目。

另见:https://stackoverflow.com/a/10017798/2277620

无论如何,select应该只使用limit 10读取最后10个条目,就像在另一个答案中一样。

票数 1
EN

Stack Overflow用户

发布于 2013-05-25 19:34:47

我很想接受上述任何一项建议。

或者,如果超过10条,则可以使用insert上的触发器删除记录。

或者,如果您对没有cron作业访问权限的计划清理作业感到满意,那么您可以在MySQL中使用预定的事件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16752981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档