memcached简介

1.介绍

许多web应用都将数据保存到RDBMS中,然后应用服务器从中读取数据并且在浏览器中显示,或者进一步处理。在大数据时代,或者用户量很大的情况下,比如社交游戏,访问量很大,很集中,就会使得RDBMS的负担加重,延迟增大,甚至系统崩溃。

memcached 是一种高性能的分布式内存缓存服务器。第一次访问的时候,从RDBMS中取得数据,然后保存到memcached,以后再访问的时候,就直接从memcached读取数据了(我先大胆地猜想,比如游戏加载的时候先把一些数据给读取出来到memcached中,然后之后就不用再和数据库本身进行交互了)。为了提高性能,memcached 保存的数据都存储在memcached内置的内存存储空间中。一旦重启memcached,数据就会全部消失。如果内容容量达到上限,就按照Least Recently Used机制来进行删除。

2.内存存储

它的内存整理方式是Slab Allocator机制,主要是为了解决原先的内存碎片问题,减轻操作系统内存管理器的负担。它的基本原理是按照预先规定的大小,将分配给memcached的内存分割成特定长度的块(chunk),然后把尺寸相同的块分成组(slab),以完全解决内存碎片问题。除此之外,Slab Allocator还会重复地使用已经分配的内存,分配到的内存不会释放,也就是说,数据并不会真正地从memcached中消失。

memcached根据受到的数据的大小,选择大小最合适的slab。memcached中包含着slab内空闲chunk的列表,根据该列表选择chunk,然后存数据。但是这样也带来一个缺点,那就是chunk的尺寸无法满足所有的数据,如果大于实际的数据,那么就会造成浪费。比如数据只有100字节,而chunk的尺寸为128字节,那么28字节的内存就被浪费了。

3.删除机制

一旦数据记录超时,客户端就无法再看见该记录了,其存储空间即可重复使用。memcached使用了一种叫做lazy expiration的技术,它自己并不会专门耗费cpu时间来监视数据记录是否过期,而是在get方法被调用时查看该记录的时间戳。

memcached 会优先使用已经超时的数据记录所占的空间,如果这样空间仍然不足的话,就会使用Least Recently Used机制来进行删除,也就是说最近最少使用的记录。


4.memcached的分布式算法

它自身并没有分布式功能,完全是由客户端程序库实现的。假设有很多台memcached服务器,当客户端程序想往服务器存取数据时,首先根据算法选择服务器,然后再调用set方法,将键和数据存储进去。取的时候同样先用相同的算法,看看该键在哪个服务器,然后再用get方法取出来。

5.memcached的应用和兼容程序

memcached服务器几乎不占cpu



6.具体的用法

首先,java客户端,http://code.google.com/p/memcached/wiki/Clients,最著名的是spymemcached。有详细的文档可以参考。

也就是说将spymemcached的源代码加入到工程里面去,创建一个MemcachedClient,将cache的url传递进去,然后调用该client类的各种方法就可以了。

但是需要提示一点,就是大工程的开发中,测试都是很重要的环节,往往在测试中你并不会真正地使用cache,通常是用一个HashMap来替代,数据库也是这样。所以直接使用MemcachedClient的方法还是需要在测试那一块重新写代码。更加舒服的方式是自己写一个接口,里面包含各种要用到的方法,比如add,remove什么的。然后写2个实现类,对于真正产品中要使用到的,就通过调用MemcachedClient的方法来实现接口方法,而对于测试用的,操作HashMap就行了。这样可以实现2个环境的方法的统一,而不至于自己写一个方法,然后又人为地到测试环境去写另一个名称参数一样的方法,自动实现更加方便,也不容易出错。一改都改,花一份心思就可以。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值