最快的数据库引擎用于缓存?

时间:2010-12-15 00:53:02

标签: php database caching

我将MySQL用于我的主数据库,在那里我保留了实际的对象。使用模板渲染对象时,渲染需要花费大量时间。

因此我决定缓存生成的HTML。现在我将缓存存储在名为相应的文件中,并且它的工作速度明显更快。但我知道这不是最好的方法。

我需要一个(最好是键值)数据库来存储我的缓存。我不能使用缓存代理,因为我仍然需要处理缓存的HTML。是否有这样一个带有PHP前端的数据库?

编辑:如果我使用memcached,并且我缓存了大约一百万页,那么我的内存不会用完吗?

编辑2 再次,我有很多的HTML来缓存(千兆字节)。

8 个答案:

答案 0 :(得分:4)

  

如果我使用memcached,我就缓存一下   一百万页,我不会用完   RAM?

Memcached的

memcached也是一个真正的坚实产品(如redis更多),用于所有大型网站,以保持它们正常运行。几乎活跃的推文(用户获取)都存储在memcached中以获得疯狂的性能。

如果你想要快,你应该在内存中有你的活动数据集。但是,如果数据集大于您的可用内存(应始终将数据存储在持久数据存储区中,因为memcached是易失性的),请将数据存储在持久数据存储区中,例如mysql。当它在内存中不可用时,您将尝试从数据存储区中获取它并将其缓存到内存缓存以供将来参考(使用过期标头)。

Redis的

我非常喜欢redis因为它是一个具有疯狂性能的高级键值存储

  

Redis是一个高级键值存储。   它类似于memcached但是   数据集不是易失性的,也不是值   可以是字符串,完全像   memcached,但也列出,设置和   有序集。所有这些数据类型都可以   用原子操作来操纵   推送/弹出元素,添加/删除   元素,执行服务器端联合,   交集,集之间的差异,   等等。 Redis支持不同的   一种分类能力。

Redis有一个VM,因此您不需要单独的persicent数据存储区。我真的很喜欢redis,因为所有可用的commands(强力:)?)。 simon willison的tutorial显示了(很多)redis所拥有的原始力量。

速度

Redis 非常快!,110000 SETs /秒,入门级Linux机箱中的81000 GET /秒。 Check the benchmarks

提交

Redis更积极地开发。 8小时前antirez(redis)commited与memcached 11月12日最新commit

安装Redis

Redis非常容易安装。它没有依赖关系。你只需要执行:

make
./redis-server redis.conf #start redis

编译redis(太棒了:)?)。

安装Memcached

Memcached具有依赖性(libevent),这使install更加困难。

wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure
make && make test
sudo make install

并非完全正确,因为memcached具有libevent依赖性,./configure将失败libevent。但是他们再次packages很酷,但需要安装root

答案 1 :(得分:4)

  

Redis相当快:110,000   套/秒

如果速度是一个问题,为什么要使用网络层?

根据:http://tokutek.com/downloads/mysqluc-2010-fractal-trees.pdf

  • InnoDB每秒插入.................... 43,000条记录AT ITS PEAK *;
  • TokuDB插入....................每秒34,000条记录AT ITS PEAK *;
  • G-WAN KV每秒插入100,000,000条记录

(*)经过几千次插入后,InnoDB和TokuDB的性能严重下降,当它们的缓存和系统缓存以及磁盘控制器缓存已满时,它们会写入磁盘。有关InnoDB数据库索引拓扑结构引起的问题的有趣讨论,请参阅PDF(严重破坏局部性,而Fractals拓扑结构扩展得更好......但仍然不是线性的)。

答案 2 :(得分:2)

将答案阐明为逻辑视图:

  • 平面文件与正在使用的存储介质(DISK或RAM)一样快
  • 在RAM中缓存MRU(最近使用的)项目的环境
  • 解决方案具有所有位置的智能/快速哈希索引(SQL系统依赖的内容)

这种组合将为您提供最佳解决方案。

为了论证,平面文件与否 - 不包括MEMORY ONLY解决方案 - 所有引擎都使用某种形式的平面文件。神奇的是知道数据的位置,调整读取以将数据拉回到最佳状态。在IBM的80年代,我们使用了固定记录长度的平面文件设计 - 它没有针对磁盘空间进行优化,而是针对I / O进行了优化。然后索引基于记录长度* ROWID。

现在根据您的需要,您的最终表现是引入智能组合 - 我们拥有超过100万家公司,每家公司超过10页 - 1000万个文件,以及js,css和图像。

理论1) - 您知道您的限制是RAM - 在可行时将动态内容假脱机到磁盘并丢弃诸如命中计数器之类的功能。利用NGINX或HIGHLY调整APACHE(或者像我们一样,自2001年以来编写我们自己的Web服务器) - 整个概念是利用RAM进行MOST USED,并且对基于磁盘的内容进行非常智能的查找 - 通常URI很好。 / p>

理论2) - 趋势分析和用户期待 - 我花了数年时间研究和开发跟踪趋势的系统。如果我知道用户将进入路径A,B,C,D - 那么当他击中B时,我已经预取了C和D.如果我知道用户将去A,B但是可以去E然后D.你有选择预先缓存C和E,或者为了RAM预取D.并在用户选择时手动获取C或E.

我们开发的Web服务器以及我多年来开发的一些会计系统将Theory 2与预取相结合,并结合了智能缓存。我们还在deflate中将内容存储到磁盘 - 因此传输层只是将内容泵入堆栈,因为99%的浏览器都支持缩减流。 (在发送1%之前进行重新整理比在99%的时间内放松更快)

根据MEMCACHED和SWAP的想法 - 磁盘速度是你的敌人,然而,捆绑内核来管理那个敌人是一个史诗般的失败!如果您想要击败MEMCACHED性能,请学习如何设置RAM磁盘并在那里保留您放弃的HOT请求项目!

**免责声明:这一切都假设您拥有足够的带宽,您的基础设施/用户带宽不是您的瓶颈,而是您的服务器。 @ 3FINC

答案 3 :(得分:1)

答案 4 :(得分:1)

平面文件在技术上是最快的 - 但是如果你正在寻找带有PHP前端的东西并且只是尖叫 - 请看看postgres。

http://www.wikivs.com/wiki/MySQL_vs_PostgreSQL#Raw_Speed

对于内存缓存,请查看memcached

http://memcached.org/

*编辑:从您的编辑...(冗余是)...如果您将该卷缓存在内存中,您将遇到问题。查看postgres柱状表查询或准自定义平面文件解决方案。

答案 5 :(得分:0)

据我所知,使用文件系统实际上是缓存渲染模板的最快方法,而无需将其存储在内存中。任何数据库都会简单地增加开销,并且通过比较会使整个事情变慢。

答案 6 :(得分:0)

我会使用memcachedAPC。取决于您是否需要在服务器之间共享缓存。 Memcached是你连接的守护进程,其中APC实际上在PHP实例中(更快一点)。它们都将缓存存储在内存中,因此速度非常快。

答案 7 :(得分:0)

实际上,在文件中存储缓存实际上是最快的方法。但是,如果您真的对将它们放入数据库感兴趣,可以查看MongoDB。 MongoDB是一个面向文档的数据库,所以没有服务器端连接,这就是为什么它比mysql更快(1.使用php 2.互联网上有很多基准测试)。

相关问题