Redis 作为 MySQL 写入的缓存

Redis as a cache for MySQL writes

我正在为我的应用程序添加一个 运行时配置 ,当启用它时会将所有写入从 MySQL 重定向到 Redis。一个不同的脚本将在稍后手动轮询 Redis 以将这些插入 MySQL。

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

对我们应用程序的典型请求会导致 ~ 3 个插入查询并包含 User submitted data, IP address, date/time.

等数据

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

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

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

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

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

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

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

虽然第一个似乎是最不痛苦的,但它似乎不太对劲,因为它看起来太老套而且……不安全。以这种方式存储会丢失/格式错误的数据吗?

你建议我做什么?

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

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

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

请注意,此方案意味着所有写入始终通过队列。减少人工干预的需要。当主数据库在凌晨 4 点停机时,您不希望在一秒钟内醒来并更改应用程序配置吗?