首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Redis缓存SQL结果

使用Redis缓存SQL结果
EN

Stack Overflow用户
提问于 2015-07-20 22:07:21
回答 2查看 13.2K关注 0票数 9

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

40%的时间:

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

60%的时间:

  • 基于用户标准的搜索记录

这是我目前的做法:

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

除此之外,我还有一个Redis查找表(Redis设置),它存储MySQL记录ID和Redis缓存键。这样,如果更改了MySQL记录(例如,批量更新),我就可以删除Redis缓存。

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 22:25:50

当涉及到PHP和MySQL (我不确定其他语言)时,这里有一件令人惊讶的事情--而不是将东西缓存到memcached或Redis实际上更快。快多了。基本上,如果你只是建立你的应用程序和查询MySQL -你会从它得到更多。

现在是“为什么”部分。

InnoDB,默认的引擎,是一个极好的引擎。具体来说,它的内存管理(分配和不分配)优于任何内存存储解决方案。这是一个事实,你可以查一下,或者相信我的话--至少,它的表现和雷迪斯一样好。

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

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

所有这一切对你意味着什么?有一个适当的设置可以让你拥有简单、简单、不涉及Redis的小代码,并且消除了缓存失效可能带来的所有问题,也不会浪费内存两次包含相同的数据。

要让这件事发挥作用,你需要的材料如下:

  • php-fpm
  • 基于MySQLInnoDB的表和最充分的内存和调整的innodb_buffer_pool_size变量.它可以控制允许为其目的分配多少内存InnoDB --越大越好。

你把Redis从游戏中剔除了,你保持了代码的简单和易于维护,你没有复制数据,你没有在游戏中引入额外的系统,你让那些用来处理数据的软件来完成它的工作。非常便宜的交易-为了最大的用处,即使你从零开始编译所有的软件-它不会超过一个小时左右,使它的启动和运行。

或者,你可以忽略我写的东西,用Redis寻找一个解决方案。

票数 8
EN

Stack Overflow用户

发布于 2016-02-09 20:08:47

我们遇到了同样的问题,我们选择做您正在考虑的相同的事情:删除受表影响的所有查询缓存。这并不像你说的那样理想,但幸运的是,我们的“写作”还没有达到40%,所以到目前为止还可以。这就是基于查询的缓存的本质。作为另一种选择,您可以添加基于实体的缓存。与其仅缓存搜索结果,不如缓存整个表并在内存中进行搜索。我们使用C# LINQ,所以我们可以在内存中执行相当常见的查询,但是如果搜索太复杂,那么您就不走运了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31527161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档