【发布时间】: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 主-主复制并没有很好地工作。因此这个。