【问题标题】:Using redis as intermediary before MySQL insert [closed]在 MySQL 插入之前使用 redis 作为中介 [关闭]
【发布时间】:2016-01-24 02:43:15
【问题描述】:

我们正在编写一个聊天应用程序,部分使用 node.js。我们预计每秒有 1000 条插入(消息),因此我们的方法是写入 redis(为每个房间使用 lrange),并且在 redis 中还有一个名为 not_saved_messages 的列表,另一个进程循环并写入 MySQL .这是反模式吗?我们是否应该只写给 MySQL 并希望它能坚持下去?

【问题讨论】:

  • 似乎不是一种反模式,也不是处理插入突发的实用方法。您基本上将 Redis 用作消息队列。我可能想关注延迟,因为取决于您的应用程序的哪些部分从 MySQL 存储中提取,延迟可能会影响用户的体验或期望。总体而言,这似乎是一种合理的方法。

标签: php mysql node.js redis


【解决方案1】:

不用直接插入数据,可以先存入 雷迪斯。然后第二个进程可以从 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 个数据库中。

http://redis4you.com/code.php?id=016

【讨论】:

    【解决方案2】:

    如果做得好,我认为它不一定是反模式。魔鬼当然在细节中。

    您正在尝试做的是使用 mysql 进行日志记录并使用 redis 来获取实时信息,对吗?在我看来,这可能会奏效。问题是如何使管道成为一个整体功能。

    顺便说一句,许多大数据用户使用的结果与此结果非常接近。例如,在数据进入 rdbms(Oracle、PostgreSQL 或 MySQL)之前,CERN 在数据处理期间使用了许多 NoSQL 解决方案。但这绝对是高级设计领域。

    【讨论】:

    • 我想你可以说它不仅仅是记录,因为应用程序的一些更高级的特性将在 MySQL 中处理。 Redis 很可能可以处理这一切,但依赖 Redis 进行所有数据存储会让人感到不适。此外,Redis 涵盖的部分是大型应用程序的一小部分。我希望这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多