【问题标题】:Redis as a cache for MySQL writesRedis 作为 MySQL 写入的缓存
【发布时间】:2015-06-07 00:14:24
【问题描述】:

我希望为我的应用添加一个运行时配置,当打开它时会将所有写入从 MySQL 重定向到 Redis。稍后,另一个脚本将轮询 Redis 以手动将这些插入到 MySQL。

当我们不希望对 MySQL 数据库进行任何更新(从机器上的写入请求、数据库停机等)时,我需要它。

对我们应用的一个典型请求会导致大约 3 个插入查询并包含诸如 User submitted data, IP address, date/time 之类的数据。

我考虑了 3 个选项,按简单顺序在下面列出(对我而言):

1.将插入的原始 SQL 存储在 Redis 列表中,第二个脚本将弹出这些 SQL 并执行对 MySQL 的插入

INSERT INTO DB.TABLE (col1, col2) VALUES (val1, val2)

2.存储插入所需的 JSON 编码的变量数组以及数据(列 => 值)、数据库和表名。第二个脚本只需要将这些值分解为列和值并执行插入。

{
"db":"DB",
"table":"table",
"data":[
  {
  "col1":"val1",
  "col2":"val2"
  }
 ]
}

3.将应用所需的所有变量存储在 Redis 的 Hash 对象中。第二个脚本完成了获取插入查询的完整逻辑。

{
"ipAddress":"127.0.0.1",
"requestType":"hmm",
"variable2": "a"
...
}

虽然第 1 次似乎最不痛苦,但它似乎不太对劲,因为它看起来太 hacky 并且......不安全。以这种方式存储会丢失/格式错误的数据吗?

你建议我做什么?

【问题讨论】:

  • 您如何处理查询(即不更新)?
  • 如果是停机时间,他们可以从另一台机器上的从站读取。否则,他们将继续从 MySQL 中读取。
  • @SergioTulentsev 另一个我们需要它的用例。一个地理分布的 API 端点,其中写入必须只发送到主服务器,从服务器上的更新请求缓存在 redis 中并中继回主服务器。在这里,MySQL 主-主复制并没有很好地工作。因此这个。

标签: php mysql redis


【解决方案1】:

当我需要写入以容忍临时数据库停机时间时,我会将它们传递给后台作业队列。

  1. 前端收到用户的请求并确定需要进行写入。
  2. 该写入被推入队列
  3. 稍后,后台工作人员会弹出有关该写入的数据并尝试执行它。现在,如果数据库出现故障,它会简单地重新安排写入(或不确认,具体取决于队列的能力)。

我认为这与您的选项 #3 最相似。

请注意,这种情况意味着所有写入总是通过队列。减少人工干预的需要。当主数据库在凌晨 4 点出现故障时,您不会在一秒钟内醒来并更改应用配置吗?

【讨论】:

  • 谢谢。我们也广泛使用 beanstalkd 进行后台写入。然而,在我们的场景中,Redis 可以更快地进行多次写入(流水线),并且它的字符串显然是二进制安全的,这与 beanstalkd 不同。使用选项 1 / 2 有什么明显的错误吗?他们现在只是消除了我们后台工作人员的复杂性。
  • @kouton,数据更“可行”。如果您以后发现自己不需要执行部分分阶段写入(无论出于何种原因),该怎么办?如果将其存储为数据,那将是微不足道的。如果是sql,现在就得分析一下了。我会说,做任何更容易的事情。如果你的 redis 被入侵了,那你就完蛋了 :)
  • 有道理。目前,选项 2 似乎提供了两全其美的效果。谢谢。
猜你喜欢
  • 2013-05-21
  • 2013-04-22
  • 2013-04-16
  • 1970-01-01
  • 2019-11-05
  • 2017-06-16
  • 1970-01-01
  • 2021-10-14
  • 2017-01-16
相关资源
最近更新 更多