`
jwen
  • 浏览: 63212 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Memcached深度分析

阅读更多
memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。关于libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。

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

Memcached深度分析

Memcached用途:


(一)Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。

Memcached注意事项:

(一)memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以memcached不能用来持久保存数据。
(二)memcached的实际瓶颈在于网络连接。很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实 memcached使用内存并不会得到成百上千的读写速度提高,因为他的瓶颈在于网络连接。它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。
(三)memcached之间不互相通信。
(四)memcached缺乏认证以及安全管制,所以memcached服务器应该放置在防火墙后。

范例

将纯粹使用数据库查询的程式码加上memcached支援是很简单的,假设这是原来的程式码:

//最原始的方法,直接从数据库获取数据
function get_foo (int userid) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
return result; //加上memcached的快取机制后:
function get_foo (int userid) {
result = memcached_fetch("userrow:" + userid);
if (!result) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
memcached_add("userrow:" + userid, result);
}
return result;

上述的程式会先到memcached检查是否有userrow:userid的资料,如果有则直接传回结果,如果不存在时再去数据库查询,并将结果放到memcached内。

有一个问题,如果在memcached内已经有缓存数据时,而数据库的数据被更新后,上述的程式会抓到旧的数据,这是属于Cache coherency的问题。其中一种解决的方法是在更新数据库时,同时更新memcached内的数据:

//数据库更新数据的方法
function update_foo(int userid, string dbUpdateString) {
result = db_execute(dbUpdateString);
if (result) {
data = createUserDataFromDBString(dbUpdateString);
memcached_set("userrow:"+userid, data);
}
}


  • 大小: 14.4 KB
  • 大小: 22.2 KB
分享到:
评论

相关推荐

    Memcached深度分析.docx

    **Memcached深度解析** Memcached是由danga.com(LiveJournal的技术团队)开发的一款分布式内存对象缓存系统,其设计初衷是减轻动态系统中的数据库负载,从而提升系统的整体性能。作为一个广泛应用的开源软件,...

    memcached官方jar和一些网上的资料

    **Memcached 深度解析** Memcached 是一个高性能、分布式的内存对象缓存系统,最初由 Danga Interactive 创建,现已成为许多Web应用程序中的标准组件。它被设计用来减轻数据库的负载,通过将数据存储在内存中,快速...

    集中式缓存系统 memcached.zip

    **集中式缓存系统 Memcached 深度解析** Memcached 是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。其设计目标是通过在内存中存储数据来减少对数据库的...

    memcache源码分析

    包含资源:memcached代码分析详解 memcached命令参数大全 memcached深度分析 memcached完全剖析(1-5)整理 memcached源码分析(自己整理 未完) Memcached源码剖析笔记 分布式存储系统架构

    神级memcached源代码分析文档_1.4.0代码分析

    《深入解析Memcached源代码——基于1.4.0版本》 Memcached,这个被广泛应用于众多知名互联网公司的分布式内存对象缓存系统,其源代码分析对于提升系统性能和理解其实现原理至关重要。本文将围绕以下几个核心部分...

    memcached完全剖析ehcache memcached redis 缓存技术总结

    3. **扩展性**:与Spring框架深度集成,便于在企业级应用中使用。 4. **优点**:提供了丰富的特性和管理工具,支持数据备份和恢复。 5. **缺点**:相比Memcached,资源消耗可能较大。 6. **应用场景**:适用于需要...

    《PHP深度分析》随书代码

    《PHP深度分析》随书代码是一份非常宝贵的资源,它为读者提供了书中理论知识的实践示例,帮助读者深入理解PHP编程的各个方面。这个压缩包包含的文件是书中的实际代码示例,让读者能够动手操作,从而更好地掌握PHP...

    PHP深度分析:101个核心技巧、窍门和问题解决方法 + 源代码

    《PHP深度分析:101个核心技巧、窍门和问题解决方法》是一本专为PHP开发者准备的进阶教程,旨在帮助读者深入理解PHP语言并掌握一系列实用的编程技巧。书中结合源代码实例,提供了丰富的实践指导,涵盖从基础到高级的...

    memached alisoft

    《阿里云平台ASF缓存与Memcached的深度解析》 在现代互联网应用中,缓存技术扮演着至关重要的角色,它能显著提升系统的响应速度和处理能力。本文将重点探讨阿里巴巴开源项目“alisoft-xplatform-asf-cache-2.5.1”...

    Redis面试题深度解析:技术要点与实战应用.zip

    - Redis和Memcached的区别? - Redis如何解决数据一致性问题? - Redis集群中的槽分配策略是什么? - 如何防止Redis缓存击穿? 6. 解决方案设计: - 高并发下的限流:使用Redis实现令牌桶或漏桶算法。 - ...

    破坏之王 DDoS攻击与防范深度剖析.pdf

    ### DDoS攻击与防范深度剖析 #### 一、DDoS攻击概述 ##### 1.1 定义 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击是一种网络攻击方式,攻击者通过控制多台计算机(通常称为“僵尸网络”)向目标...

Global site tag (gtag.js) - Google Analytics