Der*_* C. 8 mysql database caching redis
我有一个基于SQL的应用程序,我喜欢使用Redis缓存结果.您可以将应用程序视为具有多个SQL表的通讯簿.该应用程序执行以下任务:
40%的时间:
60%的时间:
这是我目前的做法:
最重要的是,我有一个Redis查找表(Redis Set),它存储MySQL记录ID和Redis缓存键.这样我可以删除Redis缓存,如果MySQL记录已经更改(例如,批量更新).
如果在系统缓存搜索结果后创建新记录怎么办?如果新记录与搜索条件匹配,系统将始终返回旧缓存(不包括新记录),直到删除缓存(在缓存中的现有记录更新之前不会发生).
搜索由用户驱动,搜索条件的组合是无数的.创建新记录时,无法评估应删除哪个缓存.
到目前为止,唯一的解决方案是在创建记录时删除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-fpmMySQL和InnoDB基础表,最重要的是 - 足够的RAM和调整innodb_buffer_pool_size变量.那个控制InnoDB允许为其目的分配多少RAM - 越大越好.你从游戏中消除了Redis,你保持你的代码简单易维护,你没有重复数据,你没有在游戏中引入额外的系统,你让那些打算处理数据的软件完成它的工作.即使您从头开始编译所有软件,也可以通过相当便宜的折衷来获得最大的实用性 - 启动和运行它不会超过一个小时左右.
或者,您可以忽略我写的内容并使用Redis寻找解决方案.
| 归档时间: |
|
| 查看次数: |
9431 次 |
| 最近记录: |