php - 如何结合 REDIS 和 MySQL 进行批量插入以获得更好的性能(实时)

标签 php mysql redis

我必须每秒向 MySQL 数据库插入大约 1000 行,因为对于每个访问者,我必须将 IP、浏览器和国家/地区添加到特定表中以满足统计需要。

逐行插入访问会占用服务器很多性能并遇到很多超时,为了尽量减少这个问题并获得更好的性能,我想结合使用 REDIS + MySQL。

为了实现我的目标,我必须将每次访问都存储到 REDIS 中,并附上准确的日期,包括 JSON 格式的秒数,然后我想从 PHP 脚本中获取该记录并使用 CRONJOB(每个其次是为了让用户实时使用)。

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

在一个查询中插入数据需要很短的时间,并且会大大节省我的服务器的性能。

所以我的确切问题是:

为了能够在可能或不可行的情况下以 JSON 格式为实际日期的每次访问添加一个新条目到 REDIS(这意味着将所有访问信息添加到该日期秒),然后使用 CRONJOB php 脚本,我可以实时获取所有数据并添加到MySQL数据库(对于每添加到MySQL数据库的行都会从REDIS中删除以防止重复)。

最佳答案

在这个方案中你不需要REDIS和JSON。您只需要打开一个文件进行追加(POSIX 规定对追加模式的文件进行原子访问)并逐行写入数据。您还应该创建一个 cron 任务并使用“LOAD DATA ... INFILE”语法将数据导入 MySQL,这比任何带有 INSERT 关键字的 SQL 命令都快。

提示1:可以直接在内存中打开这个文件,提高性能。

提示 2:您可以以二进制格式编写数据(将数字打包为 int32/int64 值而不是字符串 - 查看 pack/unpack 手册页以了解我的意思)。

关于php - 如何结合 REDIS 和 MySQL 进行批量插入以获得更好的性能(实时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518185/

相关文章:

mysql - FluentMigrator 创建 Clob/文本

java - Redis - 处理故障转移和负载平衡?

mysql - 比较 ActiveRecord 结果并只使用不同的结果

database - 雷迪斯 : How to set one key equal to the value of another key?

PHP 解析 XML 以获取多个深度的所有字符串值

javascript - 单击单独的 Div 时显示隐藏的 Iframe

javascript - 使用 Yii2-dynamicforms 更新(嵌套动态表单)

php - mysql 检查最后 x 个帖子的用户 ID

java - 程序的 MySQL boolean 输入未按预期工作

php - 需要将大量 csv 文件插入数据库