Memcache介绍、安装、使用(一)

Memcache基础

Memcache是由 Danga Interactive 开发并使用 BSD 许可的一种通用的分布式内存缓存系统, 减少了网站数据库的负载, 成为如今世界上大多数高流量网站所使用的缓存解决方案。
它可以应对任意多个连接,使用非阻塞的网络IO(NIO),它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。

为什么要用Memcache ?

许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

为什么会有Memcache和memcached两种名称?

其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,一个是项目名称,一个是主程序文件名。

memcached 的客户端使用TCP链接 与 服务器通讯。(UDP接口也同样有效)一个运行中的memcached服务器监视一些(可设置)端口。客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。

Memcache使用场景

数据库层中执行几个经常性查询时,memcached 往往能发挥最大的效用。我经常会在数据库和应用服务器之间设置一系列 memcached 实例,并采用一种简单的模式来读取和写入这些服务器。

这里写图片描述

建立了一个 Web 层,其中包括一些 Apache 实例。下一层是应用程序本身。这一层通常运行于 Apache Tomcat 或其他开源应用服务器之上。再下面一层是配置 memcached 实例的地方 — 即应用服务器与数据库服务器之间。

读取数据过程

执行读取操作的顺序是从 Web 层获取请求(需要执行一次数据库查询)并检查之前在缓存中存储的查询结果。如果我找到所需的值,则返回它。如果未找到,则执行查询并将结果存储在缓存中,然后再将结果返回给 Web 层。

写入数据过程

将数据写入到数据库中时,首先需要执行数据库写入操作,然后将之前缓存的任何受此写入操作影响的结果设定为无效。此过程有助于防止缓存和数据库之间出现数据不一致性

Memcache特征

  • 协议简单
  • 基于libevent(C开发)的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

 协议简单
服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议、

 基于libevent的事件处理
它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。

 内置内存存储方式
memcached中保存的数据都存储在memcached内置的内存存储空间, 因此重启memcached、重启操作系统会导致全部数据消失。内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

 memcached不互相通信的分布式
尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息,它的分布式,取决于客户端的算法实现。
另:几种java版本Memcache客户端比较
http://jingyan.baidu.com/article/14bd256e207a12bb6d2612c5.html

这里写图片描述

Memcache内存存储机制

Slab Allocation机制:整理内存以便重复使用

基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)

这里写图片描述

Slab allocation的术语

  1. Page
    分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk
  2. Chunk
    用于缓存记录的内存空间。
  3. Slab Class
    特定大小的chunk的组。

Slab Allocation的缓存原理

memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着
slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

这里写图片描述

由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节
的数据缓存到128字节的chunk中,剩余的28字节就浪费了

这里写图片描述

memcached在启动时指定Growth Factor因子(通过f选项),就可以在某种程度上控制slab之间的差异。

将memcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章