Redis作为MySQL写入的缓存

时间:2015-04-02 06:17:43

标签: php mysql redis

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

当我们不想对MySQL DB进行任何更新(Slave机器上的写请求,DB停机等)时,我需要这个。

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

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

1. 在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"
...
}

虽然第一个似乎是最不痛苦的,但它似乎不正确,因为它看起来太hacky和..安全。通过这种方式存储会丢失/格式错误的数据吗?

你建议我做什么?

1 个答案:

答案 0 :(得分:1)

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

  1. 前端收到用户的请求,并指出它需要写一个。
  2. 该写入被推入队列
  3. 稍后,后台工作程序会弹出有关该写入的数据并尝试执行该操作。现在,如果数据库关闭,它只是重新安排写入(或者不根据队列的能力确认它)。
  4. 我认为这与你的选项#3非常相似。

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