memcached或MongoDB来减轻繁重的数据库调用

时间:2014-01-20 18:06:00

标签: php mysql mongodb memcached

最近,我的网站每天都有大约250万次点击(平均)。我记录每一页(这是一个成人网站)的点击量,所以我能够有一个显示顶级网站,模型,画廊和图像的十大类。我记录了命中以及用户IP,因此这些单独的部分每24小时仅为每个用户增加一次。这个问题是它每次更新都会更新mysql数据库。当然,我的网站已经开始收到504错误。

我环顾四周,看到memcached可能是一个解决方案。将命中存储在内存中并每隔X分钟推送到数据库。我也看到有人建议使用MongoDB,据我所知,这也是一种内存类型存储。这会是要走的路吗?你会推荐memcached或MongoDB来做我想做的事吗?或者这不是继续进行的方式,因为它只是意味着在更短的时间范围内进行更多的mysql调用(例如,每一分钟就意味着每秒钟的点击次数为60秒而不是每秒的小批次)。

我的服务器上安装了memcached和MongoDB,所以要么是一个选项。

2 个答案:

答案 0 :(得分:1)

如果没有新的软件包,可能会有更容易的解决方案来获得更好的数据库性能。你提到的数量不是特别大。 我将列出许多可能性中的一小部分。 1.如果您使用的是早于5.6的mysql版本,那么更新到5.6+几乎肯定会产生非常显着的改进,因为5.6及更高版本的存储引擎要好得多。 2.如果最繁忙的表使用innodb以外的存储引擎,则切换到innodb。 [你可以用phpmyadmin做到这一点] 3.获取一些帮助调整my.ini中的缓冲区大小[需要一些技巧]和/或增加数据库服务器上的ram。 4.考虑将工作负载分散到更多驱动器和/或将部分或全部数据库切换到固态驱动器[或更好的传统驱动器] 5.如果数据库服务器是内存或计算绑定的,则可能需要更大或更多的服务器。 6.确保瓶颈不在数据库服务器的外部。

答案 1 :(得分:0)

此站点(stackoverflow.com)实现它的方式是维护问题视图的内存数据结构,每15分钟左右刷新一次到DB。没有必要通过保存每次命中来压力DB - 过多的IO。这种内存中的结构可以作为ip和hits / time的映射在你的应用程序中,也可以在memcached中。我不认为你真的需要memcached用于此目的。 因此,进行批量更新的一般想法是很好的。