Memcached 原理剖析
Memcached使用及原理

研发管理部 陈海涛 2011-06-10
2014-6-25
1
什么是Memcached
Memcached是(运营LiveJournal的技术团队)开发的一套分布式内存对象
缓存系统。常用于减少数据库负载,提升性能。 社区网站主页:/ 开发团队主页:/ 项目主页:/
结果:老数据留在尾部(tail)。
2014-6-25 © 2004 - 2010 UC Mobile
16
Set时LRU
set时要为当前key分配内存 先从本slab队尾检查是否有过期数 据,共检查50条。
是否查到过期数据, 查到则淘汰1条后中止。 NO 新分配内存是否OK (是否还有可用内存)? NO 是否设置了-M参数表示不能踢 出有效数据 YES NO YES 内存分配失 败,返回出错 YES
2014-6-25 © 2004 - 2010 UC Mobile
7
分布式-客户端实现
2014-6-25 © 2004 - 2010 UC Mobile
8
分布式-一致性hash
2014-6-25 © 2004 - 2010 UC Mobile
9
内存管理-术语
2014-6-25 © 2004 - 2010 UC Mobile
2014-6-25 © 2004 - 2010 UC Mobile
6
常用优化参数
-f <factor> chunk size的增长因子(合理范围 1.05~2,默认:1.25) -t <num> memcached启动的工作线程数,默 认为4,建议不要超过系统CPU的个数。 -I <num>[k|K|m|M] 改变slab page的容量 大小,以调整ITEM容量的最大值,默认为1MB。 不能少于1024bytes(即1K),不能大 于128MB。memcached不推荐大于1MB。
memcached原理

memcached原理Memcached是一种分布式内存对象缓存系统,常常被用于动态Web 应用中减轻数据库负载。
它将数据存储在内存中,并通过哈希算法对其进行管理,应用程序可以直接从内存中读取缓存数据,达到加速访问的目的。
Memcached的运行原理:它使用一个客户端-服务端的架构模型,其中客户端与服务器之间通过TCP/IP协议进行通信。
使用者需要将需要存储的key-value对发送到Memcached服务器,然后服务器将这些数据存储在内存中,当调用者需要获取相应的数据时,直接从内存中读取。
如果数据不存在,Memcached将返回一个空响应。
Memcached的特点:1.高速缓存:Memcached是内存中的缓存系统,访问速度非常快;2.内存管理:Memcached使用LRU算法释放内存中不在使用的数据;3.可扩展:Memcached可以非常容易的扩展。
为什么要使用Memcached?1.加速访问:Memcached非常适合访问频繁但数据变化不步的情况,通过加速访问可以提高网站的响应速度。
2.降低数据库压力:将一部分数据放入Memcached缓存中,当这些数据正在使用时,可以减轻数据库的负载,提高数据库的性能。
3.可扩展性:通过横向扩展,可以使Memcached轻松适应大量数据的存储要求,同时保持高速缓存的性能。
如何使用Memcached?1.安装配置:将Memcached服务器安装在适当的机器上,并根据需要进行相应的配置。
2.使用客户端:可以使用各种语言的客户端库来使用Memcached,包括PHP,Python,Java等。
3.使用API调用:通过API直接从客户端调用Memcached提供的方法来获取需要的数据。
总之,Memcached是一个非常实用的高速缓存系统,可以用于加速Web应用程序的访问,并降低数据库的负载。
它的运行原理简单易懂,安装和配置也非常容易,是一个非常值得使用的缓存系统。
Memcached源码剖析笔记

Memcached源码剖析笔记XguruMemcached是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于通过减轻数据库负载来使动态Web应用程序提速。
目录1.背景 (3)2.memcached的安装 (4)3.memcached的配置 (5)4.memcached的使用 (6)4.1.存储命令 (7)4.2.读取命令 (8)4.3.删除命令 (8)4.4.高级命令 (9)4.5.其他命令 (10)5.Memcached内部工作机制 (11)5.1.Memcached基本的数据结构 (11)5.2.基本设计概念和处理流程 (12)5.3.内部Hash机制 (15)5.3.1.Hash函数及冲突解决 (15)5.3.2.HashTable主要函数 (15)5.4.slab内存处理机制 (17)5.4.1.slab主要函数 (17)5.4.2.slab机制中所采用的LRU算法 (19)5.5.控制item各种函数 (20)5.6.守护进程机制 (22)5.7.Socket处理机制 (23)15.7.1.Unix域协议 (23)5.7.2.TCP/UDP协议 (24)5.8.多线程处理机制 (25)5.9.事件处理机制 (25)6.未完善之处 (27)7.参考文献 (28)21.背景Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached基于一个存储键/值对的hashmap。
Memcached是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于通过减轻数据库负载来使动态Web应用程序提速。
Memcached是一个在内存中对任意的数据(比如字符串,对象等)所使用的key-value 存储。
数据可以来自数据库调用,API调用,或者页面渲染的结果。
MemCache详细解读

MemCache详细解读MemCache是什么MemCache是⼀个⾃由、源码开放、⾼性能、分布式的分布式内存对象缓存系统,⽤于动态Web应⽤以减轻数据库的负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从⽽提⾼了⽹站访问的速度。
MemCaChe是⼀个存储键值对的HashMap,在内存中对任意的数据(⽐如字符串、对象等)所使⽤的key-value存储,数据可以来⾃数据库调⽤、API调⽤,或者页⾯渲染的结果。
MemCache设计理念就是⼩⽽强⼤,它简单的设计促进了快速部署、易于开发并解决⾯对⼤规模的数据缓存的许多难题,⽽所开放的API使得MemCache能⽤于Java、C/C++/C#、Perl、Python、PHP、Ruby等⼤部分流⾏的程序语⾔。
另外,说⼀下MemCache和MemCached的区别:1、MemCache是项⽬的名称2、MemCached是MemCache服务器端可以执⾏⽂件的名称MemCache访问模型为了加深理解,我模仿着原阿⾥技术专家李智慧⽼师《⼤型⽹站技术架构核⼼原理与案例分析》⼀书MemCache部分,⾃⼰画了⼀张图:特别澄清⼀个问题,MemCache虽然被称为"分布式缓存",但是MemCache本⾝完全不具备分布式的功能,MemCache集群之间不会相互通信(与之形成对⽐的,⽐如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),所谓的"分布式",完全依赖于客户端程序的实现,就像上⾯这张图的流程⼀样。
同时基于这张图,理⼀下MemCache⼀次写缓存的流程:1、应⽤程序输⼊需要写缓存的数据2、API将Key输⼊路由算法模块,路由算法根据Key和MemCache集群服务器列表得到⼀台服务器编号3、由服务器编号得到MemCache及其的ip地址和端⼝号4、API调⽤通信模块和指定编号的服务器通信,将数据写⼊该服务器,完成⼀次分布式缓存的写操作读缓存和写缓存⼀样,只要使⽤相同的路由算法和服务器列表,只要应⽤程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。
Memcached分布式缓存简介

一.什么是MemcachedMemcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
相信很多人都用过缓存,在.net 中也有内置的缓存机制,还有很多第三方工具如apache,nginx等可以做静态资源的缓存,同时我们也可以制定自己的缓存机制,缓存数据库查询的数据以减少对数据库的频繁操作。
但是很多时候我们总是感觉这些缓存总不尽人意,Memcached可以解决你不少的烦恼问题。
最少在我的学习中解决了我不少问题,所以决定记录下来分享。
Memcached基于一个存储键/值对的hashmap。
其守护进程是用C写的,但是客户端可以用任何语言来编写(本文使用C#作为例子),并通过memcached协议与守护进程通信。
可能这些东西都太高深了,我们暂不做研究。
二.分布式缓存其实 Memcached作为一个分布式缓存数据服务,但是每个服务之间根本没有进行相互通信,这里可能与我理解的分布式有点区别,可能是我才疏学浅,也可能是每个人思考问题的角度不同。
Memcached 客户端就是通过一种分布式算法将数据保存到不同的Memcached服务器上,将数据进行缓存。
分布式缓存,可以而知memcached可以进行大数据量的缓存。
这点可以弥补我们之前很多人都遇到的将数据缓存到应用服务器上,而且只能缓存少量数据,否则对应用服务器的影响非常大。
Memcached应用机制图:这个图是有点简陋了,但是问题还是能够描述的清楚的,缓存机制的基本原理就是先查询数据保存到memcached中,地址在此请求就直接从Memcached缓存中取数据,这样就可以减少对服务器请求压力。
三.Memcached 特征(1)协议简单: 不使用复杂的xml格式,而是使用文本格式(2)基于libevent的事件处理机制 (不懂)(3)内置内存存储方式: 数据存在在内存中,所以重启机器会导致数据丢失(4)Memcached相互不通信的分布式: Memcached 服务器之间不会进行通信,数据都是通过客户端的分布式算法存储到各个服务器中四.Memcached的安装首先这里是在windows系统上做测试,Memcached在linux等非windows平台上性能会更高。
memcached内存管理与删除机制及服务器实现 -回复

memcached内存管理与删除机制及服务器实现-回复memcached是一款高性能的分布式内存对象缓存系统,常用于动态网站的加速和负载均衡。
作为一种缓存系统,它的内存管理和删除机制对于系统的性能和稳定性非常重要。
本文将一步一步回答有关memcached的内存管理与删除机制及服务器实现的内容。
一、memcached的内存管理机制1. 内存分配memcached使用一个内存池来管理内存,即在启动时分配一块可用于缓存的大内存块,然后根据需要将其划分为多个固定大小的内存块,这样可以提高内存使用效率。
在内存分配时,memcached使用slab分配器来实现。
slab分配器将内存块按照不同大小的chunk(或者称为slab class)分成多个组,每个组里的chunk大小都会是这个组的最小chunk大小的倍数。
这种分配方式可以降低内存碎片,提高内存利用率。
2. 内存回收memcached使用了简单的LRU算法(最近最少使用算法)来进行内存回收。
当内存达到上限时,会根据数据的使用频率来决定哪些数据应该被淘汰。
LRU算法会在内存不足时,将最近最少被访问的数据从缓存中删除,以腾出内存供新数据使用。
3. LRU算法和内存回收LRU算法是一种常用的缓存淘汰算法,它根据数据的访问时间来判断哪些数据是冷数据(很久没有被访问的数据),从而可以将这些冷数据淘汰出缓存。
在memcached中,LRU算法的具体实现是通过维护一个LRU队列来实现的,最前面的元素代表最近最少访问的数据,最后面的元素代表最近最频繁访问的数据。
当内存不足时,memcached会从LRU队列末尾开始淘汰数据,直到满足内存需求为止。
二、memcached的删除机制1. 手动删除memcached提供了delete命令来手动删除指定的键值对。
使用delete 命令可以通过键来删除对应的缓存数据。
2. 过期删除memcached支持设置键值对的过期时间,当数据的过期时间到达时,memcached会自动删除对应的数据。
Memcached数据库缓存

Memcached数据库缓存Memcached⼀、Memcached简介Memcached是⼀个开源的,⽀持⾼性能,⾼并发的分布式内存缓存系统,由C语⾔编写,总共2000多⾏代码。
从软件名称上看,前3个字符“Mem”就是内存的意思,⽽接下来的后⾯5个字符“cache”就是缓存的意思,最后⼀个字符d,是daemon的意思,代表是服务器端守护进程模式服务。
Memcached服务分为服务器端和客户端两部分,其中,服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的名字形如Memcache-2.25.tar.gz Memcached的作⽤传统场景中,多数Web应⽤都将数据保存到关系型数据库中(例如:MySQL),Web服务器从中读取数据并在浏览器中显⽰。
但随着数据量的增⼤,访问的集中,关系型数据库的负担就会出现加重,响应缓慢,导致⽹站打开延迟等问题,影响⽤户体验。
这时就需要Memcached软件出马了。
使⽤Memcached的主要⽬的是,通过在⾃⾝内存中缓存关系型数据库的查询结果,减少数据库被访问的次数,以提⾼动态Web应⽤的速度,提⾼⽹站架构的并发能⼒和可扩展性。
Memcached服务的运⾏原理是通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直接⾼并发访问,从⽽提升⼤规模⽹站集群中动态服务的并发访问能⼒。
-⽣产场景的Memcached服务⼀般被⽤来保存⽹站中经常被读取的对象或数据,就像我们的客户端浏览器也会把经常访问的⽹页缓存起来⼀样,通过内存缓存来存取对象或数据要⽐磁盘存取快很多,因为磁盘是机械的,因此,在当今的IT企业中,Memcached的应⽤范围很⼴泛。
互联⽹常见内存缓存服务软件⼆、Memcached的⽤户与应⽤场景 1、Memcached常见⽤途⼯作流程Memcached是⼀种内存缓存软件,在⼯作中经常⽤来缓存数据库的查询数据,数据被缓存在事先与分配的Memcached管理的内存中,可以通过API或命令的⽅式存取内存中缓存的这些数据,Memcached服务内存中缓存的数据就像⼀张巨⼤的hash表,每条数据都是以key-value对的形式存在。
memcached工作原理

memcached工作原理
memcached是一款高性能的分布式内存缓存系统,主要用于减轻数据库负载,提高应用程序的性能。
其工作原理如下:
1. 客户端向memcached服务器发送请求,请求可以是获取或设置缓存数据。
2. 如果请求是获取缓存数据,memcached服务器首先检查是否有该数据的缓存副本,如果有,则返回该数据给客户端。
3. 如果请求是设置缓存数据,memcached服务器将数据存储到其内存中,并设置相应的索引。
4. 当memcached服务器的内存空间不足时,会采用LRU(最近最少使用)算法将一些旧的缓存数据删除,以腾出更多的内存空间。
5. 当多个memcached服务器组成一个分布式缓存集群时,客户端需要通过一致性哈希算法来选择具体的服务器,以保证缓存数据的一致性。
6. 当客户端对缓存数据进行修改时,需要同时更新所有memcached服务器上的缓存数据,以保证数据一致性。
总之,memcached工作原理简单、高效,可以提高应用程序的响应速度和吞吐
量,同时减少数据库的负载。
详解MemCached原理

详解MemCached原理memcached是⼀个⾼性能的分布式内存缓存服务器,memcached在Linux上可以通过yum命令安装,这样⽅便很多,在⽣产环境下建议⽤Linux系统,memcached使⽤libevent这个库在Linux系统上才能发挥它的⾼性能。
它的分布式其实在服务端是不具有分布式的特征的,是依靠客户端的分布式算法进⾏了分布式,memcached是⼀个纯内存型的数据库,这样在读写速度上相对来说⽐较快。
memcached的内存分配是预先分配内存,常规的程序使⽤内存⽆⾮是两种,⼀种是预先分配,⼀种是动态分配。
动态分配从效率的⾓度来讲相对来说要慢点,因为它需要实时的去分配内存使⽤,但是这种⽅式的好处就是可以节约内存使⽤空间;memcached采⽤的是预先分配的原则,这种⽅式是拿空间换时间的⽅式来提⾼它的速度,这种⽅式会造成不能很⾼效的利⽤内存空间,但是memcached采⽤了Slab Allocation机制来解决内存碎⽚的问题,Slab Allocation的基本原理就是按照预先规定的⼤⼩,将分配的内存分割成特定长度的块,并把尺⼨相同的块分成组(chunk的集合),借⽤⼀下⽹上的图:memcached会针对客户端发送的数据选择slab并缓存到chunk中,这样就有⼀个弊端那就是⽐如要缓存的数据⼤⼩是50个字节,如果被分配到如上图88字节的chunk中的时候就造成了33个字节的浪费,虽然在内存中不会存在碎⽚,但是也造成了内存的浪费,这也是我上⾯说的拿空间换时间的原因,不过memcached对于分配到的内存不会释放,⽽是重复利⽤。
默认情况下如下图chunk是1.25倍的增加的,当然也可以⾃⼰通过-f设置,这种内部的分割算法可以参看源码下的slabs.c⽂件。
memcached本⾝内部不会监视记录是否过期,⽽是当get时依靠记录的过期时间检查是否过期,这也是memcached的⼀种惰性过期机制。
memc 原理

memc 原理Memcached是一种常用的内存缓存系统,其原理主要包括数据存储、缓存失效和并发控制三个方面。
一、数据存储Memcached将数据存储在内存中,以提高数据访问速度。
具体而言,它通过将数据分散存储在多个服务器节点上,实现了数据的分布式存储。
每个节点都有唯一的标识符,称为key,用于标识存储的数据。
当客户端需要获取数据时,它会向Memcached发送一个请求,包含所需数据的key。
Memcached根据这个key计算出数据所在的节点,并将数据从该节点返回给客户端。
这种分布式存储方式使得数据可以被高效地存储和访问。
二、缓存失效为了保证缓存数据的有效性,Memcached引入了缓存失效机制。
当数据发生变化时,应用程序负责通知Memcached进行缓存失效操作。
具体而言,应用程序在数据发生变化时,将相应的key发送给Memcached,告知其相应的缓存数据已过时。
Memcached接收到该信息后,会将相应的数据从缓存中删除,以保证下一次访问时能够获取到最新的数据。
这种缓存失效机制能够确保缓存数据与后端数据的一致性。
三、并发控制由于多个客户端可能同时对同一个数据进行读写操作,为了保证数据的一致性和并发性,Memcached引入了并发控制机制。
具体而言,当多个客户端同时请求同一份数据时,Memcached会使用一种称为CAS(Compare and Swap)的机制来实现并发控制。
CAS机制通过比较数据的版本号来判断数据是否被修改过,在修改数据时,如果版本号与当前版本号一致,则可以进行修改操作,否则需要重新获取最新的数据。
这样可以避免多个客户端同时修改同一份数据造成的冲突问题。
Memcached通过数据存储、缓存失效和并发控制三个方面的原理,实现了高效的内存缓存系统。
它将数据存储在内存中,以提高数据访问速度,并通过分布式存储的方式实现数据的高效存储和访问;通过缓存失效机制保证缓存数据的有效性,与后端数据的一致性;通过并发控制机制保证多个客户端对同一份数据的一致性和并发性。
memorycache并发高的原理

memorycache并发高的原理内存缓存(Memory Cache)的并发高主要依赖于以下几个原理:1. 数据存储结构:内存缓存通常使用高效的数据结构来存储数据,比如哈希表(Hash Table)或跳表(Skip List)。
这些数据结构能够提供常数时间的读写操作,并具有较好的并发支持。
通过合适选择和优化存储结构,可以提高并发性能。
2. 锁机制:内存缓存需要在多线程或多进程环境下进行并发访问。
为了保证数据的一致性和安全性,常常使用锁机制来控制对共享数据的访问。
读写锁(Read-Write Lock)是常见的锁机制之一,允许多个线程同时读取数据,但只允许一个线程写入数据。
通过合理使用锁机制,可以提高并发访问的效率。
3. 缓存策略:内存缓存通常采用缓存策略来管理缓存数据,例如最近最少使用(Least Recently Used,LRU)、最久未使用(Least Recently Used,LFU)等。
这些策略可以帮助决定何时淘汰缓存数据,以及如何提高缓存的命中率。
通过合理选择和优化缓存策略,可以减少并发访问时对数据的竞争。
4. 并发控制:内存缓存还可以通过并发控制机制来提高并发性能。
例如,使用读写锁、分段锁(Segment Locking)、细粒度锁(Fine-Grained Locking)等技术,将数据分片或分段,使得不同的线程可以并行地访问不同的数据片段,减少了竞争,提高了并发性能。
5. 内存管理:内存缓存需要有效地管理内存资源,包括分配和回收。
合理的内存管理策略可以避免内存碎片和资源浪费,提高内存利用率和并发性能。
综上所述,内存缓存并发高的原理在于合适的数据存储结构、锁机制、缓存策略、并发控制和内存管理。
通过优化这些方面,可以提高内存缓存在并发环境下的性能和效率。
memcached内存管理与删除机制及服务器实现

memcached内存管理与删除机制及服务器实现memcached是一种高性能、分布式的缓存系统,常用于提升Web应用的访问速度。
它基于内存存储数据,并采用删除机制来管理内存使用。
本文将详细介绍memcached的内存管理与删除机制,并探讨其服务器实现。
1. memcached的内存管理机制memcached的内存管理机制主要是通过使用LRU(Least Recently Used,最近最少使用)算法来实现的。
该算法会根据数据使用的频率和时间进行筛选,将最少使用的数据淘汰出内存。
在memcached中,内存分为不同的内存页(memory page),页的大小一般是固定的,比如1MB。
当增加新的数据时,memcached会将数据按页进行划分,如果某一页内存已满,则会将其它页内的较不常用的数据淘汰掉,以腾出空间存储新数据。
2. memcached的删除机制memcached采用延迟删除(lazy deletion)的策略来删除数据。
具体来说,当数据过期或者内存不足时,memcached并不立即删除数据,而是将过期或不常用的数据标记为“过期”或“删除”。
这样,在后续获取数据时,如果发现数据已标记为“过期”或“删除”,则不返回该数据,而是返回一个空值。
延迟删除机制的好处是避免了较高的删除开销,使得memcached能够更快速地访问和存储数据。
然而,这也意味着一些已过期但尚未被删除的数据仍会占用内存空间,因此在应用设计中需要考虑数据过期的策略,定期清理不再需要的数据。
3. memcached的服务器实现memcached服务器使用C语言编写,以支持高性能和低延迟的特性。
服务器的实现主要包括网络模块、存储模块和缓存管理模块。
网络模块负责处理客户端的连接请求和数据传输。
当有客户端连接到服务器时,服务器会启动一个监听线程,并通过一个事件循环来处理客户端请求和响应。
网络模块使用非阻塞的I/O模型,以便同时处理多个客户端的请求,提高服务器的并发处理能力。
Memcached详解分解

Memcached技术介绍:memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的,memcached技术的主要目的提速,在memachec 中维护了一张大的hashtable表,该表是在内存,表的结构是key value字串(字串,数值,数组,对象,布尔,二进制数据,null)原理说明:安装并使用memcached安装步骤(1)下载memcached软件(2)安装进入cmd ,切换到memcached.exe 文件所在目录memcached.exe –d install(3)启动memcached第一种,可以到服务点击启动第二种, 命令行memcached.exe –m 200MB –d start 【以deamon方式启动,默认64M】如果你在启动时,win7启动不成功, 则可以使用如下方法memcached.exe –p 端口号启动方法不要关闭控制台.端口号的范围: 0-65535 , 因为端口号是用两个字节来表示有名端口: 0-1024 已经用程序使用, apache 80 , mysql 3306 , ftp 21 , ssh 22oracle: 1521, stmp: 25使用netstat –an 如果看到11211端口在监听,说明启动oknetstat –anb 是哪个程序监听, 这个指令还可以看到有哪些用户连接到我们的服务器.如果没有安装好,原因可能1.如果你是win7, win7对安全性高,所有,必须以adminstartor 身份来安装.你切换成adminstrator , 去安装,在启动2.你的memcached.exe 目录有中文,或特殊字符, 保证目录没有中文和特殊字符.(4)准备研究如果对memcached进行curd操作.看看telnet如何操作(curd)1.登录到telnet连接到memcached服务telnet 127.0.0.1 11211如果你们不能使用telnet 是因为系统不存在telnet.exe , 就可以到其它机器上拷贝telnet.exe 放在c:\windows\system32 即可2.增加基本语法是:add key名0 存放时间(秒) 数据大小(字符)举例:add key1 0 30 53.如何获取基本语法是:get key值get key14.修改set key名0 存放时间数据大小.举例:set key1 0 40 5☞如果key1不存在,则相当于增加新,如果存在,则相当有替换replace key名存放时间数据大小replace key1 0 40 5☞如果key1不存在,则失败,这个指令要求key必须存在.5.删除基本语法是delete key名比如delete key1append Append data to existing key append key 0 60 15prepend Prepend data to existing key prepend key 0 60 15flush_all 可以统一把数据清空.这里主要大家可以去计算出命中率cmd_hits/cmd_get . 越高越好.如何使用php程序操作我们的memcached服务curd.步骤,准备工作.(1)把php_memcache.dll 文件拷贝php的ext 下☞不同版本的php 所使用的php_memcache.dll 的版本不一样(2)修改php.ini文件,加载php_memcache.dll (该文件就是封装了一堆函数);加载php_memcache.dll 文件extension=php_memcache.dll(3)重新启动apache(4)我们写程序来完成curd操作.细节: 在我们添加数据的时候,如果bool Memcache::add ( string $key , mixed$var [, int $flag [, int $expire ]] )如果报expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中) exprie 直接给的是秒数,则最大30*3600*24如果你希望保持时间超过30 time()+天数*3600*24 即可最后代码:mem1.php<?php//创建一个mem对象实例$mem=new Memcache;if(!$mem->connect("127.0.0.1",11211)){die('连接失败!');}//增加//1.增加一个字串/* if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){echo '添加ok';}*///2.添加数值/* if($mem->set('key1',100,MEMCACHE_COMPRESSED,60)){echo '添加ok';}*///3.添加数组//在添加数组是,根据需要. 希望序列号放入,//serialize<=>unserialize,如果根据需要,也可以json_encode <=> json_decode $arr=array("bj",'tj');if($mem->set('key1',$arr,MEMCACHE_COMPRESSED,time()+31*3600*24)){echo '添加数组ok99111';}//4.添加对象/* class Dog{public $name;public $age;public function __construct($name,$age){$this->name=$name;$this->age=$age;}}$dog1=new Dog('小狗',50);if($mem->set('key1',$dog1,MEMCACHE_COMPRESSED,60)){echo '添加对象ok';}*///5.添加null 布尔值/* if($mem->set('key1',false,MEMCACHE_COMPRESSED,60)){echo '添加布尔ok';}*///6. 资源类型放入./* $con=mysql_connect("127.0.0.1","root","root");if(!$con){die('连接数据库失败');}var_dump($con);echo "<br/>";if($mem->set('key1',$con,MEMCACHE_COMPRESSED,60)){echo '添加资源ok';}*///查询$val=$mem->get('key1');var_dump($val);//修改//可以使用replaceif($mem->replace("key11",'hello',MEMCACHE_COMPRESSED,60)){echo 'replace ok';}else{echo 'replace no ok';}//删除echo "<br/>";if($mem->delete('key14')){echo 'key14 删除';}else{echo 'key14不存在';}mem2.php<?php//这个文件去操作memcached服务//创建一个mem对象实例$mem=new Memcache;if(!$mem->connect("127.0.0.1",11211)){die('连接失败!');}//在另外文件中取出对象时,有个注意的地方,对应php5.2这个版本会提示错误, //对php5.3这个版本会提示incomplete 信息, 解决方法是声明类定义即可class Dog{public $name;public $age;public function __construct($name,$age){$this->name=$name;$this->age=$age;}}$dog=$mem->get('key1');var_dump($dog);test.php 说明serilize 和json_encode用法://什么时候使用serilize 什么时候使用json_encode [ajax配合]练习: 请大家使用php 程序memcache.dll 完成对memcahce增删改查20min如何使用PHP源码来操作memcached服务如果管理员不让我们去加载memcache.dll 文件,我们可以直接通过源码操作.关闭扩展.代码mem3.php<?phprequire_once 'memcached-client.php';$mc = new memcached(array('servers' => array('127.0.0.1:11211'), //连接的memcacheip和端口'debug' => false, //是否debug'compress_threshold' => 10240, /*最大压缩*/'persistant' => true)); /*是否是持久连接*/$mc->set('key1', array('some', 'array'));// $mc->replace('key', 'some random string');$val = $mc->get('key1');var_dump($val);//修改$mc->replace('key1', "北京");$val = $mc->get('key1');var_dump($val);//删除$mc->delete('key1');$val = $mc->get('key1');echo "删除后";var_dump($val);Memcached 机制的深入了解③, memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除写段代码说明: mem4.phpmem5.php 取出.总结:1.mem服务的数据不是同步, 数据是分布的2.把什么数据放入到哪个memcached是由客户端的mem对象决定3.当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销memcache的细节讨论①生命周期从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.memcache的数据被销毁的情况如下:1.时间到2.重启memcached服务3.重启memcached服务所在的机器4.delete / flush 销毁数据②如何把session数据放入到memcached服务中.步骤:1.修改php.ini的配置文件如下:;[sesson.save_handler 有user|files|memcache]session.save_handler = memcachesession.save_path = "tcp://127.0.0.1:11211"③测试一把,重启apache测试ok<?php//传统的代码session_start();$_SESSION['name']='天龙八部300';$_SESSION['city']='beijing';class Dog{public $name;}$dog1=new Dog;$dog1->name='abcde';$_SESSION['dog']=$dog1;//如果session数据入mem,那他一定是以session_id为//key值进行添加//取出$name=$_SESSION['name'];echo "name=$name";echo "sessionid=".session_id();◆思考,如果管理员,不让我们修改php.ini 文件,我们如何处理session入memcached这个功能, 我们通过一个函数可以去修改php.ini 的配置.代码:<?phpini_set("session.save_handler","memcache");ini_set("session.save_path","tcp://127.0.0.1:9999");同时你也可以通过ini_set 去动态的修改对php.ini 的其它设置。
Memcached内存模型分析

一、Memcache内存分配机制①:Page为内存分配的最小单位:Memcached的内存分配以page为单位,默认情况下一个page是1M,可以通过-I 参数在启动时指定。
如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。
page一旦被分配在重启前不会被回收或者重新分配(page ressign已经从1.2.8版移除了)②:Slabs划分数据空间:Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。
如下图,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。
例如:slab 3只存储大小介于137 到224 bytes的数据。
如果一个数据大小为230byte将被分配到slab 4中。
从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例。
③:Chunk才是存放缓存数据的单位:Chunk是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。
例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。
chunk是memcached实际存放缓存数据的地方,因为chunk的大小固定为slab能够存放的最大值,所以所有分配给当前slab的数据都可以被chunk存下。
如果时间的数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设计的。
例如下图,chunk size 是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。
④:Slab的内存分配:Memcached在启动时通过-m指定最大使用内存,但是这个不会一启动就占用,是随着需要逐步分配给各slab的。
memcached完全剖析(1-5)整理

memcached全面剖析作者:长野雅广(Masahiro Nagano)作者:前坂徹(Toru Maesaka)翻译:charlee整理:yaykey发表时间:2008/07/02‐2008/07/30翻译时间:2008/07/10‐2008/07/31整理时间:2010/11/09原文链接:http://gihyo.jp/dev/feature/01/memcached/0001 http://gihyo.jp/dev/feature/01/memcached/0002 http://gihyo.jp/dev/feature/01/memcached/0003 http://gihyo.jp/dev/feature/01/memcached/0004 http://gihyo.jp/dev/feature/01/memcached/0005译文地址:•第1次:/2008/07/10/memcached‐001/ •第2次:/2008/07/11/memcached‐002/ •第3次:/2008/07/16/memcached‐003/ •第4次:/2008/07/24/memcached‐004/ •第5次:/2008/07/31/memcached‐005/2 / 81目录1. memcached完全剖析–1. memcached的基础 (5)1.1. memcached是什么? (7)1.2. memcached的特征 (9)1.2.1. 协议简单 (9)1.2.2. 基于libevent的事件处理 (9)1.2.3. 内置内存存储方式 (10)1.2.4. memcached不互相通信的分布式 (10)1.3. 安装memcached (11)1.3.1. memcached的安装 (11)1.3.2. memcached的启动 (12)1.4. 用客户端连接 (13)1.5. 使用Cache::Memcached (15)1.5.1. 使用Cache::Memcached连接memcached (16)1.5.2. 保存数据 (17)1.5.3. 获取数据 (17)1.5.4. 删除数据 (17)1.5.5. 增一和减一操作 (18)1.6. 总结 (19)2. memcached全面剖析–2.理解memcached的内存存储 (21)2.1. Slab Allocation机制:整理内存以便重复使用 (23)2.1.1. Slab Allocation的主要术语 (24)2.1.1.1. Page (24)2.1.1.2. Chunk (24)2.1.1.3. Slab Class (24)2.2. 在Slab中缓存记录的原理 (25)2.3. Slab Allocator的缺点 (27)2.4. 使用Growth Factor进行调优 (29)2.5. 查看memcached的内部状态 (31)2.6. 查看slabs的使用状况 (33)2.7. 内存存储的总结 (35)3. memcached全面剖析–3.memcached的删除机制和发展方向 (37)3.1. memcached在数据删除方面有效利用资源 (39)3.1.1. 数据不会真正从memcached中消失 (39)3.1.2. Lazy Expiration (39)3.2. LRU:从缓存中有效删除数据的原理 (41)3.3. memcached的最新发展方向 (43)3.3.1. 关于二进制协议 (43)3.3.2. 二进制协议的格式 (43)3.3.3. HEADER中引人注目的地方 (45)3.4. 外部引擎支持 (47)3 / 813.4.1. 外部引擎支持的必要性 (47)3.4.2. 简单API设计的成功的关键 (48)3.4.3. 重新审视现在的体系 (49)3.5. 总结 (51)4. memcached全面剖析–4. memcached的分布式算法 (53)4.1. memcached的分布式 (55)4.1.1. memcached的分布式是什么意思? (55)4.2. Cache::Memcached的分布式方法 (59)4.2.1. 根据余数计算分散 (59)4.2.2. 根据余数计算分散的缺点 (60)4.3. Consistent Hashing (63)4.3.1. Consistent Hashing的简单说明 (63)4.3.2. 支持Consistent Hashing的函数库 (65)4.4. 总结 (67)5. memcached全面剖析–5. memcached的应用和兼容程序 (69)5.1. mixi案例研究 (71)5.1.1. 服务器配置和数量 (71)5.1.2. memcached进程 (72)5.1.3. memcached使用方法和客户端 (72)5.1.3.1. 通过Cache::Memcached::Fast维持连接 (73)5.1.3.2. 公共数据的处理和rehash (74)5.2. memcached应用经验 (75)5.2.1. 通过daemontools启动 (75)5.2.2. 监视 (76)5.2.3. memcached的性能 (77)5.3. 兼容应用程序 (79)5.3.1. Tokyo Tyrant案例 (79)5.4. 总结 (81)4 / 81memcached完全剖析–1. memcached的基础1.memcached完全剖析–1. memcached的基础翻译一篇技术评论社的文章,是讲memcached的连载。
memcached协议解析

memcached协议解析协议memcached 的客户端使⽤TCP链接与服务器通讯。
(UDP接⼝也同样有效,参考后⽂的 “UDP协议” )⼀个运⾏中的memcached服务器监视⼀些(可设置)端⼝。
客户端连接这些端⼝,发送命令到服务器,读取回应,最后关闭连接。
结束会话不需要发送任何命令。
当不再需memcached服务时,要客户端可以在任何时候关闭连接。
需要注意的是,⿎励客户端缓存这些连接,⽽不是每次需要存取数据时都重新打开连接。
这是因为memcached 被特意设计成及时开启很多连接也能够⾼效的⼯作(数百个,上千个如果需要的话)。
缓存这些连接,可以消除建⽴连接所带来的开销(/*/相对⽽⾔,在服务器端建⽴⼀个新连接的准备⼯作所带来的开销,可以忽略不计。
)。
在memcache协议中发送的数据分两种:⽂本⾏和⾃由数据。
⽂本⾏被⽤于来⾃客户端的命令和服务器的回应。
⾃由数据⽤于客户端从服务器端存取数据时。
同样服务器会以字节流的⽅式传回⾃由数据。
/*/服务器不⽤关⼼⾃由数据的字节顺序。
⾃由数据的特征没有任何限制;但是通过前⽂提到的⽂本⾏,这项数据的接受者(服务器或客户端),便能够精确地获知所发送的数据库的长度。
⽂本⾏固定以“\r\n”(回车符紧跟⼀个换⾏符)结束。
⾃由数据也是同样会以“\r\n”结束,但是 \r(回车符)、\n(换⾏符),以及任何其他8位字符,均可出现在数据中。
因此,当客户端从服务器取回数据时,必须使⽤数据区块的长度来确定数据区块的结束位置,⽽不要依据数据区块末尾的“\r\n”,即使它们固定存在于此。
键值存储在memcached中的数据通过键值来标识。
键值是⼀个⽂本字符串,对于需要存取这项数据的客户端⽽⾔,它必须是唯⼀的。
键值当前的长度限制设定为250字符(当然,客户端通常不会⽤到这么长的键);键值中不能使⽤制表符和其他空⽩字符(例如空格,换⾏等)。
命令所有命令分为3种类型:存储命令(有3项:’set’、’add’、’repalce’)指⽰服务器储存⼀些由键值标识的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
余问题都解决了,空间利用率会大大提升。
修改 slabs_clsid 函数,让它直接返回一个定值(比如 1 )
unsigned int slabs_clsid(size_t size) {return 1;}
修改slabs_init函数,去掉循环创建所有classid属性的部分,直接添加
slabclaபைடு நூலகம்s[1]:
• 数据存储方式:Slab Allocation • 数据过期方式:Lazy Expiration + LRU
7
Memcache原理分析
数据存储方式:Slab Allocation
Slab Alloction 构造图
Slab Allocator的基本原理是按照预先 规定的大小,将分配的内存分割成特定 长度的块,以完全解决内存碎片问题。
Memcached 入门
作者:
2009-01
Tech Talk 目录索引
Memcache是什么 Memcache,ehcache的比较 Memcache原理分析 Memcache安装和基本配置 Memcache的在大型网站中的使用策略 Memcache的一些经验和技巧 Memcache一致性算法(consistent hasing)
一个id,在数据量非常大的情况下,slab链会很长(因为所有数据都挤在一条
链上了),遍历起来的代价比较高。
前面介绍了三种空间冗余,设置chunk长度等于item长度,解决了第一种空间
浪费问题,不预申请空间解决了第二种空间浪费问题,那么对于第一种问题
(slab内剩余)如何解决呢,这就需要修改POWER_BLOCK常量,使得每一
15
Memcache原理分析:
常量POWER_BLOCK 1048576 默认slab大小 常量CHUNK_ALIGN_BYTES (sizeof(void *)) 保证chunk大小是这个数值的整数倍,防止越界(void *的长度在不同系统上不 一样,在标准32位系统上是4) 常量ITEM_UPDATE_INTERVAL 60 队列刷新间隔 常量LARGEST_ID 255 最大item链表数(这个值不能比最大的classid小) 变量hashpower(在1.1中是常量HASHPOWER) 决定hashtable的大小 根据上面介绍的内容及参数设定,可以计算出的一些结果: 1、在memcached中可以保存的item个数是没有软件上限的,之前我的100万的 说法是错误的。 2、假设NewHash算法碰撞均匀,查找item的循环次数是item总数除以 hashtable大小(由hashpower决定),是线性的。 3、Memcached限制了可以接受的最大item是1MB,大于1MB的数据不予理会。 4、Memcached的空间利用率和数据特性有很大的关系,又与 DONT_PREALLOC_SLABS常量有关。 在最差情况下,有198个slab会被浪费 (所有item都集中在一个slab中,199个id全部分配满)。
3
Memcache, EhCache的比较
项目
分布式
Memcache
不完全,集群默认不实现
EhCache
支持
集群 持久化
效率 容灾 缓存数据方式
缓存过期移除策略 缺点 优点
可通过客户端实现
支持
可通过第三方应用实现,如sina研发的memcachedb, 将cache的数据保存到Berkerly DB
个slab大小正好等于chunk长度的整数倍,这样一个slab就可以正好划分成n个
chunk。这个数值应该比较接近1MB,过大的话同样会造成冗余,过小的话会
造成次数过多的alloc,根据chunk长度为200,选择1000000作为
POWER_BLOCK的值,这样一个slab就是100万字节,不是1048576。三个冗
//得出的结果是1,那么对应的机器就是 node[id] == node[1]
13
Memcache原理分析:
基于客户端的Memcached分布式
写入操作
读取操作
14
Memcache原理分析:
Memcache的理论参数计算方式
常量REALTIME_MAXDELTA 60*60*24*30 最大30天的过期时间 conn_init()中的freetotal(=200) 最大同时连接数 常量KEY_MAX_LENGTH 250 最大键长 settings.factor(=1.25) factor将影响chunk的步进大小 settings.maxconns(=1024) 最大软连接 settings.chunk_size(=48) 一个保守估计的key+value长度,用来生成id1中的chunk长度(1.2)。id1的 chunk长度等于这个数值加上item结构体的长度(32),即默认的80字节。 常量POWER_SMALLEST 1 最小classid(1.2) 常量POWER_LARGEST 200 最大classid(1.2)
Chunk:用于缓存记录的内存空间。
Slab Class:特定大小的chunk的组。
memcached根据收到的数据的大小,选 择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的 列表,根据该列表选择chunk,然后将 数据缓存于其中。
9
Memcache原理分析:
数据存储方式:Slab Allocation
CODE:
slabclass[1].size = 200;
//每chunk200字节
slabclass[1].perslab = 5000; //1000000/200
18
Memcache安装、配置和使用:
• Memcache 安装 • Memcache 配置 • Memcache 结合java客户端的使用
• LRU memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不 足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义, 这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法 从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配 给新的记录。从缓存的实用角度来看,该模型十分理想。
Slab Alloction 缺点
这个问题就是,由于分配的是特定长度的内存,因此无法有效利用 分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩 余的28字节就浪费了。
10
Memcache原理分析:
数据过期方式
• Lazy Expiration memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过 期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费 CPU时间。
2
Memcache是什么:
Memcache是国外社区网站 LiveJournal 的开发团队开发的高性能的分布式内 存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访 问次数,以提高动态Web应用的速度、提高可扩展性。目前全世界不少人使用 这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
Memcache原理分析:
要定义DONT_PREALLOC_SLABS来避免另外的预分配浪费。另一种方法是
建立一个hash关系,来从item确定classid,不能使用长度来做键,可以使用key
的NewHash结果等不定数据,或者直接根据key来做hash(定长数据的key也一
定等长)。这里简单起见,选择第一种方法,这种方法的不足之处在于只使用
11
Memcache原理分析:
基于客户端的Memcached分布式
12
Memcache原理分析:
基于客户端的Memcached分布式
//按照Key值,获取一个服务器ID int getServerId(char *key, int serverTotal) {
int c, hash = 0; while (c = *key++) {
高
支持。持久化到本地硬盘,生成一 个.data和.index文件。Cache初始化 时会自动查找这两个文件,将数据放 入cache
高于memcache
可通过客户端实现
支持
缓存在memcached server向系统申请的内存中 LRU
可以缓存在内存(jvm)中,也可以缓存 在 硬盘。通过CacheManager管理 cache.多个CacheManager可管理多个 cache
LRU,FIFO,LFU
功能不完善,相对于ehcache效率低
简单,灵活,所有支持socket的语言都可以编写他的 客户端
只适用于java体系,只能编写java客 户端
效率高,功能强大
4
Memcache原理分析
Memcache工作方式?
5
Memcache原理分析
6
Memcache原理分析
自主的内存存储处理
Slab Allocation的原理相当简单。 将 分配的内存分割成各种尺寸的块 (chunk),并把尺寸相同的块分成组 (chunk的集合)
8
Memcache原理分析
数据存储方式:Slab Allocation
Slab Classes 分配图
Page:分配给Slab的内存空间,默认是 1MB。分配给Slab之后根据slab的大小 切分成chunk。
Memcache可以对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是 在内存中开辟一块空间,然后建立一个HashTable,Memcache自管理这些 HashTable. Memcache的官方网站:/memcached/ 为什么会有Memcache和Memcached两种名称? 其实Memcache是这个项目的名称,而Memcached是它服务器端的主程序文 件名。