使用Redis缓存SQL结果

Der*_* C. 8 mysql database caching redis

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

40%的时间:

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

60%的时间:

  • 根据用户的标准搜索记录

这是我目前的做法:

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

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

如果在系统缓存搜索结果后创建新记录怎么办?如果新记录与搜索条件匹配,系统将始终返回旧缓存(不包括新记录),直到删除缓存(在缓存中的现有记录更新之前不会发生).

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

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

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

N.B*_*.B. 6

这是一个令人惊讶的事情,当涉及到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 一样简单,并且在数据库正在耗尽的情况下添加 mysql 节点而不是添加缓存层来吸收实际数据库引擎的热量更有意义. 这是否也适用于您的数据库大小为 TB 的情况?甚至可以轻松添加数据库的廉价节点吗?想象一个 OSM postgres 场景,即使使用极其昂贵的硬件,构建索引也可能需要数周时间?我不认为我是支持不合理偏好的人:) (2认同)
  • 我真的很抱歉让你如此心烦意乱.老实说,我不是想把你拖到任何地方.你似乎对这个问题过热,实际上是在争论它.我只是真的认为你的答案缺乏可信度.如果你认为我的评论在另一方面缺乏可信度,你可以忍受它.再次抱歉.并不意味着挑衅你或任何东西. (2认同)