我有一个基于SQL的应用程序,我喜欢使用Redis缓存结果。您可以将应用程序看作具有多个SQL表的通讯簿。应用程序执行下列任务:
40%的时间:
60%的时间:
这是我目前的做法:
除此之外,我还有一个Redis查找表(Redis设置),它存储MySQL记录ID和Redis缓存键。这样,如果更改了MySQL记录(例如,批量更新),我就可以删除Redis缓存。
如果在系统缓存搜索结果之后创建了新记录怎么办?如果新记录与搜索条件匹配,系统将始终返回旧缓存(不包括新记录),直到缓存被删除(在更新缓存中的现有记录之前不会发生)。
搜索是由用户驱动的,搜索条件的组合是数不胜数的。在创建新记录时,无法评估应该删除哪个缓存。
到目前为止,唯一的解决方案是在创建记录时删除MySQL表的所有缓存。但是,这不是一个好的选择,因为每天都会创建大量的记录。
在这种情况下,在MySQL上实现Redis的最佳方法是什么?
发布于 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-fpmMySQL和InnoDB的表和最充分的内存和调整的innodb_buffer_pool_size变量.它可以控制允许为其目的分配多少内存InnoDB --越大越好。你把Redis从游戏中剔除了,你保持了代码的简单和易于维护,你没有复制数据,你没有在游戏中引入额外的系统,你让那些用来处理数据的软件来完成它的工作。非常便宜的交易-为了最大的用处,即使你从零开始编译所有的软件-它不会超过一个小时左右,使它的启动和运行。
或者,你可以忽略我写的东西,用Redis寻找一个解决方案。
发布于 2016-02-09 20:08:47
我们遇到了同样的问题,我们选择做您正在考虑的相同的事情:删除受表影响的所有查询缓存。这并不像你说的那样理想,但幸运的是,我们的“写作”还没有达到40%,所以到目前为止还可以。这就是基于查询的缓存的本质。作为另一种选择,您可以添加基于实体的缓存。与其仅缓存搜索结果,不如缓存整个表并在内存中进行搜索。我们使用C# LINQ,所以我们可以在内存中执行相当常见的查询,但是如果搜索太复杂,那么您就不走运了。
https://stackoverflow.com/questions/31527161
复制相似问题