gpt4 book ai didi

mysql - 使用 Redis 缓存 SQL 结果

转载 作者:IT王子 更新时间:2023-10-29 05:57:23 26 4
gpt4 key购买 nike

我有一个基于 SQL 的应用程序,我喜欢使用 Redis 缓存结果。您可以将该应用程序视为具有多个 SQL 表的地址簿。该应用程序执行以下任务:

40% 的时间:

  • 创建新记录/更新现有记录
  • 批量更新多条记录
  • 查看现有记录

60% 的时间:

  • 根据用户的条件搜索记录

这是我目前的做法:

  • 系统在创建或更新记录时缓存记录。
  • 当用户进行搜索时,系统会缓存查询结果。

最重要的是,我有一个 Redis 查找表 (Redis Set),它存储 MySQL 记录 ID 和 Redis 缓存键。这样,如果 MySQL 记录已更改(例如,批量更新),我可以删除 Redis 缓存。

如果系统缓存搜索结果后创建了一条新记录怎么办?如果新记录符合搜索条件,系统将始终返回旧缓存(不包括新记录),直到缓存被删除(直到更新缓存中的现有记录才会发生)。

搜索由用户驱动,搜索条件的组合数不胜数。无法评估在创建新记录时应删除哪个缓存。

到目前为止,唯一的解决方案是在创建记录时删除 MySQL 表的所有缓存。然而,这不是一个好的选择,因为每天都会创建大量记录。

在这种情况下,在 MySQL 之上实现 Redis 的最佳方式是什么?

最佳答案

关于 PHP 和 MySQL(我不确定其他语言)有一件令人惊讶的事情 - 将内容缓存到 memcached 或 Redis 实际上更快。快多了。基本上,如果您只是构建您的应用程序并查询 MySQL - 您会从中得到更多。

现在是“为什么”部分。

InnoDB,默认引擎,是一个极好的引擎。具体来说,它的内存管理(分配等)优于任何内存存储解决方案。这是事实,您可以查阅它或相信我的话 - 至少,它的性能与 Redis 一样好。

现在您的应用中发生了什么——您查询 MySQL 并将结果缓存到 Redis 中。然而,MySQL 也足够聪明,可以保留缓存的结果。您刚才所做的是创建连接到 Redis 所需的附加文件描述符。您还使用了一些存储(RAM)来缓存 MySQL 已经缓存的结果。

这是另一个有趣的部分 - 提供 PHP 脚本的首选方式是使用 php-fpm - 它比任何 mod_* 垃圾都快得多。归根结底,php-fpm 是一个生成子进程的主管进程。它们在提供脚本后不会关闭,这意味着它们会缓存与 MySQL 的连接——连接一次,使用多次。基本上,如果您使用 php-fpm 提供脚本,它们将重用已经建立的与 MySQL 的连接,这意味着您不会为每个请求打开和关闭连接——这是非常资源友好的,它让您可以快速连接到 MySQL。 MySQL 具有内存效率和缓存结果,比 Redis 快得多。

现在,所有这些对您意味着什么 - 进行适当的设置可以让您拥有简单、容易、不涉及 Redis 的小代码,并消除您可能遇到的所有缓存失效问题,而您赢了不要浪费你的内存来包含相同的数据两次。

实现此功能所需的成分:

  • php-fpm
  • MySQLInnoDB 基于表,最重要的是 - 足够的 RAM 和经过调整的 innodb_buffer_pool_size 变量。那个控制允许 InnoDB 为其目的分配多少 RAM - 越大越好。

您从游戏中消除了 Redis,保持代码简单易维护,没有重复数据,没有为游戏引入额外的系统,让旨在处理数据的软件来完成它工作。即使您从头开始编译所有软件,以非常便宜的方式换取最大的实用性 - 启动和运行它也不会超过一个小时。

或者,您可以忽略我写的内容并使用 Redis 寻找解决方案。

关于mysql - 使用 Redis 缓存 SQL 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31527161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com