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"
...
}
虽然第一个似乎是最不痛苦的,但它似乎不太对劲,因为它看起来太老套而且……不安全。以这种方式存储会丢失/格式错误的数据吗?
你建议我做什么?
当我需要写入以容忍临时数据库停机时,我会通过后台作业队列传递它们。
- 前端收到用户的请求,发现需要写入。
- 写入被推入队列
- 稍后,后台工作人员弹出有关该写入的数据并尝试执行它。现在,如果数据库出现故障,它会简单地重新安排写入(或者不确认它,具体取决于队列的能力)。
我认为这与您的选项 #3 最相似。
请注意,此方案意味着所有写入始终通过队列。减少人工干预的需要。当主数据库在凌晨 4 点停机时,您不希望在一秒钟内醒来并更改应用程序配置吗?
我正在为我的应用程序添加一个 运行时配置 ,当启用它时会将所有写入从 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"
...
}
虽然第一个似乎是最不痛苦的,但它似乎不太对劲,因为它看起来太老套而且……不安全。以这种方式存储会丢失/格式错误的数据吗?
你建议我做什么?
当我需要写入以容忍临时数据库停机时,我会通过后台作业队列传递它们。
- 前端收到用户的请求,发现需要写入。
- 写入被推入队列
- 稍后,后台工作人员弹出有关该写入的数据并尝试执行它。现在,如果数据库出现故障,它会简单地重新安排写入(或者不确认它,具体取决于队列的能力)。
我认为这与您的选项 #3 最相似。
请注意,此方案意味着所有写入始终通过队列。减少人工干预的需要。当主数据库在凌晨 4 点停机时,您不希望在一秒钟内醒来并更改应用程序配置吗?