我必须每秒向 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/