我们正在编写聊天应用程序,部分在node.js.我们期望每秒1000次插入(消息),所以我们的方法是写入redis(使用每个房间的lrange),并且还有一个名为not_saved_messages的redis列表,另一个进程循环并写入到MySQL。这是反模式吗?我们应该写信给MySQL并希望它能坚持下去吗?
答案 0 :(得分:3)
如果做得好,我认为它不一定是反模式。魔鬼当然是在细节中。
您要做的是使用mysql进行日志记录和redis实时信息,对吧?在我看来,这可能会奏效。问题是如何使管道作为一个整体功能。
BTW,一些大数据用户使用非常接近这个结果的东西。例如,CERN在数据进入rdbms(Oracle,PostgreSQL或MySQL)之前,在数据处理过程中使用了许多NoSQL解决方案。但它绝对是先进的设计领域。答案 1 :(得分:2)
您可以先将其存储,而不是直接插入数据 Redis的。然后第二个进程可以从Redis中获取并插入它 进入数据库,一次一个“数据部分”。这里有缺点就是你 将需要为Redis记忆。
// PHP program code
//...
// assuming $r is already connected Redis() instance.
$r->sadd("data_pipe", serialize($data));
然后,
// Open connection to the database
open_data_connection();
$r = new Redis();
$r->connect("127.0.0.1", "6379");
while(true){
while($xdata = $r->spop("data_pipe")){
$data = unserialize($xdata);
// store the data
store_data($data);
}
// No more data
sleep(30);
}
如果数据库无法跟上,例如以新数据的速度插入数据 在,你可以随时开始两次或更多的提货过程,或做 通过在2-3个数据库中导入数据进行某种分片。