各种缓存的比较收藏

各种缓存的比较收藏
基于我开发download的经验,以及对各种缓存的理解,写下面文章与大家分享

一、为什么要使用缓存

l         减少数据库访问,降低数据库压力

l         加速系统访问速度,提升系统性能

二、常用的几种缓存(这里说的均为数据缓存)

l         文件缓存(以文件形式存在磁盘上)

l         Memcache(保存在内存里)

l         前端代理

l         Mysql内存表(这个算不上缓存)

三、比较几种缓存的效率,选出适合自己系统用的缓存架构

l         文件缓存

常用的文件缓存包括:zend cache,各种框架所带的缓存,smarty所带的缓存。

优点:静态化页面使得访问速度加快,降低服务器的压力。

缺点:对于实时性数据或是不断变化的数据会造成数据不同步,当然你会说那我每次可以修改相应的缓存或是删除了再建立,但是这么做一定会造成io的开销,还有就是不要存太大文件,太大文件读取的时候会造成系统开销很大,也不要存太小的文件,太小的文件会造成磁盘碎片。

 

l         Memcached

Memcached作为php5的一个新的扩展缓存类,是一个分布式内存缓存系统

Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。

Memcahce如何部署:

首先启动n个memcache进程,这些进程可以在不同的server的不同端口上.然后使用perl的api可以方便的一次链接多个memcache,存储读取机制不明.不久找到php的一个MemcachedClient类,基本上就是perl里api的再实现.它使用的fscokopen或者socket系列function来直接读取memcache----这说明只要清楚memcache的网络协议,你甚至不用装什么php的memcache extenstion.看了这个类的实现,基本上弄清楚,它的分布式应用差不多就是将不同的key保存在不同的memcache daemon,不会保留多个副本,也就不存在多memcache同步的问题了.

 

memcached也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享

 

优点:通过简单的配置,可以把数据放到另一台机子的缓存,通过socket读取。这种方法比磁盘存储要快很多,减少io读取,提升web的性能。

缺点:如果memcache机子重启,那么所有缓存数据将丢失,不适宜存储永久数据和数据量大的数据。

 

总结:memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。

l         前端代理

我之前涉及的是反相squid代理,用squid代理之后,客户端的请求不会直接访问server,而是先检查代理服务器,如果代理服务器没有,则向服务器请求,否则直接访问代理,这样很到程度上减轻了server的负载。

 

优点:对于大访问量的网站,如果用了squid,很大程度上减轻server的压力,而且我们可以对squid服务器做集群,让负载均衡。

缺点:数据同步的问题。

 

总结:对于访问量大的网站用squid比较合适

 

l         内存表

内存表的特征:给MEMORY表的空间被以小块来分配。表对插入使用100%动态哈希。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在你往表里插入新数据之时被重新使用。MEMORY表也没有通常与在哈希表中删除加插入相关的问题。

·         MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。

·         MEMORY存储引擎执行HASH和BTREE索引。

·        MEMORY不支持BLOB或TEXT列。

·         MEMORY表在所有客户端之间共享(就像其它任何非TEMPORARY表)。

·         服务器需要足够内存来维持所有在同一时间使用的MEMORY表。

优点:读取速度要比MyISAM要快很多,这是因为这类表使用保存在内存中的散列索引。

缺点:当服务器崩溃或是重启,数据将全部丢失。

总结:Heap在插入、查询、更新操作上明显要比MyISAM快,但是删除操作稍微比较慢,可能跟它在内存中的存储结构有关系,所以我们完全可以把Heap作为我们一个MyISAM表的一个备份,比如可以保存一些实时性要求比较高的数据,比如点击量、评论量、固定的用户信息等等,因为这些信息普遍就是插入和查询操作。

 

当然了,Heap也没有比MyISAM快太多,这样说明我的MyISAM速度还是非常快的,所以一般情况下,MyISAM能够满足大部分的应用了,如果数据太多的情况,可以考虑把部分常用的数据保存到Heap表中,同时也可以结合Memcache等缓存工具来帮助缓存数据。

 

四、我们该如何选择:

    根据系统的实际情况选择各种缓存,基于上面的分析,我在这里总结一下。对于永久的数据,或是长时间不变的数据,我们最好缓存成为文件的存储,如果考虑实现分布式内存,以减小系统负载,考虑用memcached,用memcached考虑你的实际网络带宽,还有并发量,因为memcached连接数的限制,而且对内存要求高,对于CPU要求很低,所以常常采用将Memcached服务端和一些CPU高消耗Memory低消耗应用部属在一起。对于内存表的使用,首先使用内存表肯定会和数据库有连接的,也会造成数据库的压力,还有内存表的大小问题,最头疼的就是如果数据库down了,会造成数据丢失,而且存储的字段数以及字段长度受限,所以只存储一些临时数据而且字段的大小不能太大。

 

总结:

    缓存的目的:让被期待性高的数据暂存入性能相对好的存储设备以达到使系统性能提升的目的。任何缓存,无论页面、数据、对象等都是按照上面描述来进行策略选择的。也就是说,不管需要缓存的是什么,你只用选出被期待性高的,然后把他们存入性能相对较好的存储设备就行了。最重要的是找出你系统的瓶颈,然后采用不同的缓存。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ideal_1983/archive/2008/01/28/2069960.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值