memcached 缓存为什么会缓存丢失

Memcached 常见的问题
Memcached 常见的问题
memcached是怎么工作的?
  Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多&key,value&对的哈希表。通过key,可以存储或查询任意的数据。
  客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。
  举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C:  Client 1想把数据"barbaz"以key "foo"存储。Client 1首先参考节点列表(A, B, C),计算key "foo"的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key "foo"把数据"barbaz"存储进去。  Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。  于是,经过相同的哈希计算(阶段一),Client 2计算出key "foo"在memcached B上,然后它直接请求memcached B,得到数据"barbaz"。
  各种客户端在memcached中数据的存储形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的。
  最后,从实现的角度看,memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。
  可以参考&,这篇文章简单解释了客户端与memcached是如何交互的。
  memcached最大的优势是什么?
  请仔细阅读上面的问题(即memcached是如何工作的)。Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。
  基于memcached的基本原则,可以相当轻松地构建出不同类型的缓存架构。除了这篇FAQ,在其他地方很容易找到详细资料的。
  看看下面的几个问题吧,它们在memcached、服务器的local cache和MySQL的query cache之间做了比较。这几个问题会让您有更全面的认识。
  memcached和MySQL的query cache相比,有什么优缺点?
  把memcached引入应用中,还是需要不少工作量的。MySQL有个使用方便的query cache,可以自动地缓存SQL查询的结果,被缓存的SQL查询可以被反复地快速执行。Memcached与之相比,怎么样呢?MySQL的query cache是集中式的,连接到该query cache的MySQL服务器都会受益。
当您修改表时,MySQL的query cache会立刻被刷新(flush)。存储一个memcached item只需要很少的时间,但是当写操作很频繁时,MySQL的query cache会经常让所有缓存数据都失效。
在多核CPU上,MySQL的query cache会遇到扩展问题(scalability issues)。在多核CPU上,query cache会增加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢。
在MySQL的query cache中,我们是不能存储任意的数据的(只能是SQL查询结果)。而利用memcached,我们可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到memcached中。而query cache是SQL语句级别的,不可能做到这一点。在小的网站中,query cache会有所帮助,但随着网站规模的增加,query cache的弊将大于利。
query cache能够利用的内存容量受到MySQL服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了memcached,只要您有空闲的内存,都可以用来增加memcached集群的规模,然后您就可以缓存更多的数据。
  memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?
  首先,local cache有许多与上面(query cache)相同的问题。local cache能够利用的内存容量受到(单台)服务器空闲内存空间的限制。不过,local cache有一点比memcached和query cache都要好,那就是它不但可以存储任意的数据,而且没有网络存取的延迟。
local cache的数据查询更快。考虑把highly common的数据放在local cache中吧。如果每个页面都需要加载一些数量较少的数据,考虑把它们放在local cached吧。
local cache缺少集体失效(group invalidation)的特性。在memcached集群中,删除或更新一个key会让所有的观察者觉察到。但是在local cache中, 我们只能通知所有的服务器刷新cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。
local cache面临着严重的内存限制,这一点上面已经提到。
  memcached的cache机制是怎样的?
  Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久Which is forever, or some time in the future。如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。
  memcached如何实现冗余机制?&  不实现!我们对这个问题感到很惊讶。Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个memcached节点失去了所有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于memcached来保证一切!如果您担心节点失效会大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少丢失一个节点的影响),热备节点(在其他节点down了的时候接管IP),等等。
  memcached如何处理容错的?&  不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:
忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。
把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上。
启动热备节点,接管失效节点所占用的IP。这样可以防止哈希紊乱(hashing chaos)。
如果希望添加和移除节点,而不影响原先的哈希结果,可以使用一致性哈希算法(consistent hashing)。您可以百度一下一致性哈希算法。支持一致性哈希的客户端已经很成熟,而且被广泛使用。去尝试一下吧!
两次哈希(reshing)。当客户端存取数据时,如果发现一个节点down了,就再做一次哈希(哈希算法与前一次不同),重新选择另一个节点(需要注意的时,客户端并没有把down的节点从节点列表中移除,下次还是有可能先哈希到它)。如果某个节点时好时坏,两次哈希的方法就有风险了,好的节点和坏的节点上都可能存在脏数据(stale data)。
  如何将memcached中item批量导入导出?
  您不应该这样做!Memcached是一个非阻塞的服务器。任何可能导致memcached暂停或瞬时拒绝服务的操作都应该值得深思熟虑。向memcached中批量导入数据往往不是您真正想要的!想象看,如果缓存数据在导出导入之间发生了变化,您就需要处理脏数据了;如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?
  因此,批量导出导入数据并不像您想象中的那么有用。不过在一个场景倒是很有用。如果您有大量的从不变化的数据,并且希望缓存很快热(warm)起来,批量导入缓存数据是很有帮助的。虽然这个场景并不典型,但却经常发生,因此我们会考虑在将来实现批量导出导入的功能。
  Steven Grimm,一如既往地,,在邮件列表中给出了另一个很好的例子:&。
  但是我确实需要把memcached中的item批量导出导入,怎么办??
  好吧好吧。如果您需要批量导出导入,最可能的原因一般是重新生成缓存数据需要消耗很长的时间,或者数据库坏了让您饱受痛苦。
  如果一个memcached节点down了让您很痛苦,那么您还会陷入其他很多麻烦。您的系统太脆弱了。您需要做一些优化工作。比如处理"惊群"问题(比如 memcached节点都失效了,反复的查询让您的数据库不堪重负...这个问题在FAQ的其他提到过),或者优化不好的查询。记住,Memcached 并不是您逃避优化查询的借口。
  如果您的麻烦仅仅是重新生成缓存数据需要消耗很长时间(15秒到超过5分钟),您可以考虑重新使用数据库。这里给出一些提示:
使用MogileFS(或者CouchDB等类似的软件)在存储item。把item计算出来并dump到磁盘上。MogileFS可以很方便地覆写item,并提供快速地访问。您甚至可以把MogileFS中的item缓存在memcached中,这样可以加快读取速度。 MogileFS+Memcached的组合可以加快缓存不命中时的响应速度,提高网站的可用性。重新使用MySQL。MySQL的InnoDB主键查询的速度非常快。如果大部分缓存数据都可以放到VARCHAR字段中,那么主键查询的性能将更好。从memcached中按key查询几乎等价于MySQL的主键查询:将key 哈希到64-bit的整数,然后将数据存储到MySQL中。您可以把原始(不做哈希)的key存储都普通的字段中,然后建立二级索引来加快查询...key被动地失效,批量删除失效的key,等等。
  上面的方法都可以引入memcached,在重启memcached的时候仍然提供很好的性能。由于您不需要当心"hot"的item被memcached LRU算法突然淘汰,用户再也不用花几分钟来等待重新生成缓存数据(当缓存数据突然从内存中消失时),因此上面的方法可以全面提高性能。
  关于这些方法的细节,详见博客:&。
  memcached是如何做身份验证的?&  没有身份认证机制!memcached是运行在应用下层的软件(身份验证应该是应用上层的职责)。memcached的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,memcached可以很快地创建新连接,服务器端也无需任何配置。
  如果您希望限制访问,您可以使用防火墙,或者让memcached监听unix domain socket。
  memcached的多线程是什么?如何使用它们?&  线程就是定律(threads rule)!在Steven Grimm和Facebook的努力下,memcached 1.2及更高版本拥有了多线程模式。多线程模式允许memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据。memcached使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个memcached实例,这种方式能够更有效地处理multi gets。
  如果您的系统负载并不重,也许您不需要启用多线程工作模式。如果您在运行一个拥有大规模硬件的、庞大的网站,您将会看到多线程的好处。
  更多信息请参见:。
  简单地总结一下:命令解析(memcached在这里花了大部分时间)可以运行在多线程模式下。memcached内部对数据的操作是基于很多全局锁的(因此这部分工作不是多线程的)。未来对多线程模式的改进,将移除大量的全局锁,提高memcached在负载极高的场景下的性能。
  memcached能接受的key的最大长度是多少?&  key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持"key的前缀"或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key,因为可以节省内存和带宽。
  memcached对item的过期时间有什么限制?&  过期时间最大可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。
  memcached最大能存储多大的单个item?&  1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。
  为什么单个item的大小被限制在1M byte之内?&  啊...这是一个大家经常问的问题!
  简单的回答:因为内存分配器的算法就是这样的。
  详细的回答:Memcached的内存存储引擎(引擎将来可插拔...),使用slabs来管理内存。内存被分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。
  如果最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B ...
  slab中chunk越大,它和前面的slab之间的间隙就越大。因此,最大值越大,内存利用率越低。Memcached必须为每个slab预先分配内存,因此如果设置了较小的因子和较大的最大值,会需要更多的内存。
  还有其他原因使得您不要这样向memcached中存取很大的数据...不要尝试把巨大的网页放到mencached中。把这样大的数据结构load和unpack到内存中需要花费很长的时间,从而导致您的网站性能反而不好。
  如果您确实需要存储大于1MB的数据,你可以修改slabs.c:POWER_BLOCK的值,然后重新编译memcached;或者使用低效的malloc/free。其他的建议包括数据库、MogileFS等。
  我可以在不同的memcached节点上使用大小不等的缓存空间吗?这么做之后,memcached能够更有效地使用内存吗?&  Memcache客户端仅根据哈希算法来决定将某个key存储在哪个节点上,而不考虑节点的内存大小。因此,您可以在不同的节点上使用大小不等的缓存。但是一般都是这样做的:拥有较多内存的节点上可以运行多个memcached实例,每个实例使用的内存跟其他节点上的实例相同。
  什么是二进制协议,我该关注吗?
  关于二进制最好的信息当然是二进制协议规范:&。
  二进制协议尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的CPU时间。根据Facebook的测试,解析ASCII协议是memcached中消耗CPU时间最多的环节。所以,我们为什么不改进ASCII协议呢?
  在这个邮件列表的thread中可以找到一些旧的信息:&。
  memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs?&  实际上,这是一个编译时选项。默认会使用内部的slab分配器。您确实确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。如果您不同意,当然可以使用malloc!只是不要在邮件列表中抱怨啊:)
  slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。Steven Grimm正在这方面已经做出了有效的改进。
  邮件列表中有一些关于slab的改进(power of n 还是 power of 2)和权衡方案:&。
  如果您想使用malloc/free,看看它们工作地怎么样,您可以在构建过程中定义USE_SYSTEM_MALLOC。这个特性没有经过很好的测试,所以太不可能得到开发者的支持。
  更多信息:&。
  memcached是原子的吗?&  当然!好吧,让我们来明确一下:  所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有bug:)  命令序列不是原子的。如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他进程set的item。
  memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。
  通常,基于memcached中item的值来修改item,是一件棘手的事情。除非您很清楚自己在做什么,否则请不要做这样的事情。
发表评论:
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&你可能喜欢
12345678910
关于本站 本站以分享运维技术为主,欢迎大家参与技术分享,同时也欢迎大家吐槽,本站提供以下交流圈:QQ群①:*****(满)QQ群②:6690706 QQ群③: QQ群④:(新) 微信公众号:ttlsacom 商务合作QQ:xsl3236 的BLOG
用户名:xsl3236
文章数:119
访问量:11616
注册日期:
阅读量:5863
阅读量:12276
阅读量:315351
阅读量:1028819
51CTO推荐博文
目录一、Memcached是什么二、Memcached的特征三、Memcached的设计哲学四、Memcached的安装与配置五、安装Memcache的PHP扩展,使用php支持memcached功能六、使用libmemcached的客户端工具七、Nginx整合memcached,为nginx提供静态页面缓存功能&Memcached是什么?memcached是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。这时就该memcached大显身手了。memcached一般的使用目的是,通过缓存数据库查询的结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。&其工作流程图为:&二、memcached的特征memcached作为高速运行的分布式内存缓存服务器,具有以下的特点。协议简单基于libevent的事件处理内置内存存储方式memcached不互相通信的分布式&1、协议简单memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。&2、基于libevent的事件处理libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。注:o(1)特性使得10000个连接和1个连接的查询速度是一样的。&3、内置内存存储方式为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。 在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。Slab Allocator的基本原理是按照预先规定的大小, 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合,在图中指的是slab class)。各个尺寸的chunk大小是通过其增长因子(growth &factor)来决定的,默认增长因子为1.25。下一个尺寸的chunk大小=之前一个chunk大小*增长因子。如下图所示:&而且,slab allocator还有重复使用已分配的内存的目的。 也就是说,分配到的内存不会释放,而是重复利用。不过由于slab &Allocator分配的是特定长度的chunk,因此,当缓存的数据没有chunk长度大时,仍然会造成空间浪费。&&4、memcached不互相通信的分布式memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。memcached的分布式可以由2种算法来实现:1、余数分布式算法(或者取模分布式算法)2、Consistent Hashing算法(一致性hash算法)&余数分布式算法余数分布式算法是根据键做hash计算,将计算的结果除以服务器台数,并取最后的余数,这样余数为几,就将数据存储在哪台服务器上。如有3台服务器。需要将键"hello",'nice','hi'存储在memecache上,分别对这些键做has计算,并将计算的结果处于服务器台数(这里为3),然后取其余数,假设这里余数分别为0、1、2。那么余数为0则将会将键"hello"存储在第一台服务器上,余数为1表示将键"nice"存储在第二台服务器上,余数为2表示将键"hi"存储在第三台服务器上。这就是余数分布式算法。余数分布式算法的缺点在于,当新增或减少一台服务器上,其余数会发生改变,当程序需要获取数据时,这样会无法获取其之前相同服务器上的数据,导致缓存丢失。这种缓存丢失可能是全局的,因此,影响范围比较广,所以,此算法一般不建议采用。&&Consistent Hashing的简单说明首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)(图中白色的圆环)上。然后用同样的方法求出存储数据的键的哈希值(图中粉红色的圆就是键的hash值),并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。如下图所示:这种算法和上述算法相比,影响缓冲的命中率要小一些。不管是增加一个memcached节点,还是减少一个节点,它只会影响其该节点所在的continuum附加逆时针的少许数据。&三、Memcached的设计哲学Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;3. 各服务器间彼此无视:不在服务器间进行数据同步;4. O(1)的执行效率5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;&&四、memcached的安装与配置Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。存储类命令:set, add, replace, append, prepend获取数据类命令:get, delete, incr/decr统计类命令:stats, stats items, stats slabs, stats sizes清理命令: flush_all&1、安装libeventmemcached依赖于libevent API,因此要事先安装之,项目主页:http://libevent.org/,读者可自行选择需要的版本下载。本文采用的是目前最新版本的源码包libevent-2.0.16-stable.tar.gz。安装过程:&# tar xf libevent-2.0.22-stable.tar.gz# cd libevent-2.0.22-stable# ./configure --prefix=/usr/local/libevent# make && make install&# echo "/usr/local/libevent/lib" & /etc/ld.so.conf.d/libevent.conf# ldconfig&&2、安装配置memcached&(1)、安装memcached# tar xf memcached-1.4.22.tar.gz&# cd memcached-1.4.22# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent(libevent的安装目录)# make && make install&&(2)、memcached SysV的startup脚本代码如下所示,将其建立为/etc/init.d/memcached文件:&#!/bin/bash## Init file for memcached## chkconfig: - 86 14# description: Distributed memory caching daemon## processname: memcached# config: /etc/sysconfig/memcached&. /etc/rc.d/init.d/functions&## Default variablesPORT="11211"USER="nobody"MAXCONN="1024"CACHESIZE="64"&&RETVAL=0prog="/usr/local/memcached/bin/memcached"desc="Distributed memory caching"lockfile="/var/lock/subsys/memcached"&start() {& & & & echo -n $"Starting $desc (memcached): "& & & & daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE&& & & & RETVAL=$?& & & & echo& & & & [ $RETVAL -eq 0 ] && touch $lockfile& & & & return $RETVAL}&stop() {& & & & echo -n $"Shutting down $desc (memcached): "& & & & killproc $prog& & & & RETVAL=$?& & & & echo& & & & [ $RETVAL -eq 0 ] && rm -f $lockfile& & & & return $RETVAL}&restart() {& & & & stop& & & & start}&reload() {& & & & echo -n $"Reloading $desc ($prog): "& & & & killproc $prog -HUP& & & & RETVAL=$?& & & & echo& & & & return $RETVAL}&case "$1" in& start)& & & & start& & & & ;;& stop)& & & & stop& & & & ;;& restart)& & & & restart& & & & ;;& condrestart)& & & & [ -e $lockfile ] && restart& & & & RETVAL=$?& & & & ;; & & &&& reload)& & & & reload& & & & ;;& status)& & & & status $prog& & & & RETVAL=$?& & & & ;;& &*)& & & & echo $"Usage: $0 {start|stop|restart|condrestart|status}"& & & & RETVAL=1esac&exit $RETVAL&&使用如下命令配置memcached成为系统服务:# chmod +x /etc/init.d/memcached# chkconfig --add memcached# service memcached start&查看memcached进程是否已经启动了。如:# netstat -tnlp | grep 11211tcp & & & &0 & & &0 0.0.0.0:11211 & & & & & & & 0.0.0.0:* & & & & & & & & & LISTEN & & &3068/memcached & & &tcp & & & &0 & & &0 :::11211 & & & & & & & & & &:::* & & & & & & & & & & & &LISTEN & & &3068/memcached &&(3)、使用telnet命令测试memcached的使用&Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。查看memcached的内部状态信息首先是要telnet连接到memcached,然后再输入stats可以获取其memcached各种信息:# telnet 127.0.0.1 11211statsSTAT pid 14381STAT uptime 307STAT time STAT version 1.4.22STAT libevent 2.0.22-stableSTAT pointer_size 64STAT rusage_user 0.000000STAT rusage_system 0.002999STAT curr_connections 10STAT total_connections 11STAT connection_structures 11STAT reserved_fds 20STAT cmd_get 0STAT cmd_set 0STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 0STAT get_misses 0STAT delete_misses 0STAT delete_hits 0STAT incr_misses 0STAT incr_hits 0STAT decr_misses 0STAT decr_hits 0STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT touch_hits 0STAT touch_misses 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 7STAT bytes_written 0STAT limit_maxbytes STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT hash_power_level 16STAT hash_bytes 524288STAT hash_is_expanding 0STAT malloc_fails 0STAT bytes 0STAT curr_items 0STAT total_items 0STAT expired_unfetched 0STAT evicted_unfetched 0STAT evictions 0STAT reclaimed 0STAT crawler_reclaimed 0STAT lrutail_reflocked 0END&输入stats slabs或stats items可以获取其缓存相关信息,如:stats slabsSTAT active_slabs 0STAT total_malloced 0ENDstats itemsEND&测试,使用add命令添加数据add命令语法格式:add keyname flag &timeout &datasize如:add mykey 0 10 12Hello world!&使用get命令获取指定key所对应的数据get命令语法格式为:get keyname如:get mykeyVALUE mykey 0 12Hello world!END&(4)、memcached的常用选项说明&-l &ip_addr&:指定进程监听的地址;-d: 以守护进程方式在后台运行;-u &username&:以指定的用户身份运行memcached进程;-m &num&:用于缓存数据的最大内存空间,单位为MB,默认为64MB;-c &num&:最大支持的并发连接数,默认为1024;-p &num&: 指定监听的TCP端口,默认为11211;-U &num&:指定监听的UDP端口,默认为11211,0表示关闭UDP端口;-t &threads&:用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;-f &num&:设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;-M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;-n: 指定最小的slab chunk大小;单位是字节;-S: 启用sasl进行用户认证;-s:监听的本地套接字&&注意:配到这里,memcached服务器已经搭建好了,下面还需配置php,让其支持memcached功能。上面的部分和下面的部分不是在同一个服务器上进行的。&(在另一台服务器上的配置)五、安装Memcache的PHP扩展,使用php支持memcached功能默认情况下。php从数据库获得数据并不会自动缓存到memcache中,需要程序员在开发时,自行调用memcache api,这样才使得memcache功能生效。要想让php从数据库获取到的数据缓存到memcache中,需要安装php的memcache扩展。这样当php需要使用数据时,首先从memcache中查找,如果在memcache中找不到,然后再去数据库查询,并将查询的结果缓存在memcache中,然后在返回给应用程序。对于php的安装这里不再详述了。(我这台服务器上已经安装了lnmp)①安装PHP的memcache扩展php的memcache扩展下载地址:http://pecl.php.net/package/memcache# tar xf memcache-2.2.4.tgz# cd memcache-2.2.4# /usr/local/php/bin/phpize# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache# make && make install&上述安装完后会有类似以下的提示:Installing shared extensions: & & /usr/local/php/lib/php/extensions/no-debug-non-zts-/&②编辑vim /etc/php.d/memcache.ini,添加如下行信息:extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-/memcache.so&而后对memcached功能进行测试,在网站根目录中建立测试页面test.php,添加如下内容:# vim &/usr/html/test.php&?php$mem = new M$mem-&connect("192.168.108.199", 11211) &or die("Could not connect"); & &##这里我的memcached服务器所在地址为192.168.108.199&$version = $mem-&getVersion();echo "Server's version: ".$version."&br/&\n";&$mem-&set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");echo "Store data in the cache (data will expire in 600 seconds)&br/&\n";&$get_result = $mem-&get('testkey');echo "$get_result is from memcached server."; & & & &&?&&测试,在浏览器上面输入 &六、使用libmemcached的客户端工具访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。&1) 编译安装libmemcached&# tar xf libmemcached-1.0.2.tar.gz&# cd libmemcached-1.0.2# ./configure&# make && make install# ldconfig&2) 客户端工具# memcat --servers=127.0.0.1:11211 mykey# memping&# memslap# memstat&&七、Nginx整合memcached,为nginx提供静态页面缓存功能虽然nginx自身可以提供缓存,不过由于该数据是缓存在磁盘上的,因此,性能赶不上memcached缓存性能。因此,我们也应当为nginx支持memecached功能,使其支持缓存静态页面功能。server {& & & & listen & & & 80;& & & & server_name &;&& & & & #charset koi8-r;&& & & & #access_log &logs/host.access.log &&& & & & location / {& & & & & & & & set $memcached_key $ & & &&&&&&&&&&&&&&&&&&##$memcached_key为键名,$uri为传递给memcached服务器的键 & & & & & && & & & & & & & memcached_pass & & 192.168.108.199:11211; & memcached服务器的地址和端口& & & & & & & & default_type & & & text/只缓存html格式的数据& & & & & & & & error_page & & & & 404 @ & & & & &&&&&&&&&&&&&&&&&&##如果memcached上没有相应的数据,将会在后端应用程序服务器上寻找。& & & & }&& & & & location @fallback {& & & & & & & & proxy_pass http://127.0.0.1; &&&&&&&&&&&&&&&&&&##这里的地址指的是后端应用程序服务器的地址。& & & & }}&六、Memcached管理与监控工具MemAdminMemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积小,操作简单。&主要功能:服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控支持数据遍历,方便对存储内容进行监视支持条件查询,筛选出满足条件的KEY或VALUE数组、JSON等序列化字符反序列显示兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外)支持服务器连接池,多服务器管理切换方便简洁&安装MemAdmin# tar &xf &memadmin-1.0.12.tar.gz# mv & memadmin /usr/html/&测试访问,在浏览器上输入http://192.168.108.230/memadmin/,如果出现如下画面则表示连接正常:默认用户名和密码都为"admin",登陆进去之后,显示如下画面:&然后点击"开始管理",出现如下画面:&&最后就可以根据需求管理自己的缓存服务器了。&&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 memcached 缓存丢失 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信