Memcached原理剖析

上传人:夏** 文档编号:568836797 上传时间:2024-07-27 格式:PPT 页数:41 大小:1.42MB
返回 下载 相关 举报
Memcached原理剖析_第1页
第1页 / 共41页
Memcached原理剖析_第2页
第2页 / 共41页
Memcached原理剖析_第3页
第3页 / 共41页
Memcached原理剖析_第4页
第4页 / 共41页
Memcached原理剖析_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《Memcached原理剖析》由会员分享,可在线阅读,更多相关《Memcached原理剖析(41页珍藏版)》请在金锄头文库上搜索。

1、Memcached Memcached 入门入门作者:作者:2009-012009-012l lMemcacheMemcacheMemcacheMemcache是什么是什么是什么是什么l lMemcache,ehcacheMemcache,ehcacheMemcache,ehcacheMemcache,ehcache的比较的比较的比较的比较l lMemcacheMemcacheMemcacheMemcache原理分析原理分析原理分析原理分析l lMemcacheMemcacheMemcacheMemcache安装和安装和安装和安装和基本配置基本配置基本配置基本配置l lMemcacheMemc

2、acheMemcacheMemcache的在大型网站中的使用策略的在大型网站中的使用策略的在大型网站中的使用策略的在大型网站中的使用策略l lMemcacheMemcacheMemcacheMemcache的一些经验和技巧的一些经验和技巧的一些经验和技巧的一些经验和技巧l lMemcacheMemcacheMemcacheMemcache一致性算法一致性算法一致性算法一致性算法(consistent hasing)(consistent hasing)(consistent hasing)(consistent hasing) TechTalk目录索引目录索引3MemcacheMemcache

3、是什么是什么: :MemcacheMemcacheMemcacheMemcache是国外社区网站是国外社区网站是国外社区网站是国外社区网站 LiveJournal LiveJournal LiveJournal LiveJournal 的开发团队开发的高性能的分布式内存的开发团队开发的高性能的分布式内存的开发团队开发的高性能的分布式内存的开发团队开发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问缓存服务器。一般的使用目

4、的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态次数,以提高动态次数,以提高动态次数,以提高动态WebWebWebWeb应用的速度、提高可扩展性。应用的速度、提高可扩展性。应用的速度、提高可扩展性。应用的速度、提高可扩展性。目前全世界不少人使用这个目前全世界不少人使用这个目前全世界不少人使用这个目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。缓存项目来构建自己大负载的网站,来分担数据库的压力。缓存项目来构建自己大负载的网站,来分担数据库的压力。缓存项目来构建自己大负载的网站,来分担数据库的压力。MemcacheMemcache可以对任意多个连接,使用非阻

5、塞的网络可以对任意多个连接,使用非阻塞的网络可以对任意多个连接,使用非阻塞的网络可以对任意多个连接,使用非阻塞的网络IOIO。由于它的工作机制是由于它的工作机制是由于它的工作机制是由于它的工作机制是在内存中开辟一块空间,然后建立一个在内存中开辟一块空间,然后建立一个在内存中开辟一块空间,然后建立一个在内存中开辟一块空间,然后建立一个HashTableHashTable,MemcacheMemcache自管理这些自管理这些自管理这些自管理这些 HashTable.HashTable.MemcacheMemcache的的的的官方网站:官方网站:官方网站:官方网站:http:/ EhCache, E

6、hCache的比较的比较项目项目MemcacheEhCache分布式不完全,集群默认不实现支持集群可通过客户端实现支持持久化可通过第三方应用实现,如sina研发的memcachedb,将cache的数据保存到Berkerly DB支持。持久化到本地硬盘,生成一个.data和.index文件。Cache初始化时会自动查找这两个文件,将数据放入cache效率高高于memcache容灾可通过客户端实现支持缓存数据方式缓存在memcached server向系统申请的内存中可以缓存在内存(jvm)中,也可以缓存在 硬盘。通过CacheManager管理cache.多个CacheManager可管理多个

7、cache缓存过期移除策略LRULRU,FIFO,LFU缺点功能不完善,相对于ehcache效率低只适用于java体系,只能编写java客户端优点 简单,灵活,所有支持socket的语言都可以编写他的客户端 效率高,功能强大5MemcacheMemcache原理分析原理分析MemcacheMemcacheMemcacheMemcache工作方式工作方式工作方式工作方式?6MemcacheMemcache原理分析原理分析7MemcacheMemcache原理分析原理分析自主的内存存储处理自主的内存存储处理自主的内存存储处理自主的内存存储处理 数据存储方式:数据存储方式:数据存储方式:数据存储方式

8、:Slab AllocationSlab AllocationSlab AllocationSlab Allocation 数据过期方式:数据过期方式:数据过期方式:数据过期方式:Lazy Expiration + LRULazy Expiration + LRULazy Expiration + LRULazy Expiration + LRU8MemcacheMemcache原理分析原理分析数据存储方式:数据存储方式:数据存储方式:数据存储方式:Slab AllocationSlab AllocationSlab AllocationSlab Allocation Slab Allocti

9、on Slab Alloction Slab Alloction Slab Alloction 构造图构造图构造图构造图Slab AllocatorSlab AllocatorSlab AllocatorSlab Allocator的基本原理是按照预先的基本原理是按照预先的基本原理是按照预先的基本原理是按照预先规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。长度的块,以完全解决内存碎片问题。Slab All

10、ocationSlab AllocationSlab AllocationSlab Allocation的原理相当简单。的原理相当简单。的原理相当简单。的原理相当简单。 将将将将分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块分配的内存分割成各种尺寸的块(chunkchunkchunkchunk),并把尺寸相同的块分成组),并把尺寸相同的块分成组),并把尺寸相同的块分成组),并把尺寸相同的块分成组(chunkchunkchunkchunk的集合)的集合)的集合)的集合)9MemcachMemcache e原理分析原理分析数据存储方式:数据存储方式:数据存储方

11、式:数据存储方式:Slab AllocationSlab AllocationSlab AllocationSlab Allocation Slab Classes Slab Classes Slab Classes Slab Classes 分配图分配图分配图分配图PagePagePagePage:分配给:分配给:分配给:分配给SlabSlabSlabSlab的内存空间,默认是的内存空间,默认是的内存空间,默认是的内存空间,默认是1MB1MB1MB1MB。分配给。分配给。分配给。分配给SlabSlabSlabSlab之后根据之后根据之后根据之后根据slabslabslabslab的大小的大小

12、的大小的大小切分成切分成切分成切分成chunkchunkchunkchunk。ChunkChunkChunkChunk:用于缓存记录的内存空间。:用于缓存记录的内存空间。:用于缓存记录的内存空间。:用于缓存记录的内存空间。Slab ClassSlab ClassSlab ClassSlab Class:特定大小的:特定大小的:特定大小的:特定大小的chunkchunkchunkchunk的组。的组。的组。的组。memcachedmemcachedmemcachedmemcached根据收到的数据的大小,选根据收到的数据的大小,选根据收到的数据的大小,选根据收到的数据的大小,选择最适合数据大小的

13、择最适合数据大小的择最适合数据大小的择最适合数据大小的slabslabslabslab。 memcachedmemcachedmemcachedmemcached中保存着中保存着中保存着中保存着slabslabslabslab内空闲内空闲内空闲内空闲chunkchunkchunkchunk的的的的列表,根据该列表选择列表,根据该列表选择列表,根据该列表选择列表,根据该列表选择chunkchunkchunkchunk,然后将,然后将,然后将,然后将数据缓存于其中。数据缓存于其中。数据缓存于其中。数据缓存于其中。10MemcacheMemcache原理分析原理分析: :数据存储方式:数据存储方式:

14、数据存储方式:数据存储方式:Slab AllocationSlab AllocationSlab AllocationSlab Allocation Slab Alloction Slab Alloction Slab Alloction Slab Alloction 缺点缺点缺点缺点这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将配的内存。例如,将配的内存。例如,将配的内存。例如,将1

15、00100100100字节的数据缓存到字节的数据缓存到字节的数据缓存到字节的数据缓存到128128128128字节的字节的字节的字节的chunkchunkchunkchunk中,剩余中,剩余中,剩余中,剩余的的的的28282828字节就浪费了。字节就浪费了。字节就浪费了。字节就浪费了。11MemcacheMemcache原理分析原理分析: :数据过期方式数据过期方式数据过期方式数据过期方式 Lazy Expiration Lazy Expiration Lazy Expiration Lazy Expirationmemcachedmemcachedmemcachedmemcached内部不会

16、监视记录是否过期,而是在内部不会监视记录是否过期,而是在内部不会监视记录是否过期,而是在内部不会监视记录是否过期,而是在getgetgetget时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过时查看记录的时间戳,检查记录是否过期。这种技术被称为期。这种技术被称为期。这种技术被称为期。这种技术被称为lazylazylazylazy(惰性)(惰性)(惰性)(惰性)expirationexpirationexpirationexpiration。因此,。因此,。因此,。因此,memcachedmemcachedmemcachedmemcached

17、不会在过期监视上耗费不会在过期监视上耗费不会在过期监视上耗费不会在过期监视上耗费CPUCPUCPUCPU时间。时间。时间。时间。 LRU LRU LRU LRUmemcachedmemcachedmemcachedmemcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为足的情况,此时就要使用名为足的情况,此时就要使用名为足的情况,此时就要

18、使用名为 Least Recently UsedLeast Recently UsedLeast Recently UsedLeast Recently Used(LRULRULRULRU)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,)机制来分配空间。顾名思义,这是删除这是删除这是删除这是删除“最近最少使用最近最少使用最近最少使用最近最少使用”的记录的机制。因此,当的记录的机制。因此,当的记录的机制。因此,当的记录的机制。因此,当memcachedmemcachedmemcachedmemcached的内存空间不足时(无法的内存空间不足时(无法的内存空间不

19、足时(无法的内存空间不足时(无法从从从从slab class slab class slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。给新的记录。从缓存的实用角度来看,该模型十分理想。12Memcac

20、heMemcache原理分析原理分析: :基于客户端的基于客户端的基于客户端的基于客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式13MemcacheMemcache原理分析原理分析: :基于客户端的基于客户端的基于客户端的基于客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式/按照按照按照按照KeyKeyKeyKey值,获取一个服务器值,获取一个服务器值,获取一个服务器值,获取一个服务器IDIDIDIDint getServerId(char *key, int serverTota

21、l) int getServerId(char *key, int serverTotal) int getServerId(char *key, int serverTotal) int getServerId(char *key, int serverTotal) int c, hash = 0; int c, hash = 0; int c, hash = 0; int c, hash = 0; while (c = *key+) while (c = *key+) while (c = *key+) while (c = *key+) hash += c; hash += c; has

22、h += c; hash += c; return hash % serverTotal; return hash % serverTotal; return hash % serverTotal; return hash % serverTotal; /服务器列表服务器列表服务器列表服务器列表node0 = 192.168.0.1:11211node0 = 192.168.0.1:11211node0 = 192.168.0.1:11211node0 = 192.168.0.1:11211node1 = 192.168.0.2:11211node1 = 192.168.0.2:11211no

23、de1 = 192.168.0.2:11211node1 = 192.168.0.2:11211node2 = 192.168.0.3:11211node2 = 192.168.0.3:11211node2 = 192.168.0.3:11211node2 = 192.168.0.3:11211/获取获取获取获取keykeykeykey是是是是tokyotokyotokyotokyo的节点的节点的节点的节点ID(ID(ID(ID(服务器服务器服务器服务器ID)ID)ID)ID)int id = getServerId(test, 3);int id = getServerId(test, 3)

24、;int id = getServerId(test, 3);int id = getServerId(test, 3);/得出的结果是得出的结果是得出的结果是得出的结果是1 1 1 1,那么对应的机器就是,那么对应的机器就是,那么对应的机器就是,那么对应的机器就是 nodeid = node1nodeid = node1nodeid = node1nodeid = node114MemcacheMemcache原理分析原理分析: :基于客户端的基于客户端的基于客户端的基于客户端的MemcachedMemcachedMemcachedMemcached分布式分布式分布式分布式 写入操作写入操作

25、写入操作写入操作 读取操作读取操作读取操作读取操作15MemcacheMemcache原理分析原理分析: :MemcacheMemcache的理论参数计算方式的理论参数计算方式常量常量REALTIME_MAXDELTA60*60*24*30最大最大30天的过期时间天的过期时间conn_init()中的中的freetotal(=200)最大同时连接数最大同时连接数常量常量KEY_MAX_LENGTH250最大键长最大键长settings.factor(=1.25)factor将影响将影响chunk的步进大小的步进大小settings.maxconns(=1024)最大软连接最大软连接settin

26、gs.chunk_size(=48)一个保守估计的一个保守估计的key+value长度,用来生成长度,用来生成id1中的中的chunk长度(长度(1.2)。)。id1的的chunk长度等于这个数值加上长度等于这个数值加上item结构体的长度(结构体的长度(32),即默认的),即默认的80字节。字节。常量常量POWER_SMALLEST1最小最小classid(1.2)常量常量POWER_LARGEST200最大最大classid(1.2)16MemcacheMemcache原理分析原理分析: :常量常量POWER_BLOCK1048576默认默认slab大小大小常量常量CHUNK_ALIGN_

27、BYTES(sizeof(void*)保证保证chunk大小是这个数值的整数倍,防止越界(大小是这个数值的整数倍,防止越界(void*的长度在不同系统上不的长度在不同系统上不一样,在标准一样,在标准32位系统上是位系统上是4)常量常量ITEM_UPDATE_INTERVAL60队列刷新间隔队列刷新间隔常量常量LARGEST_ID255最大最大item链表数(这个值不能比最大的链表数(这个值不能比最大的classid小)小)变量变量hashpower(在(在1.1中是常量中是常量HASHPOWER)决定决定hashtable的大小的大小根据上面介绍的内容及参数设定,可以计算出的一些结果:根据上面

28、介绍的内容及参数设定,可以计算出的一些结果:1、在、在memcached中可以保存的中可以保存的item个数是没有软件上限的,之前我的个数是没有软件上限的,之前我的100万的万的说法是错误的。说法是错误的。2、假设、假设NewHash算法碰撞均匀,查找算法碰撞均匀,查找item的循环次数是的循环次数是item总数除以总数除以hashtable大小(由大小(由hashpower决定),是线性的。决定),是线性的。3、Memcached限制了可以接受的最大限制了可以接受的最大item是是1MB,大于,大于1MB的数据不予理会。的数据不予理会。4、Memcached的空间利用率和数据特性有很大的关系

29、,又与的空间利用率和数据特性有很大的关系,又与DONT_PREALLOC_SLABS常量有关。常量有关。在最差情况下,有在最差情况下,有198个个slab会被浪费会被浪费(所有(所有item都集中在一个都集中在一个slab中,中,199个个id全部分配满)。全部分配满)。17MemcacheMemcache原理分析原理分析: :Memcache的定长优化的定长优化根据上面几节的描述,多少对根据上面几节的描述,多少对memcached有了一个比较深入的认识。在深入认有了一个比较深入的认识。在深入认识的基础上才好对它进行优化。识的基础上才好对它进行优化。Memcached本身是为变长数据设计的,根

30、据数据特性,可以说它是本身是为变长数据设计的,根据数据特性,可以说它是“面向大众面向大众”的设计,但是很多时候,我们的数据并不是这样的的设计,但是很多时候,我们的数据并不是这样的“普遍普遍”,典型的情况中,典型的情况中,一种是非均匀分布,即数据长度集中在几个区域内(如保存用户一种是非均匀分布,即数据长度集中在几个区域内(如保存用户Session);另);另一种更极端的状态是等长数据(如定长键值,定长数据,多见于访问、在线统一种更极端的状态是等长数据(如定长键值,定长数据,多见于访问、在线统计或执行锁)。计或执行锁)。这里主要研究一下定长数据的优化方案(这里主要研究一下定长数据的优化方案(1.2

31、),集中分布的变长数据仅供参考,),集中分布的变长数据仅供参考,实现起来也很容易。实现起来也很容易。解决定长数据,首先需要解决的是解决定长数据,首先需要解决的是slab的分配问题,第一个需要确认的是我们的分配问题,第一个需要确认的是我们不需要那么多不同不需要那么多不同chunk长度的长度的slab,为了最大限度地利用资源,最好,为了最大限度地利用资源,最好chunk和和item等长,所以首先要计算等长,所以首先要计算item长度。长度。在之前已经有了计算在之前已经有了计算item长度的算法,需要注意的是,除了字符串长度外,还长度的算法,需要注意的是,除了字符串长度外,还要加上要加上item结构

32、的长度结构的长度32字节。字节。假设我们已经计算出需要保存假设我们已经计算出需要保存200字节的等长数据。字节的等长数据。接下来是要修改接下来是要修改slab的的classid和和chunk长度的关系。在原始版本中,长度的关系。在原始版本中,chunk长度长度和和classid是有对应关系的,现在如果把所有的是有对应关系的,现在如果把所有的chunk都定为都定为200个字节,那么这个字节,那么这个关系就不存在了,我们需要重新确定这二者的关系。一种方法是,整个存储个关系就不存在了,我们需要重新确定这二者的关系。一种方法是,整个存储结构只使用一个固定的结构只使用一个固定的id,即只使用,即只使用1

33、99个槽中的个槽中的1个,在这种条件下,就一定个,在这种条件下,就一定18MemcacheMemcache原理分析原理分析: :要定义要定义DONT_PREALLOC_SLABS来避免另外的预分配浪费。另一种方法是来避免另外的预分配浪费。另一种方法是建立一个建立一个hash关系,来从关系,来从item确定确定classid,不能使用长度来做键,可以使用,不能使用长度来做键,可以使用key的的NewHash结果等不定数据,或者直接根据结果等不定数据,或者直接根据key来做来做hash(定长数据的(定长数据的key也一也一定等长)。这里简单起见,选择第一种方法,这种方法的不足之处在于只使用定等长)

34、。这里简单起见,选择第一种方法,这种方法的不足之处在于只使用一个一个id,在数据量非常大的情况下,在数据量非常大的情况下,slab链会很长(因为所有数据都挤在一条链会很长(因为所有数据都挤在一条链上了),遍历起来的代价比较高。链上了),遍历起来的代价比较高。前面介绍了三种空间冗余,设置前面介绍了三种空间冗余,设置chunk长度等于长度等于item长度,解决了第一种空间长度,解决了第一种空间浪费问题,不预申请空间解决了第二种空间浪费问题,那么对于第一种问题浪费问题,不预申请空间解决了第二种空间浪费问题,那么对于第一种问题(slab内剩余)如何解决呢,这就需要修改内剩余)如何解决呢,这就需要修改P

35、OWER_BLOCK常量,使得每一常量,使得每一个个slab大小正好等于大小正好等于chunk长度的整数倍,这样一个长度的整数倍,这样一个slab就可以正好划分成就可以正好划分成n个个chunk。这个数值应该比较接近。这个数值应该比较接近1MB,过大的话同样会造成冗余,过小的话会,过大的话同样会造成冗余,过小的话会造成次数过多的造成次数过多的alloc,根据,根据chunk长度为长度为200,选择,选择1000000作为作为POWER_BLOCK的值,这样一个的值,这样一个slab就是就是100万字节,不是万字节,不是1048576。三个冗。三个冗余问题都解决了,空间利用率会大大提升。余问题都

36、解决了,空间利用率会大大提升。修改修改slabs_clsid函数,让它直接返回一个定值(比如函数,让它直接返回一个定值(比如1)unsignedintslabs_clsid(size_tsize)return1;修改修改slabs_init函数,去掉循环创建所有函数,去掉循环创建所有classid属性的部分,直接添加属性的部分,直接添加slabclass1:CODE:slabclass1.size=200;/每每chunk200字节字节slabclass1.perslab=5000;/1000000/20019MemcacheMemcache安装安装、配置和使用、配置和使用: : Memcac

37、he Memcache Memcache Memcache 安装安装安装安装 Memcache Memcache Memcache Memcache 配置配置配置配置 Memcache Memcache Memcache Memcache 结合结合结合结合javajavajavajava客户端的使用客户端的使用客户端的使用客户端的使用 20MemcacheMemcache安装和使用安装和使用: :Memcache Memcache Memcache Memcache windowswindowswindowswindows安装安装安装安装1.1.下载下载下载下载MemcacheMemcache

38、的的的的windowwindow稳定版,解压到某个盘下稳定版,解压到某个盘下稳定版,解压到某个盘下稳定版,解压到某个盘下面。面。面。面。2.Cmd2.Cmd找到解压目录,输入找到解压目录,输入找到解压目录,输入找到解压目录,输入memcached.exe d memcached.exe d insatllinsatll安装为安装为安装为安装为windowswindows服务服务服务服务.( .(如果是如果是如果是如果是win7,win7,要以要以要以要以administratoradministrator方式启动方式启动方式启动方式启动cmd).cmd).3.3.再输入再输入再输入再输入mem

39、cached.exe d startmemcached.exe d start启动。启动。启动。启动。21MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached linuxlinuxlinuxlinux安装安装安装安装安装步骤:安装步骤:安装步骤:安装步骤: 先安装先安装先安装先安装 libeventlibevent 再安装再安装再安装再安装 Memcached Memcached 主程序主程序主程序主程序源码下载:源码下载:源码下载:源码下载:( (最新版最新版最新版最新版) )libeventlibeve

40、nt官网:官网:官网:官网:http:/monkey.org/provos/libevent/http:/monkey.org/provos/libevent/libeventlibevent下载:下载:下载:下载:http:/monkey.org/provos/libevent-1.4.9-stable.tar.gzhttp:/monkey.org/provos/libevent-1.4.9-stable.tar.gzMemcachedMemcached官网:官网:官网:官网:http:/ :Memcached Memcached Memcached Memcached 安装安装安装安装 安

41、装安装安装安装 libeventlibevent# tar zxvf libevent-1.4.9-stable.tar.gz# tar zxvf libevent-1.4.9-stable.tar.gz# cd libevent-1.4.9-stable# cd libevent-1.4.9-stable# ./configure -prefix=/usr# ./configure -prefix=/usr# make# make# make install# make install 安装安装安装安装 MemcachedMemcached# tar zxvf memcached-1.2.6

42、.tar.gz# tar zxvf memcached-1.2.6.tar.gz# cd memcached-1.2.6# cd memcached-1.2.6# ./configure -prefix=/usr/local# ./configure -prefix=/usr/local# make# make# make install# make install23MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 运行运行运行运行 试运行试运行试运行试运行 MemcachedMemcached# /

43、usr/local/bin/memcached -u hualiangxie# /usr/local/bin/memcached -u hualiangxie24MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 运行运行运行运行查看查看查看查看Memcached Memcached 帮助信息帮助信息帮助信息帮助信息# /usr/local/bin/memcached -h# /usr/local/bin/memcached -h25MemcachedMemcached安装和使用安装和使用: :Memca

44、ched Memcached Memcached Memcached 运行运行运行运行关注基本选项关注基本选项关注基本选项关注基本选项-p -p 监听的监听的TCPTCP端口端口 ( (缺省缺省: 11211): 11211)-d -d 以守护进程方式运行以守护进程方式运行MemcachedMemcached-u -u 运行运行MemcachedMemcached的账户,非的账户,非rootroot用户用户-m -m 最大的内存使用最大的内存使用, , 单位是单位是MBMB,缺省是,缺省是 64 MB64 MB-c -c 软连接数量软连接数量, , 缺省是缺省是 10241024-v -v 输

45、出警告和错误信息输出警告和错误信息-vv -vv 打印客户端的请求和返回信息打印客户端的请求和返回信息-h -h 打印帮助信息打印帮助信息-i -i 打印打印memcachedmemcached和和libeventlibevent的版权信息的版权信息运行运行运行运行 MemcachedMemcached目标:使用目标:使用1121111211端口、端口、hualiangxiehualiangxie用户、最大占用用户、最大占用512M512M内存、内存、10241024个软连接,输出客个软连接,输出客户端请求,以守护进程方式运行户端请求,以守护进程方式运行# /usr/local/bin/mem

46、cached -p 11211 -d -u hualiangxie -m 512 -c 1024 -vvv# /usr/local/bin/memcached -p 11211 -d -u hualiangxie -m 512 -c 1024 -vvv26MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 运行运行运行运行检查是否正常启动检查是否正常启动检查是否正常启动检查是否正常启动# # pa auxxww | grep memcachedpa auxxww | grep memcached1001

47、4402 0.0 0.0 2296 900 pts/0 S+ 19:24 0:00 /usr/local/bin/memcached -u hualiangxie1001 4402 0.0 0.0 2296 900 pts/0 S+ 19:24 0:00 /usr/local/bin/memcached -u hualiangxie root 4547 0.0 0.0 1892 668 pts/3 S+ 19:42 0:00 grep memcached root 4547 0.0 0.0 1892 668 pts/3 S+ 19:42 0:00 grep memcached# # telne

48、t localhost 11211telnet localhost 11211Trying 127.0.0.1.Trying 127.0.0.1.Connected to localhost.Connected to localhost.Escape character is .Escape character is .statsstatsSTAT pid 4402STAT pid 4402STAT uptime 1032STAT uptime 1032STAT time 1231155683STAT time 1231155683STAT version 1.2.6STAT version

49、1.2.6STAT pointer_size 32STAT pointer_size 32.ENDEND27pidmemcache服务器的进程IDuptime服务器已经运行的秒数time服务器当前的unix时间戳versionmemcache版本pointer_size当前操作系统的指针大小(32位系统一般是32bit)rusage_user进程的累计用户时间rusage_system进程的累计系统时间curr_items服务器当前存储的items数量total_items从服务器启动以后存储的items总数量bytes当前服务器存储items占用的字节数curr_connections当前打

50、开着的连接数total_connections从服务器启动以后曾经打开过的连接数connection_structures服务器分配的连接构造数cmd_getget命令(获取)总请求次数cmd_setset命令(保存)总请求次数get_hits总命中次数get_misses总未命中次数evictions为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)bytes_read总读取字节数(请求字节数)bytes_written总发送字节数(结果字节数)limit_maxbytes分配给memcache的内存大小(字节)thr

51、eads当前线程数28stats命令命令memcache的的stats命令包括:命令包括:1.stats2.statsreset清空统计信息清空统计信息3.statsmalloc显示内存分配数据显示内存分配数据4.statsmaps动态库的映射地址动态库的映射地址5.statssizes6.statsslabs7.statsitems8.statscachedumpslab_idlimit_num示某个示某个slab中的前中的前limit_num个个key列表列表9.statsdetailon|off|dump设置或显示详细设置或显示详细操作信息操作信息29MemcachedMemcached

52、安装和使用安装和使用: :Memcached Memcached Memcached Memcached 命令命令命令命令数据存取数据存取数据存取数据存取set key1 0 180 3set key1 0 180 3abcabcSTOREDSTOREDadd key1 0 180 3add key1 0 180 3xyzxyzNOT_STOREDNOT_STOREDget key1get key1VALUE key1 0 3VALUE key1 0 3abcabcENDENDreplace key1 0 180 3replace key1 0 180 3xyzxyzSTOREDSTOREDg

53、et key1get key1VALUE key1 0 3VALUE key1 0 3xyzxyzENDENDdelete key1delete key1DELETEDDELETED数字加减数字加减数字加减数字加减set key2 0 180 4set key2 0 180 412341234STOREDSTOREDincr key2 3incr key2 312371237get key2get key2VALUE key2 0 4VALUE key2 0 412371237ENDENDdecr key2 1decr key2 112361236get key2get key2VALUE k

54、ey2 0 4VALUE key2 0 412361236ENDEND30memcached memcached 的客户端使用的客户端使用TCPTCP链接链接 与与 服务器通讯。服务器通讯。(UDPUDP接口也同样有效)一个运行中的接口也同样有效)一个运行中的memcachedmemcached服务器监视一些(可设置)端口。客户端服务器监视一些(可设置)端口。客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。连接这些端口,发送命令到服务器,读取回应,最后关闭连接。结束会话不需要发送任何命令。当不再需结束会话不需要发送任何命令。当不再需memcachedmemcached服务时,要客

55、户端可以在服务时,要客户端可以在任何时候关闭连接。需要注意的是,鼓励客户端缓存这些连接,而不是每次需要存取数据任何时候关闭连接。需要注意的是,鼓励客户端缓存这些连接,而不是每次需要存取数据时都重新打开连接。这是因为时都重新打开连接。这是因为memcached memcached 被特意设计成及时开启很多连接也能够高效的工被特意设计成及时开启很多连接也能够高效的工作(数百个,上千个如果需要的话)。缓存这些连接,可以消除建立连接所带来的开销作(数百个,上千个如果需要的话)。缓存这些连接,可以消除建立连接所带来的开销(/*/*/相对而言,在服务器端建立一个新连接的准备工作所带来的开销,可以忽略不计。

56、)。相对而言,在服务器端建立一个新连接的准备工作所带来的开销,可以忽略不计。)。在在memcachememcache协议中发送的数据分两种:文本行协议中发送的数据分两种:文本行 和和 自由数据。自由数据。 文本行被用于文本行被用于来自客户端的命令和服务器的回应。自由数据用于客户端从服务器端存取数据时。同样服来自客户端的命令和服务器的回应。自由数据用于客户端从服务器端存取数据时。同样服务器会以字节流的方式传回自由数据。务器会以字节流的方式传回自由数据。/*/*/服务器不用关心自由数据的字节顺序。自由数服务器不用关心自由数据的字节顺序。自由数据的特征没有任何限制;但是通过前文提到的文本行,这项数据

57、的接受者(服务器或客户据的特征没有任何限制;但是通过前文提到的文本行,这项数据的接受者(服务器或客户端),便能够精确地获知所发送的数据库的长度。端),便能够精确地获知所发送的数据库的长度。文本行固定以文本行固定以“rnrn”( (回车符紧跟一个换行符回车符紧跟一个换行符) )结束。结束。 自由数据也是同样会自由数据也是同样会以以“rnrn”结束,但是结束,但是 r(r(回车符回车符) )、n(n(换行符换行符) ),以及任何其他,以及任何其他8 8位字符,均可出现在数位字符,均可出现在数据中。因此,当客户端从服务器取回数据时,必须使用数据区块的长度来确定数据区块的据中。因此,当客户端从服务器取

58、回数据时,必须使用数据区块的长度来确定数据区块的结束位置,而不要依据数据区块末尾的结束位置,而不要依据数据区块末尾的“rnrn”,即使它们固定存在于此,即使它们固定存在于此MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 基本协议基本协议基本协议基本协议31MemcachedMemcached安装和使用安装和使用: :Memcached Memcached Memcached Memcached 和和和和 javajavajavajava 结合使用结合使用结合使用结合使用下载下载memcachedjav

59、aclient:http:/ /* *MemcacheMemcache服务器默认端口是服务器默认端口是1121111211* */ /String servers = 127.0.0.1:11211 ;String servers = 127.0.0.1:11211 ; SockIOPool pool = SockIOPool pool = SockIOPool.SockIOPool.getInstance();getInstance(); pool.setServers(servers); pool.setServers(servers); pool.setFailover(true); p

60、ool.setFailover(true); pool.setInitConn(10); pool.setInitConn(10); pool.setMinConn(5); pool.setMinConn(5); pool.setMaxConn(250); pool.setMaxConn(250); pool.setMaintSleep(30); pool.setMaintSleep(30); pool.setNagle(false); pool.setNagle(false); pool.setSocketTO(3000); pool.setSocketTO(3000); pool.setA

61、liveCheck(true); pool.setAliveCheck(true); pool.initialize(); pool.initialize();MemCachedClientmemCachedClient=newMemCachedClient();for(inti=0;i10;i+)/*将对象加入到将对象加入到memcached缓存缓存*/booleansuccess=memCachedClient.set(+i,Hello!);/*从从memcached缓存中按缓存中按key值取对象值取对象*/Stringresult=(String)memCachedClient.get(

62、+i);System.out.println(String.format(set( %d ): %s, i, success);System.out.println(String.format(get( %d ): %s, i, result);32MemcacheMemcache三种三种javajava客户端的比较客户端的比较Memcache client for java:Memcache client for java:较早推出的较早推出的memcache javamemcache java客户端客户端API,API,应用广泛,运行应用广泛,运行比较稳定。比较稳定。spymemcache

63、dspymemcached:A simpleA simple, asynchronousasynchronous, single-threaded memcached client single-threaded memcached client written in java. written in java. 支持异步,单线程的支持异步,单线程的memcachedmemcached客户端,用到了客户端,用到了java1.5java1.5版本的版本的concurrentconcurrent和和nionio,存取速度会高于前者,但是稳定性不好,测试中常,存取速度会高于前者,但是稳定性不好,测试

64、中常 报报timeOuttimeOut等相关异常等相关异常XmemcachedXmemcached是基于是基于java niojava nio实现的高性能可扩展的实现的高性能可扩展的memcachedmemcached客户端。实际上是基客户端。实际上是基于我实现的一个于我实现的一个nionio框架框架 http:/ (目目前前1.1.31.1.3是基于是基于yanf4j 0.7.0yanf4j 0.7.0,而,而1.2.0-RC11.2.0-RC1版本基于版本基于1.0-SNAPSHOT)1.0-SNAPSHOT)。另外我们也可以自己写另外我们也可以自己写soket,soket,实现实现mem

65、cachememcache客户端。客户端。 MemcachedMemcached安装和使用安装和使用: :33MemcacheMemcache在大型网站中的在大型网站中的使用使用策略策略: :Memcache在大型网站中的部署策略在大型网站中的部署策略基于基于memcachedmemcached的的slabslab和和dumpdump的内存管理方式,它产生的内存碎片比较少,不需要的内存管理方式,它产生的内存碎片比较少,不需要OSOS去做繁去做繁杂的内存回收,所以它对杂的内存回收,所以它对CPUCPU的占用率那是相的占用率那是相 当的低。所以建议将它跟占用当的低。所以建议将它跟占用CPUCPU较

66、高的较高的WEBWEB服服务器一起使用来节省成本。当然如果你有大量的廉价务器一起使用来节省成本。当然如果你有大量的廉价PCPC,那用来专门做,那用来专门做memcachedmemcached服务器也服务器也不错。由不错。由 于于3232位操作系统中,每个进程最多只能使用位操作系统中,每个进程最多只能使用2GB2GB内存,所以如果你有大内存的话,内存,所以如果你有大内存的话,可以以可以以daemondaemon的方式启动两个以上的的方式启动两个以上的memcachedmemcached服务,或者干服务,或者干 脆用脆用6464位的位的CPUCPU和和OSOS。34MemcacheMemcache

67、缓存缓存使用使用策略策略: :memcachedmemcached主要的作用是为减轻大访问量对数据库的冲击,所以一般的逻辑是首先从主要的作用是为减轻大访问量对数据库的冲击,所以一般的逻辑是首先从memcachedmemcached中读取数据,如果没有就从数据库中读取数据中读取数据,如果没有就从数据库中读取数据 写入到写入到memcachememcache中,等下一次读取中,等下一次读取的时候就可以从的时候就可以从memcachedmemcached中读取了。但在项目中的具体应用策略(也就是哪些数据应该缓中读取了。但在项目中的具体应用策略(也就是哪些数据应该缓存?怎么样缓存?过存?怎么样缓存?过

68、 期策略?)就是个问题了。它的一个总原则是将经常需要从数据库读期策略?)就是个问题了。它的一个总原则是将经常需要从数据库读取的数据缓存在取的数据缓存在memcachedmemcached中。这些数据也分为几类:中。这些数据也分为几类:一、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、一、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。这类数据就使用典型的缓存策略,设置一过合理的过期时

69、间,当数据过期以后再从数据库中这类数据就使用典型的缓存策略,设置一过合理的过期时间,当数据过期以后再从数据库中读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。二、经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读二、经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。记录等。这类数据首先被载入到这类数据首先被载入到memcachedmemcached中,当发生更改(添加、修改、删除)时就清除缓存。在中,当发生更改(添加、修改、删除)时就清除缓

70、存。在缓存的时候,我将查询的缓存的时候,我将查询的SQLSQL语句语句md5md5()得到它的()得到它的 hashhash值作为值作为key,key,结果数组作为值写入结果数组作为值写入memcachedmemcached,并且将该,并且将该SQLSQL涉及的涉及的table_nametable_name以及以及hashhash值配对存入值配对存入memcachedmemcached中。中。 当更改了这当更改了这个表时,我就将与此表相配对的个表时,我就将与此表相配对的keykey的缓存全部删除。的缓存全部删除。35MemcacheMemcache缓存缓存使用使用策略策略: :三、统计类缓存,

71、比如文章浏览数、网站三、统计类缓存,比如文章浏览数、网站PVPV等等此类缓存是将在数据库的中来累加的数据放在此类缓存是将在数据库的中来累加的数据放在memcachedmemcached来累加。获取也通过来累加。获取也通过memcachedmemcached来获来获取。但这样就产生了一个问题,如果取。但这样就产生了一个问题,如果 memcachedmemcached服务器服务器downdown掉的话这些数据就有可能丢失,掉的话这些数据就有可能丢失,所以一般使用所以一般使用memcachedmemcached的永固性存储,这方面我们新浪使用的永固性存储,这方面我们新浪使用memcachedbmem

72、cachedb。四、活跃用户的基本信息或者某篇热门文章。四、活跃用户的基本信息或者某篇热门文章。此类数据的一个特点就是数据都是一行,也就是一个一维数组,当数据被此类数据的一个特点就是数据都是一行,也就是一个一维数组,当数据被updateupdate时(比如修时(比如修改昵称、文章的评论数),在更改数据库数据的同时,使用改昵称、文章的评论数),在更改数据库数据的同时,使用Memcache:replaceMemcache:replace替换掉缓存替换掉缓存里的数据。这样就有效了避免了再次查询数据库。里的数据。这样就有效了避免了再次查询数据库。五、五、sessionsession数据数据使用使用me

73、mcachedmemcached来存储来存储sessionsession的效率是最高的。的效率是最高的。memcachedmemcached本身也是非常稳定的,不太用担本身也是非常稳定的,不太用担心它会突然心它会突然downdown掉引起掉引起sessionsession数据的丢失,即使丢失就重新登录了,也没啥。见数据的丢失,即使丢失就重新登录了,也没啥。见 多服务器多服务器sessionsession共享之共享之memcachememcache共享共享 36一些经验和技巧一些经验和技巧: :MemcachedMemcachedMemcachedMemcached一些特性和限制一些特性和限制一

74、些特性和限制一些特性和限制 在在 Memcached Memcached 中可以保存的中可以保存的itemitem数据量是没有限制的,只有内存足够数据量是没有限制的,只有内存足够 MemcachedMemcached单进程最大使用内存为单进程最大使用内存为2G2G,要使用更多内存,可以分多个端口开启多个,要使用更多内存,可以分多个端口开启多个MemcachedMemcached进程进程 最大最大3030天的数据过期时间天的数据过期时间, , 设置为永久的也会在这个时间过期,常量设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA REALTIME_MAXDELTA 60*60

75、*24*30 60*60*24*30 控制控制 最大键长为最大键长为250250字节,大于该长度无法存储,常量字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250 KEY_MAX_LENGTH 250 控制控制, ,客户端可以加上自己客户端可以加上自己 的前缀,所以最大长度是可以超过的前缀,所以最大长度是可以超过5050的。的。 单个单个itemitem最大数据是最大数据是1MB1MB,超过,超过1MB1MB数据不予存储,常量数据不予存储,常量POWER_BLOCK 1048576 POWER_BLOCK 1048576 进行控制,进行控制, 它是默认的它是默认的slabslab

76、大小大小 最大同时连接数是最大同时连接数是200200,通过,通过 conn_init()conn_init()中的中的freetotal freetotal 进行控制,最大软连接数是进行控制,最大软连接数是10241024,通过,通过 settings.maxconns=1024 settings.maxconns=1024 进行控制进行控制,这跟操作系统有关,这跟操作系统有关,linuxlinux好像最大就是好像最大就是200200。 跟空间占用相关的参数:跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, settings.f

77、actor=1.25, settings.chunk_size=48, 影响影响slabslab的数据占用和步进方式的数据占用和步进方式37一些经验和技巧一些经验和技巧: :查看查看查看查看MemcachedMemcachedMemcachedMemcached内部工作状态内部工作状态内部工作状态内部工作状态访问访问MemcachedMemcached:telnet telnet 主机名主机名 端口号端口号查看总状态:查看总状态:statsstats查看某项状态:查看某项状态:stats curr_connectionsstats curr_connections 禁止禁止禁止禁止LRULRU

78、LRULRU有些情况下有些情况下LRULRU机制反倒会造成麻烦。机制反倒会造成麻烦。memcachedmemcached启动时通过启动时通过“ “-M”-M”参数可以禁止参数可以禁止LRULRU,如下所示:,如下所示:$ memcached -M -m 1024$ memcached -M -m 1024启动时必须注意的是,小写的启动时必须注意的是,小写的“ “-m”-m”选项是用来指定最大内存大小的。不指定具体数值选项是用来指定最大内存大小的。不指定具体数值则使用默认值则使用默认值64MB64MB。指定指定“ “-M”-M”参数启动后,内存用尽时参数启动后,内存用尽时memcachedmem

79、cached会返回错误。话说回来,会返回错误。话说回来,memcachedmemcached毕竟不是存储器,而是缓存,所以推荐使用毕竟不是存储器,而是缓存,所以推荐使用LRULRU。38一些经验和技巧一些经验和技巧: :MemcachedMemcachedMemcachedMemcached使用线程模式工作使用线程模式工作使用线程模式工作使用线程模式工作在安装的时候必须打开:在安装的时候必须打开:./configure -enable-threads./configure -enable-threads安装完之后,启动的时候看看帮助信息有没有这条:安装完之后,启动的时候看看帮助信息有没有这条:

80、-t number of threads to use, default 4-t number of threads to use, default 4如果存在该选项,说明已经支持了线程,就可以在启动的时候使用如果存在该选项,说明已经支持了线程,就可以在启动的时候使用 -t -t 选项来启动多线程选项来启动多线程然后启动的时候必须加上你需要支持的线程数量:然后启动的时候必须加上你需要支持的线程数量:/usr/local/memcache/bin/memcached -t 1024/usr/local/memcache/bin/memcached -t 102439一些经验和技巧一些经验和技巧:

81、 :调优调优调优调优SlabSlabSlabSlab和内存分配和内存分配和内存分配和内存分配1 1 1 1memcachedmemcached在启动时指定在启动时指定 Growth FactorGrowth Factor因子(通过因子(通过-f -f选项),就可以在某种程度上控制选项),就可以在某种程度上控制slabslab之间的差异。之间的差异。默认值为默认值为1.251.25。但是,在该选项出现之前,这个因子曾经固定为。但是,在该选项出现之前,这个因子曾经固定为2 2,称为,称为“ “powers of 2”powers of 2”策略。策略。让我们用以前的设置,以让我们用以前的设置,以v

82、erboseverbose模式启动模式启动memcachedmemcached试试看:试试看:$ memcached -f 2 -vv$ memcached -f 2 -vvslab class 1: chunk size 128 perslab 8192slab class 1: chunk size 128 perslab 8192slab class 2: chunk size 256 perslab 4096slab class 2: chunk size 256 perslab 4096slab class 3: chunk size 512 perslab 2048slab cla

83、ss 3: chunk size 512 perslab 2048slab class 4: chunk size 1024 perslab 1024slab class 4: chunk size 1024 perslab 1024slab class 5: chunk size 2048 perslab 512slab class 5: chunk size 2048 perslab 512slab class 6: chunk size 4096 perslab 256slab class 6: chunk size 4096 perslab 256slab class 7: chunk

84、 size 8192 perslab 128slab class 7: chunk size 8192 perslab 128slab class 8: chunk size 16384 perslab 64slab class 8: chunk size 16384 perslab 64slab class 9: chunk size 32768 perslab 32slab class 9: chunk size 32768 perslab 32slab class 10: chunk size 65536 perslab 16slab class 10: chunk size 65536

85、 perslab 16slab class 11: chunk size 131072 perslab 8slab class 11: chunk size 131072 perslab 8slab class 12: chunk size 262144 perslab 4slab class 12: chunk size 262144 perslab 4slab class 13: chunk size 524288 perslab 2slab class 13: chunk size 524288 perslab 240一些经验和技巧一些经验和技巧: :调优调优调优调优SlabSlabSl

86、abSlab和内存分配和内存分配和内存分配和内存分配2 2 2 2可见,从可见,从128128字节的组开始,组的大小依次增大为原来的字节的组开始,组的大小依次增大为原来的2 2倍。这样设置的问题是,倍。这样设置的问题是,slabslab之间的差别比较大,之间的差别比较大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了growth factorgrowth factor这个选项。这个选项。来看看现在的默认设置(来看看现在的默认设置(f=1.25f=1.25)时的输出(篇幅所限,这里只写到第)时的输出(篇幅所限,这里

87、只写到第1010组):组):slab class 1: chunk size 88 perslab 11915slab class 1: chunk size 88 perslab 11915slab class 2: chunk size 112 perslab 9362slab class 2: chunk size 112 perslab 9362slab class 3: chunk size 144 perslab 7281slab class 3: chunk size 144 perslab 7281slab class 4: chunk size 184 perslab 569

88、8slab class 4: chunk size 184 perslab 5698slab class 5: chunk size 232 perslab 4519slab class 5: chunk size 232 perslab 4519slab class 6: chunk size 296 perslab 3542slab class 6: chunk size 296 perslab 3542slab class 7: chunk size 376 perslab 2788slab class 7: chunk size 376 perslab 2788slab class 8

89、: chunk size 472 perslab 2221slab class 8: chunk size 472 perslab 2221slab class 9: chunk size 592 perslab 1771slab class 9: chunk size 592 perslab 1771slab class 10: chunk size 744 perslab 1409slab class 10: chunk size 744 perslab 1409可见,组间差距比因子为可见,组间差距比因子为2 2时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得时小得多,

90、更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。将将memcachedmemcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整调整growth factorgrowth factor,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。41一些经验和技巧一些经验和技巧: :memcached得

91、得LRU不是全局的,而是针对不是全局的,而是针对slab的,可以说是区域性的。的,可以说是区域性的。要提高要提高memcached的命中率,预估我们的的命中率,预估我们的value大小并且适当的调整内存页大小和增长因子是必须的。大小并且适当的调整内存页大小和增长因子是必须的。缓存的粒度越小,命中率就越高,对象缓存是目前缓存粒度最小的,因此被命中的几率更高。缓存的粒度越小,命中率就越高,对象缓存是目前缓存粒度最小的,因此被命中的几率更高。缓存太小,造成频繁的缓存太小,造成频繁的LRU,也会降低命中率,缓存的有效期太短也会造成缓存命中率下降。,也会降低命中率,缓存的有效期太短也会造成缓存命中率下降。真正对数据库造成庞大压力的正是那些没有索引的大表查询,和造成了全表扫描的关联查询,这些一旦涉真正对数据库造成庞大压力的正是那些没有索引的大表查询,和造成了全表扫描的关联查询,这些一旦涉及到全表扫描的查询,才是性能的真正杀手。通过搜索引擎来解决,缓存解决不了。及到全表扫描的查询,才是性能的真正杀手。通过搜索引擎来解决,缓存解决不了。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号