Database 使用Redis实时聊天-如何不丢失消息?

Database 使用Redis实时聊天-如何不丢失消息?,database,postgresql,redis,chat,real-time,Database,Postgresql,Redis,Chat,Real Time,我想实现一个实时聊天。我的主要数据库是PostgreSQL,后端用NodeJS编写。客户端将是移动设备 据我所知,为了实现消息传递的实时性能,我需要使用Redis。 因此,我的计划是使用Redis处理2人或更多人之间的X条最新消息(群组聊天),例如1000条,所有内容都在我的主数据库PostgreSQL中同步和备份。 然而,由于Redis本质上只是RAM,聊天历史可能太“脆弱”,因为在RAM中存储数据的易变性。 因此,如果我的redis服务器出现意外的临时故障,对话中最近的消息将丢失 现在实现这

我想实现一个实时聊天。我的主要数据库是PostgreSQL,后端用NodeJS编写。客户端将是移动设备

据我所知,为了实现消息传递的实时性能,我需要使用Redis。 因此,我的计划是使用Redis处理2人或更多人之间的X条最新消息(群组聊天),例如1000条,所有内容都在我的主数据库PostgreSQL中同步和备份。 然而,由于Redis本质上只是RAM,聊天历史可能太“脆弱”,因为在RAM中存储数据的易变性。 因此,如果我的redis服务器出现意外的临时故障,对话中最近的消息将丢失

现在实现这样的东西的最佳实践是什么? 我是否只需要将Redis数据持久化到磁盘?但在这种情况下,这不会影响性能,因为它会增加发送的每条消息的写入时间吗

或者我应该准备一个恢复方法,从PostgreSQL获取最近的历史记录,以防我的redis聊天历史记录列表为空

另外,当我们在做这件事时,你能建议一个维护用户状态(在线/离线)的好方法吗?Redis也是这样吗

现在实施类似的最佳实践是什么 这我是否只需要将Redis数据持久化到磁盘?但在这方面 在这种情况下,这不会影响性能,因为它会增加写入速度吗 发送每条消息的时间

  • 是的,启用持久性将影响redis的性能
  • 最好的办法是快速运行应用程序的预期IOPS和操作类型,以确定启用持久性后对IOPS的影响
  • RBD与AOF:

    • 在启用RDB持久性的情况下,父进程不会执行磁盘I/O来将数据更改存储到RDB。根据
      保存点的值
      ,redis派生一个子进程来执行RDB
    • 但是,根据
      保存点的配置
      ,您可能会丢失在最后一个保存点之后写入的数据-如果不是从最后一个保存点保存数据,则会导致服务器重新启动或崩溃
    • 如果您的用例不能容忍这段时间的数据丢失,那么您需要查看AOF持久性方法。AOF将跟踪所有写入操作,这些操作可用于在服务器重新启动事件时构造数据
    • fsync策略设置为每秒一次的AOF可能会慢一些,但是,如果fsync被禁用,它可以和RDB一样好
    • 阅读使用RDB或AOF的权衡:
另外,在我们讨论这个问题时,你能为我们提供一个好的解决方法吗 维护用户状态(在线/离线)?这件事结束了吗 Redis也是吗


谢谢您的帮助。我不熟悉Redis,服务器经常关闭吗?要多久才能恢复?我的规模不大,但我不想让我的用户到处丢失信息,流行的聊天应用是否使用Redis和AOF?还是其他星展银行(卡桑德拉等)?另外,从Postgres获取历史记录然后订阅Redis是否更好?用户不知道他们是否错过了一些消息,这会不会以某种方式结束?再次感谢!服务器停机的频率取决于您的环境。但是,您可以配置redis sentinel来维护HA。这肯定会提高系统的可用性。如果您计划使用redis cluster,则从设备将升级为主设备。从redis获取用户的在线/离线状态在性能上要比Cassandra好。