Redis作为MySQL写入的缓存


Redis as a cache for MySQL writes

我想为我的应用程序添加一个运行时配置,当它打开时,将所有写入从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和表名。第二个脚本只需要将这些值分解为列和值,然后执行insert。

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

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

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

虽然第一次似乎最不痛苦,但它似乎不太正确,因为它看起来太暴躁了。。不安全的以这种方式存储数据是否会丢失/格式错误?

你建议我做什么?

当我需要写操作来容忍数据库的临时停机时,我会将它们通过后台作业队列。

  1. Frontend收到用户的请求,并确定需要进行写入
  2. 该写入被推入队列
  3. 稍后,后台工作人员弹出有关该写入的数据并尝试执行。现在,如果DB关闭,它只需重新安排写入(或者不确认,取决于队列的功能)

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

请注意,这种情况意味着所有写入总是通过队列。减轻了手动干预的需要。当主数据库在凌晨4点关闭时,你不希望在一秒钟内醒来并更改应用程序配置吗?