简介
Memcached是由高性能分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。(IO操作和网络通信都是非常慢的,将IO操作转移到内存上来可以快很多,SAP的同学说他们开发了几十个G还是几百个G内存的真正内存数据库。应该很快,但也应该很贵)
Memcached能缓存什么?
通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
Memcached快么?
非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1)。
命令简单
不多说了,非常简单,key-value方式,可以设置expire时间。set、add、append、replace、prepend、cas、get、gets、delete、incr/decr等基本操作,还有一些统计信息之类的命令,可以在官方wiki看到http://code.google.com/p/memcached/wiki/NewCommands。
Slab Allocation机制:整理内存以便重复使用
将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),可以搜索“linux slab”具体了解这一种内存分配方式。而以前的malloc、free方法会产生内存碎片.
memcached在数据删除方面有效利用资源,数据不会真正从memcached中消失
Lazy Expiration
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。 这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
LRU:从缓存中有效删除数据的原理
二进制协议
使用二进制协议的理由是它不需要文本协议的解析处理,使得原本高速的memcached的性能更上一层楼, 还能减少文本协议的漏洞。目前已大部分实现,开发用的代码库中已包含了该功能(官网上的意思是二进制协议正确实现了noreply,应该尽量用二进制协议,因为ASCII协议的noreply实现不可能根据请求给出标准实现)。
外部引擎支持
。。。。。。分布式
用hash实现(就是求余,“根据服务器台数的余数进行分散”)。 求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。 不会出现使用数据库做类似事情的时候,减少磁盘开销和阻塞的发生。
参考http://kb.cnblogs.com/page/42731/以及http://code.google.com/p/memcached/