`

memcache在大型网站的应用策略

 
阅读更多

【转】memcache在大型网站的应用策略

转自 http://blog.sina.com.cn/s/blog_5f53615f0100qdxc.html
 ,原文不知出处。

蓝色字是我的加重或是注解。

今天看完了日本人mixi写的“memcached全面剖析”的系列文章,结合我在项目中使用memcache的经验,再谈谈memcache在大型网站中的应用策略。

【部署策略】

基于memcached的slab和dump的内存管理方式,它产生的内存碎片比较少,不需要OS去做繁杂的内存回收,所以它对CPU的占用率那是相当的 低。所以建议将它跟占用CPU较高的WEB服务器一起使用来节省成本。当然如果你有大量的廉价PC,那用来专门做memcached服务器也不错。由于32位操作系统中,每个进程最多只能使用2GB内存,所以如果你有大内存的话,可以以daemon的方式启动两个以上的memcached服务,或者干脆用64位的CPU和OS。

【服务监控】

memcached支持分布式机制,php通过memcache::addserver来实现该机制,它实现了如果服务器列表中的一台down掉的时候在 参数retry_interval指定的时间就不会再连接该服务器的机制。所以只要你在该时间段内重启或者修复了该服务器,则不会对前端造成太大的影响。 当然了,如果你一直不去重启该服务器的话,我测试过addserver再次连接一台down掉的服务器的时间将比平时延长了1秒的时间。可以通过 addserver的最后一个参数failure_callback定义一个回调函数来实现邮件通知或者短信通知管理员的功能。

如果是手工重启,我建议将该值设置为20分钟。不过对于memcached进程死掉的服务器,只要重新启动memcached,就可以正常运行,所以采用了监视memcached进程并自动启动的方法的效果最好。mixi推荐的工具:nagios,daemontool

【应用策略】

memcached主要的作用是为减轻大访问量对数据库的冲击,所以一般的逻辑是首先从memcached中读取数据,如果没有就从数据库中读取数据写入 到memcache中,等下一次读取的时候就可以从memcached中读取了。但在项目中的具体应用策略(也就是哪些数据应该缓存?怎么样缓存?过期策 略?)就是个问题了。它的一个总原则是将经常需要从数据库读取的数据缓存在memcached中。这些数据也分为几类:

一、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。

这类数据就使用典型的缓存策略,设置一过合理的过期时间,当数据过期以后再从数据库中读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。

二、经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。

这类数据首先被载入到memcached中,当发生更改(添加、修改、删除)时就清除缓存。在缓存的时候,我将查询的SQL语句md5()得到它的 hash值作为key,结果数组作为值写入memcached,并且将该SQL涉及的table_name以及hash值配对存入memcached中。 当更改了这个表时,我就将与此表相配对的key的缓存全部删除。

三、统计类缓存,比如文章浏览数、网站PV等

此类缓存是将在数据库的中来累加的数据放在memcached来累加。获取也通过memcached来获取。但这样就产生了一个问题,如果 memcached服务器down掉的话这些数据就有可能丢失,所以一般使用memcached的永固性存储,这方面我们新浪使用memcachedb。[PS:这是nosql的地盘了]

四、活跃用户的基本信息或者某篇热门文章。

此类数据的一个特点就是数据都是一行,也就是一个一维数组,当数据被update时(比如修改昵称、文章的评论数),在更改数据库数据的同时,使用Memcache::replace替换掉缓存里的数据。这样就有效了避免了再次查询数据库。

[PS:第五点哪去了?]

六、session数据

使用memcached来存储session的效率是最高的。memcached本身也是非常稳定的,不太用担心它会突然down掉引起session数据的丢失,即使丢失就重新登录了,也没啥。见[多服务器session共享之memcache共享 ]

【总结】

通过以上的策略数据库的压力将会被大大减轻。检验你使用memcached是否得当的方法是查看memcached的命中率。有些策略好的网站的命中率可以到达到90%以上。

【后记】

一、memcached暂时还不支持故障转移,希望在以后的版本中能支持该功能。当然你可以使用日本人平林幹雄的Tokyo Tyrant 来代替memcached,它支持memcached协议,支持永固性存储和故障转移[这个似乎并不是memcached本身语义该做的事情吧] 。但我没有在生产环境中使用过,也没有相关的性能测试数据。以后会试用一下这个东东。

二、memcached不支持检索的功能,在实际使用中比如我们想把一个IP表放在memcached中,来检索某一个IP属于那个地区的话,有了检索功能就方便多了。希望他在以后的版本中能提供该功能。暂时可以通过排序存储和二分法在客户端实现。

三、memcached1.2.2版本确实有不稳定的情况,有时候会出现DOWN机,强烈建议升级至1.2.6的版本。见官方说明:Version 1.2.6 released . Major crash fixes, DTrace support, minor updates. If you have stability issues with any previous release, please upgrade to this one.

分享到:
评论

相关推荐

    MemCache对象缓存应用

    MemCache最初由Danga Interactive开发,现在已成为开源项目,被众多大型网站如Facebook、Twitter等采用。 **二、MemCache的工作原理** MemCache基于键值对(key-value)存储模式,当应用程序需要访问数据时,首先会...

    MemCache开发说明文档

    MemCache是一种广泛应用于Web开发中的高性能分布式内存对象缓存系统,其主要目的是通过将数据存储在内存中...在实际应用中,合理地分配和管理缓存数据,以及调整MemCache的内存大小和过期策略,是优化系统性能的关键。

    【汇总】Memcache

    Memcache最初由Danga Interactive公司开发,现已成为开源项目,被许多大型网站如Facebook、Twitter等采用。它的设计目标是提供一个轻量级的解决方案,用于临时存储热数据,以减少对持久存储(如数据库)的访问。 ##...

    Memcache原理及实现

    Memcache最初由danga.com开发,用于LiveJournal服务,现在已被广泛应用于各种大型网站,作为数据缓存策略的一部分。 1. Memcache工作原理 - 内存管理:Memcache在内存中分配空间,创建一个哈希表来存储数据。这种...

    Memcache缓存技术,Memcache配置说明及其文件,PHP5.2.6版本内存缓存技术配置

    Memcache支持多客户端并发访问,并且通过分布式存储方式处理大量数据,使其成为大型网站和高流量应用的理想选择。 在PHP环境中配置Memcache,首先需要下载并安装Memcache服务器。对于Windows系统,可以找到适用于该...

    Memcache 1.2.6 for Windows

    1. **下载与解压**:从官方网站或者第三方源获取Memcache 1.2.6的Windows版本,解压缩至指定目录。 2. **编译与安装**:使用Visual Studio或其他编译工具编译源代码,生成可执行文件。 3. **配置启动**:修改配置...

    memcache 5.3.3

    Memcache 是一款广泛使用的高性能分布式内存对象缓存系统,主要用于减少数据库负载,提高网站或应用的响应速度。它通过将数据存储在内存中,实现快速读取,尤其适用于处理大量数据的高并发场景。 Memcache 5.3.3 是...

    MemCache Client端类库

    在实际应用中,开发者需要考虑如何有效地整合这个修改后的MemCacheClient库,以充分利用其功能。例如,设计良好的缓存策略可以极大地提高应用程序的响应速度,而合理的异常处理则可以增强系统的稳定性。此外,对于...

    集群环境下memcache解决session共享

    在IT行业中,尤其是在大型Web应用部署中,集群环境是常见的架构模式,以提高系统的可用性和扩展性。然而,集群环境下的session共享问题是个棘手的问题,因为它涉及到用户状态的维护和一致性。本篇将深入探讨如何在...

    Memcache的使用和协议分析详解

    Memcache是一种分布式内存缓存系统,最初由danga.com开发,为LiveJournal提供服务,如今被全球许多大型网站用于缓解数据库压力,实现高负载网站的数据快速访问。它通过将数据存储在内存中,显著提高了数据读取速度,...

    memcache缓存分布式集群

    在大型应用中,单台Memcache服务器可能无法满足高并发和大容量的需求,这时就需要搭建Memcache的分布式集群。 在标题提到的“memcache缓存分布式集群”中,主要涉及以下知识点: 1. **分布式存储原理**:分布式...

    java版memcache缓存管理与开发

    对于大型网站而言,单一Memcache服务器的内存容量有限,因此采用分布式部署成为必然选择。可以通过对键(Key)进行有规律的设计,实现数据的有效分布。例如,在以用户为中心的网站中,可以按照用户ID的前缀来决定...

    PHP实现多服务器session共享之memcache共享.rar

    在网站开发过程中,尤其是涉及到大型分布式系统时,session共享成为一个重要的技术挑战。"PHP实现多服务器session共享之memcache共享"的主题着重于如何在多台服务器之间有效地存储和同步用户的session数据,以确保...

    memcache也spring,hibernate的配置

    标题中的“memcache也spring,hibernate的配置”指的是如何在Java开发环境中,结合Memcached缓存系统、Spring框架和Hibernate持久化框架进行集成配置。Memcached是一种高性能的分布式内存对象缓存系统,用于加速动态...

    memcache分布式缓存的使用

    在大型分布式系统中,单个Memcache实例可能无法满足需求,这时需要进行分布式部署。通过一致性哈希算法,可以将数据均匀地分配到多个Memcache节点上,当有新的节点加入或离开时,尽可能少地改变数据分布,保持系统的...

    memcache简介、安装 and in cakephp

    Memcache最初由Danga Interactive公司开发,现在已经成为开源项目,被许多大型网站如Facebook、Twitter等采用。它的设计目标是简单且高效,支持多种编程语言,包括PHP、Python、Java、C++等,使得开发人员可以轻松地...

    PHP缓存技术:memcache函数详解

    在IT行业中,PHP是一种广泛使用的服务器端脚本语言,尤其在构建动态网站和应用程序时。在处理大量数据或高并发请求时,缓存技术成为提高性能的关键。本篇文章将深入探讨PHP中的缓存技术,特别是关于`memcache`函数的...

    memcache实现网站全局计数器

    2. 分布式:在大型网站中,可以部署多个Memcached实例,实现数据的分布式存储和负载均衡。 3. 减轻数据库压力:计数操作通常涉及频繁的数据库更新,使用Memcached可以避免频繁的数据库交互,提高系统整体性能。 三...

    php_memcache.dll

    2. 分布式部署:在大型应用中,通过多台Memcache服务器实现负载均衡,提高系统可用性和性能。 3. 键命名规范:使用有意义且不冲突的键名,便于管理和查找。 4. 缓存命中率监控:定期检查缓存命中率,调整缓存策略以...

Global site tag (gtag.js) - Google Analytics